Nginx花了好多篇文章介紹了,今天談?wù)勊膬?yōu)化。我們從優(yōu)化考慮的方面,壓力測試工具ab,具體的優(yōu)化點(diǎn)三個方面去介紹,話不多說,直接開始!
目錄
優(yōu)化考慮方面
壓力測試工具
性能優(yōu)化
一、影響性能的指標(biāo)
二、系統(tǒng)性能優(yōu)化
1、更改文件句柄
2、Time_wait狀態(tài)重用
三、代理服務(wù)優(yōu)化
1、長連接優(yōu)化
2、keepalive最大連接數(shù)
3、keepalive_timeout超時
四、靜態(tài)資源優(yōu)化
1、 靜態(tài)資源緩存expires
2、sendfile靜態(tài)資源高效讀取
五、靜態(tài)資源壓縮
1、gzip傳輸壓縮
六、其他
1、防止資源盜鏈
2、允許跨域訪問
3、CPU親和配置
4、通用優(yōu)化配置
Nginx性能優(yōu)化總結(jié)
優(yōu)化考慮方面
1、了解系統(tǒng)結(jié)構(gòu)、系統(tǒng)層次結(jié)構(gòu)和瓶頸,結(jié)構(gòu)方面,了解每個服務(wù)最大支持多少并發(fā),支持多少的qps(每秒查詢率);系統(tǒng)層次結(jié)構(gòu)方面,我們要考慮Nginx是做代理、動靜分離、還是直接服務(wù)用戶;瓶頸方面,可以通過top查看系統(tǒng)的CPU負(fù)載、內(nèi)存使用率、總的運(yùn)行進(jìn)程,也可以通過日志分析請求情況。也可以通過壓力測試工具,業(yè)務(wù)低谷期進(jìn)行壓力測試,了解這套系統(tǒng)能承擔(dān)多少的請求和并發(fā)。
2、了解業(yè)務(wù)模式,我們的性能優(yōu)化是為業(yè)務(wù)提供服務(wù)的,我們要了解業(yè)務(wù)類型,例如搶購類的業(yè)務(wù),平時沒什么流量,到了搶購時間流量就會激增。
3、還需要考慮性能和安全,不能只注重一點(diǎn)忽略了另一點(diǎn),例如我們在設(shè)計防火墻功能時候,如果檢測的過于嚴(yán)密,就會給性能帶來影響,如果對性能完全追求,不顧服務(wù)的安全,也容易造成安全隱患,所以我們需要權(quán)衡好對應(yīng)的點(diǎn)
我們可以從OSI模型去考慮優(yōu)化方向
硬件:代理(CPU)、靜態(tài)(磁盤IO)、動態(tài)(cpu、內(nèi)存)
網(wǎng)絡(luò):帶寬、丟包、延遲
系統(tǒng):文件描述符(文件句柄數(shù))
應(yīng)用:服務(wù)與服務(wù)保持長連接http1.1
服務(wù):靜態(tài)資源服務(wù)優(yōu)化
壓力測試工具
在業(yè)務(wù)量沒有增長之前,我們要做好響應(yīng)準(zhǔn)備,以防患業(yè)務(wù)量突增帶來的接口壓力,所以對于接口壓力測試就顯得非常重要,我們可以用測試工具,檢測當(dāng)前系統(tǒng)情況,看是否能滿足對應(yīng)壓力的需求。
1、安裝ab壓力測試工具
[root@Web01 ~]# yum install -y httpd-tools
2、壓力工具使用方式
-n? ? ? ? 要執(zhí)行的請求數(shù)
-c? ? ? ? 請求的并發(fā)數(shù)
-k? ? ? ? 是否開啟長連接
[root@Web01 ~]# ab -n 200 -c 2 http://blog.koten.com/
3、配置Nginx靜態(tài)網(wǎng)站與tomcat動態(tài)網(wǎng)站環(huán)境
#靜態(tài)網(wǎng)站配置
[root@Web02 ~]# cat /etc/nginx/conf.d/test.conf
server {
listen 80;
server_name test.koten.com;
location / {
root /code;
try_files $uri $uri/ @java;
index index.jsp index.html;
}
location @java {
proxy_pass http://172.16.1.8:8080;
}
}
[root@Web02 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@Web02 ~]# systemctl restart nginx
[root@Web02 ~]# echo 'nginx ab' > /code/ab.html
#動態(tài)網(wǎng)站配置
[root@Web02 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.73/bin/apache-tomcat-9.0.73.tar.gz --no-check-certificate
[root@Web02 ~]# tar xf apache-tomcat-9.0.73.tar.gz
[root@Web02 ~]# cd /usr/share/tomcat/webapps/ROOT
[root@Web02 ROOT]# echo "test_tomcat" > tomcat.html
#靜態(tài)資源壓力測試
[root@Web01 ~]# ab -n 10000 -c 200 http://test.koten.com/ab.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking test.koten.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.22.1
Server Hostname: test.koten.com
Server Port: 80
Document Path: /ab.html
Document Length: 9 bytes
Concurrency Level: 200
Time taken for tests: 3.536 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 2380000 bytes
HTML transferred: 90000 bytes
Requests per second: 2827.96 [#/sec] (mean)
Time per request: 70.722 [ms] (mean)
Time per request: 0.354 [ms] (mean, across all concurrent requests)
Transfer rate: 657.28 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 18 130.3 0 3009
Processing: 12 48 41.2 45 1648
Waiting: 1 48 41.2 45 1648
Total: 31 66 148.7 45 3052
Percentage of the requests served within a certain time (ms)
50% 45
66% 46
75% 46
80% 47
90% 50
95% 56
98% 245
99% 1051
100% 3052 (longest request)
#動態(tài)資源壓力測試
[root@Web01 ~]# ab -n 10000 -c 200 http://test.koten.com/tomcat.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking test.koten.com (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.22.1 #版本號
Server Hostname: test.koten.com #URL主機(jī)名
Server Port: 80 #請求端口
Document Path: /tomcat.html #請求路徑
Document Length: 12 bytes #HTTP相應(yīng)數(shù)據(jù)的正文長度
Concurrency Level: 200 #并發(fā)用戶數(shù),是我們設(shè)置的參數(shù)
Time taken for tests: 12.337 seconds #所有請求被處理完成所花費(fèi)的時間
Complete requests: 10000 #總請求數(shù)量,我們設(shè)置的參數(shù)
Failed requests: 0 #失敗的請求數(shù)量
Write errors: 0
Total transferred: 2500000 bytes #所有請求的相應(yīng)數(shù)據(jù)長度總和,包括每個HTTP響應(yīng)數(shù)據(jù)的頭部信息和正文數(shù)據(jù)的長度
HTML transferred: 120000 bytes #所有請求的響應(yīng)數(shù)據(jù)中正文數(shù)據(jù)的總和
Requests per second: 810.59 [#/sec] (mean) #吞吐量,計算公式是總請求數(shù)除以處理完成這些請求數(shù)所花費(fèi)的時間
Time per request: 246.733 [ms] (mean) #用戶平均請求等待時間,計算公式是處理完成所有請求數(shù)所花費(fèi)的時間除以(總請求數(shù)除以并發(fā)用戶數(shù))
Time per request: 1.234 [ms] (mean, across all concurrent requests) #服務(wù)器平均請求等待時間,計算公式是吞吐率的倒數(shù),也可以通過用戶平均請求等待時間除以并發(fā)用戶數(shù)
Transfer rate: 197.90 [Kbytes/sec] received #表示這些請求在單位時間內(nèi)從服務(wù)器獲取的數(shù)據(jù)長度,計算公式是所有請求的相應(yīng)數(shù)據(jù)長度總和除以所有請求被處理完成所花費(fèi)的時間,這個統(tǒng)計可以很好說明服務(wù)器的處理能力達(dá)到極限時,其出口寬帶的需求量
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 9 86.5 1 1007
Processing: 32 225 400.9 103 3555
Waiting: 32 225 400.8 103 3555
Total: 33 234 413.7 104 3567
Percentage of the requests served within a certain time (ms)
50% 104
66% 132
75% 161
80% 191
90% 317
95% 1100
98% 1317
99% 2083
100% 3567 (longest request)
性能優(yōu)化
一、影響性能的指標(biāo)
1、網(wǎng)絡(luò)
1)網(wǎng)絡(luò)的流量;2)網(wǎng)絡(luò)是否丟包;3)這些會影響http的請求與調(diào)用
2、系統(tǒng)
1)硬件有沒有磁盤損壞,磁盤速率是否穩(wěn)定;2)系統(tǒng)的負(fù)載、內(nèi)存、系統(tǒng)穩(wěn)定性
3、服務(wù)
1)連接優(yōu)化,請求優(yōu)化;2)根據(jù)業(yè)務(wù)形態(tài)做對應(yīng)的服務(wù)設(shè)置
4、程序
1)接口性能;2)處理速度;3)程序執(zhí)行效率
5、數(shù)據(jù)庫
每個服務(wù)之間都或多或少有一些關(guān)聯(lián),我們需要將整個架構(gòu)分層去看,找到對應(yīng)系統(tǒng)或服務(wù)的短板,然后進(jìn)行優(yōu)化
二、系統(tǒng)性能優(yōu)化
1、更改文件句柄
Linux一切皆文件,而文件句柄是文件的索引,文件句柄隨著我們的進(jìn)程調(diào)用頻繁增加,系統(tǒng)默認(rèn)的文件句柄有限制,不能讓一個進(jìn)程無限調(diào)用
[root@Web01 ~]# vim /etc/security/limits.conf #文件句柄限制配置文件
1、系統(tǒng)全局性修改。
# * 代表所有用戶
* soft nofile 25535
* hard nofile 25535
2.用戶局部性修改
#針對root用戶,soft僅提醒,hard限制,nofile打開最大文件數(shù)
root soft nofile 65535
root hard nofile 65535
3.進(jìn)程局部性修改
#針對nginx進(jìn)程,nginx自帶配置
worker_rlimit_nofile 30000
2、Time_wait狀態(tài)重用
通過調(diào)整內(nèi)核參數(shù),讓time_wait狀態(tài)重用(端口重用)
[root@web01 ROOT]# vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1 # 開啟端口復(fù)用
net.ipv4.tcp_timestamps = 0 # 禁用時間戳
[root@web01 ROOT]# sysctl -p #可以查看我們添加的內(nèi)核參數(shù)
[root@web01 ROOT]# sysctl -a #可以查看所有內(nèi)核參數(shù)
在高并發(fā)短連接的TCP服務(wù)器上,當(dāng)服務(wù)器處理完請求后立刻主動正常關(guān)閉連接。這個場景下會出現(xiàn)大量socket處于TIME_WAIT狀態(tài)。如果客戶端的并發(fā)量持續(xù)很高,此時部分客戶端就會顯示連接不上。 我來解釋下這個場景。主動正常關(guān)閉TCP連接,都會出現(xiàn)TIMEWAIT。
高并發(fā)短連接有兩方面需要注意:
1、高并發(fā)可以讓服務(wù)器短時間內(nèi)占用大量端口,端口范圍0-65535除去系統(tǒng)和其他服務(wù)并不多
2、在這個場景中,短連接表示業(yè)務(wù)處理+傳輸數(shù)據(jù)的時間 遠(yuǎn)遠(yuǎn)小于TIMEWAIT超時的時間的連接
這個情況下,有可能http短連接話一秒處理數(shù)據(jù),卻要花幾分鐘停留在TIMEWAIT狀態(tài),而這幾分鐘一直占用著端口不工作,所以導(dǎo)致了資源浪費(fèi),在實際業(yè)務(wù)中,一般長連接對應(yīng)的業(yè)務(wù)的并發(fā)量不會很高。
三、代理服務(wù)優(yōu)化
1、長連接優(yōu)化
Nginx作為代理服務(wù),負(fù)責(zé)轉(zhuǎn)發(fā)用戶請求,在轉(zhuǎn)發(fā)過程中建議開啟HTTP長連接,用于減少握手次數(shù),降低服務(wù)器損耗。
upstream http_backend {
server 127.0.0.1:8080;
keepalive 16; #長連接
}
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1; #對于http協(xié)議應(yīng)該指定為1.1
proxy_set_header Connection ""; #清除“connection”頭字段
proxy_next_upstream error timeout http_500 http_502 http_503 http_504; #平滑過渡
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30s; # 代理連接web超時時間
proxy_read_timeout 60s; # 代理等待web響應(yīng)超時時間
proxy_send_timeout 60s; # web回傳數(shù)據(jù)至代理超時時間
proxy_buffering on; # 開啟代理緩沖區(qū),web回傳數(shù)據(jù)至緩沖區(qū),代理邊收邊傳返回給客戶端
proxy_buffer_size 32k; # 代理接收web響應(yīng)的頭信息的緩沖區(qū)大小
proxy_buffers 4 128k; # 緩沖代理接收單個長連接內(nèi)包含的web響應(yīng)的數(shù)量和大小
...
}
}
?fastcgi服務(wù)器需要設(shè)置fastcgi_keep_conn以便保持長連接
upstream fastcgi_backend {
server 127.0.0.1:9000;
keepalive 8;
}
server {
...
location /fastcgi/ {
fastcgi_pass fastcgi_backend;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_keep_conn on;
fastcgi_connect_timeout 60s;
include fastcgi_params;
...
}
}
注意:scgi和uwsgi協(xié)議沒有保持連接的概念,但proxy、fastcgi、uwsgi協(xié)議都有cache緩存的功能,開啟后可加速網(wǎng)站訪問的效率。
2、keepalive最大連接數(shù)
設(shè)置通過keepalive連接提供的最大請求數(shù),在發(fā)出最大請求數(shù)后,將關(guān)閉連接
Syntax: keepalive_requests number;
Default: keepalive_requests 100;
Context: upstream
#該指令出現(xiàn)在1.15.3版中
3、keepalive_timeout超時
保持的連接被自動關(guān)閉之前的時間限制(以秒為單位)
Syntax: keepalive_timeout timeout;
Default: keepalive_timeout 60s;
Context: upstream
#該指令出現(xiàn)在1.15.3版中
四、靜態(tài)資源優(yōu)化
Nginx作為靜態(tài)資源Web服務(wù)器,用于靜態(tài)資源處理,傳輸非常的高效
靜態(tài)資源指的是非Web服務(wù)器端運(yùn)行處理而生成的文件
靜態(tài)資源類型 | 種類 |
瀏覽器渲染 | HTML、CSS、JS |
圖片文件 | JPEG、GIF、PNG |
視頻文件 | FLV、MP4、AVI |
其他文件 | TXT、DOC、PDF |
1、 靜態(tài)資源緩存expires
瀏覽器緩存設(shè)置用于提高網(wǎng)站性能,像新聞網(wǎng)站,圖片一旦發(fā)布,改動的可能是非常小的,所以我們希望用戶訪問一次后,圖片緩存在用戶的瀏覽器上。 瀏覽器是有自己的緩存機(jī)制,他是基于HTTP協(xié)議緩存機(jī)制來實現(xiàn)的,在HTTP協(xié)議中有很多頭信息,那么實現(xiàn)瀏覽器的緩存就需要依賴特殊的頭信息來與服務(wù)器進(jìn)行特殊的驗證,如Expires(http/1.0);Cache-control(http/1.1)。
瀏覽器緩存過期校驗機(jī)制
瀏覽器發(fā)送請求,檢測瀏覽器中有緩存,檢測是否過期,沒有過期就從緩存中直接讀取,返回給瀏覽器;
過期了檢查有無Etag,沒有的話檢查有無last-Modified,沒有的話向web服務(wù)器發(fā)送請求,Web服務(wù)器請求后端,緩存協(xié)商再返回給瀏覽器,有l(wèi)ast-Modified則向Web服務(wù)器請求if-Modified-Since,由服務(wù)器決策,返回200或304,200則請求后端,進(jìn)行緩存協(xié)商,304則直接返回給瀏覽器;
如果有Etag,則向Web服務(wù)器請求If-None-Match,由服務(wù)器決策,返回200或304,200則請求后端,進(jìn)行緩存協(xié)商,304則直接返回給瀏覽器。
名詞解釋:
Last-Modified:服務(wù)器上文件的最后修改時間
Etag:文件標(biāo)識
Expires:本地緩存目錄中,文件過期的時間(由服務(wù)器指定具體的時間)
Cache-control:本地緩存目錄中,文件過期的時間(由服務(wù)器指定過期的間隔時間,由于瀏覽器根據(jù)間隔生成具體的時間)
?配置靜態(tài)資源緩存expires
#作用:添加Cache-Control Expires頭
Syntax: expires [modified] time;
epoch | max | off;
Default: expires off;
Context: http, server, location, if in location
server {
listen 80;
server_name tets.koten.com;
location ~ .*\.(jpg|gif|png)$ {
expires 7d;
}
location ~ .*\.(js|css)$ {
expires 30d;
}
}
#取消js、css、html等靜態(tài)文件緩存(如果代碼沒有上線,希望靜態(tài)文件不被緩存)
location ~ .*\.(js|css|html)$ {
add_header Cache-Control no-store;
add_header Pragma no-cache;
}
2、sendfile靜態(tài)資源高效讀取
Syntax: sendfile on | off;
Default: sendfile off;
Context: http, server, location, if in location
#將多個包一次發(fā)送,大文件推薦打開,需要開啟sendfile
Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location
#來個包發(fā)個包不等待,適合小文件,需要開啟keepalive
Syntax: tcp_nodelay on | off;
Default: tcpnodelay off;
Context: http, server, location
五、靜態(tài)資源壓縮
Nginx將響應(yīng)報文發(fā)送至客戶端之前啟用壓縮功能,然后進(jìn)行傳輸,這能夠有效地節(jié)約帶寬,并提高響應(yīng)至客戶端的速度。
1、gzip傳輸壓縮
#開啟gzip傳輸壓縮,傳輸前壓縮,傳輸后解壓
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
#gzip指定壓縮文件
Syntax: gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location
#gzip壓縮比率,加快傳輸,但壓縮本身比較耗費(fèi)服務(wù)器性能
Syntax: gzip_comp_level level;
Default:gzip_comp_level level 1;
Context: http, server, location
#gzip壓縮協(xié)議版本,壓縮使用在http哪個協(xié)議,主流選擇1.1版本
Syntax: gzip_http_version 1.0 | 1.1;
Default:gzip_http_version 1.1;
Context: http, server, location
#靜態(tài)文件壓縮案例
[root@LB01 conf.d]# cat try.conf
server {
listen 80;
server_name test.koten.com;
location ~ .*\.(jpg|png|gif) {
root /code/images;
#gzip on;
#gzip_types image/jpeg image/gif image/png;
#gzip_comp_level 2;
#gzip_http_version 1.1;
}
location ~ .*\.(txt|xml|html|json|js|css)$ {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 1;
gzip_types text/plain application/json application/x-javascript application/css application/xml text/javascript;
}
}
#壓縮前后觀察對比,可以明顯看到傳輸?shù)腟ize大小變化
六、其他
1、防止資源盜鏈
防盜鏈,指的是防止資源被其他網(wǎng)站惡意盜用。
基礎(chǔ)防盜鏈思路:主要是針對客戶端請求過程中所攜帶的一些Header信息來驗證請求的合法性,比如客戶端在請求的過程中都會攜帶referer信息。優(yōu)點(diǎn)是規(guī)則簡單,配置和使用都很方便,缺點(diǎn)是防盜鏈所依賴的Referer驗證信息是可以偽造的,所以通過referer信息防盜鏈并非100%可靠。
Syntax: valid_referers none | blocked | server_name | string ...;
Default: -;
Context: server, location
#none: referer來源頭部為空的情況
#blocked: referer來源頭部不為空,這些都不以http://或者h(yuǎn)ttps://開頭
#server_name: 來源頭部信息包含當(dāng)前域名,可以正則匹配
1、在Web1上準(zhǔn)備html文件,準(zhǔn)備偷取Web02的圖片
<html>
<head>
<meta charset="utf-8">
<title>fangdao_test</title>
</head>
<body style="background-color:pink;">
<center><img src="https://web.koten.com/daolian.jpg"/></center>
</body>
</html>
2、訪問頁面可以看到
3、在服務(wù)器上配置允許盜的站點(diǎn)
location ~ .*\.(jpg|png|gif) {
root /var/www/wordpress/wp-content/extra/;
valid_referers none blocked *.koten.com server_name ~\.google\. ~\.baidu\.;
if ( $invalid_referer ) {
return 403;
}
}
#所有來自*.koten.com都可以訪問到當(dāng)前站點(diǎn)的圖片,如果來源域名不在這個列表中,那么$invalid_referer等于1,在if語句中返回一個403個客戶,這樣用戶便會看到一個403的頁面
4、配置返回圖片
location ~ .*\.(jpg|png|gif) {
root /var/www/wordpress/wp-content/extra/;
valid_referers none blocked *.koten.com;
if ( $invalid_referer ) {
rewrite ^(.*)$ /Picture/daolian1.gif break;
}
}
5、這種防護(hù)并不能百分百保證資源不被盜,因為我們可以通過命令來修改來源的refer信息
#偽造協(xié)議頭訪問
[root@web01 code]# curl -e "https://www.baidu.com" -I http://test.koten.com/Picture/daolian.jpg
HTTP/1.1 403 Forbidden
Server: nginx
Date: Thu, 10 Oct 2019 09:01:05 GMT
Content-Type: text/html; charset=utf-8,gbk
Content-Length: 162
Connection: keep-alive
#偽造協(xié)議頭訪問
[root@web01 code]# curl -e "https://www.koten.com" -I http://test.koten.com/Picture/daolian.jpg
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 10 Oct 2019 09:01:35 GMT
Content-Type: image/jpeg
Content-Length: 556417
Last-Modified: Thu, 10 Oct 2019 07:14:19 GMT
Connection: keep-alive
ETag: "5d9eda4b-87d81"
Accept-Ranges: bytes
2、允許跨域訪問
跨域訪問是當(dāng)我們通過瀏覽器訪問a網(wǎng)站時,同時會利用到ajax或其他方式,同時也請求b網(wǎng)站,這樣的話就出現(xiàn)了請求一個頁面,使用了兩個域名,這種方式對瀏覽器來說默認(rèn)是禁止的。因為瀏覽器會讀取Access-Control-Allow-Origin的頭信息,如果服務(wù)端允許,則瀏覽器不會進(jìn)行攔截。
#編輯Nginx配置文件
[root@web02 code]# vim /etc/nginx/conf.d/s.conf
server {
listen 80;
server_name test.koten.com;
location / {
root /code;
index index.html;
}
}
#編輯html文件
[root@Nginx ~]# cat /code/test.html
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>測試ajax和跨域訪問</title>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
</head>
<script type="text/javascript">
$(document).ready(function(){
$.ajax({
type: "GET",
url: "http://web.koten.com",
success: function(data) {
alert("成功跨域!");
},
error: function() {
alert("跨域失敗!");
}
});
});
</script>
<body>
<h1>跨域訪問測試</h1>
</body>
</html>
#被關(guān)聯(lián)網(wǎng)站配置
server {
listen 80;
server_name web.koten.com;
root /code;
index index.html;
charset utf-8;
location ~ .*\.(html|htm)$ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
}
}
3、CPU親和配置
CPU親和(affinity)減少進(jìn)程之間不斷頻繁切換,減少性能損耗,其實現(xiàn)原理是建CPU核心和Nginx工作進(jìn)程綁定方式,把每個worker進(jìn)程固定到對應(yīng)的cpu上執(zhí)行,減少切換CPU的cache miss,獲得更好的性能。
#查看當(dāng)前CPU物理狀態(tài)
[root@Web01 ~]$ lscpu | grep "CPU(s)"
CPU(s): 8
On-line CPU(s) list: 0-7
NUMA node0 CPU(s): 0-7
#以上服務(wù)器有一顆物理CPU,上面有8個核心
#將Nginx worker進(jìn)程綁定至不同的核心上,建議與CPU核心保持一致
# 第一種綁定組合方式(不推薦)
worker_processes 12;
worker_cpu_affinity 000000000001 000000000010 000000000100 000000001000 000000010000 000000100000 000001000000 000010000000 000100000000 001000000000 010000000000 10000000000;
# 第二種方式(使用較少)
worker_processes 2;
worker_cpu_affinity 101010101010 010101010101;
# 第三種最佳綁定方式,修改nginx啟動的work進(jìn)程為自動。
worker_processes auto;
worker_cpu_affinity auto;
#查看Nginx worker進(jìn)程綁定至對應(yīng)CPU
[root@web01 ~]# ps -eo pid,args,psr|grep [n]ginx
1242 nginx: master process /usr/ 2
1243 nginx: worker process 0
1244 nginx: worker process 1
1245 nginx: worker process 2
1246 nginx: worker process 3
4、通用優(yōu)化配置
[root@nginx ~]# cat nginx.conf
user www; # nginx進(jìn)程啟動用戶
worker_processes auto; #與cpu核心一致即可
worker_cpu_affinity auto; # cpu親和
error_log /var/log/nginx/error.log warn; # 錯誤日志
pid /run/nginx.pid;
worker_rlimit_nofile 35535; #每個work能打開的文件描述符,調(diào)整至1w以上,負(fù)荷較高建議2-3w
events {
use epoll; # 使用epoll高效網(wǎng)絡(luò)模型
worker_connections 10240; # 限制每個進(jìn)程能處理多少個連接,10240x[cpu核心]
}
http {
include mime.types;
default_type application/octet-stream;
charset utf-8; # 統(tǒng)一使用utf-8字符集
# 定義日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#定義json日志格式
log_format json_access '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"status":"$status"}';
access_log /var/log/nginx/access.log main; # 訪問日志
server_tokens off; # 禁止瀏覽器顯示nginx版本號
client_max_body_size 200m; # 文件上傳大小限制調(diào)整
# 文件高效傳輸,靜態(tài)資源服務(wù)器建議打開
sendfile on;
tcp_nopush on;
# 文件實時傳輸,動態(tài)資源服務(wù)建議打開,需要打開keepalive
tcp_nodelay on;
keepalive_timeout 65;
# Gzip 壓縮
gzip on;
gzip_disable "MSIE [1-6]\."; #針對IE瀏覽器不進(jìn)行壓縮
gzip_http_version 1.1;
gzip_comp_level 2; #壓縮級別
gzip_buffers 16 8k; #壓縮的緩沖區(qū)
gzip_min_length 1024; #文件大于1024字節(jié)才進(jìn)行壓縮,默認(rèn)值20
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg;
# 虛擬主機(jī)
include /etc/nginx/conf.d/*.conf;
}
Nginx性能優(yōu)化總結(jié)
1、CPU親和、worker進(jìn)程數(shù)、調(diào)整每個worker進(jìn)程打開的文件數(shù)
2、使用EPOOL網(wǎng)絡(luò)模型、調(diào)整每個worker進(jìn)程的最大連接數(shù)
3、文件的高效讀取sendfile、no鋪設(shè)
4、文件傳輸實時性、nodealy
5、開啟tcp長連接,以及長連接超時時間keepalived
6、開啟文件傳輸壓縮gzip
7、開啟靜態(tài)文件expires緩存
8、隱藏Nginx版本號
9、禁止通過ip地址訪問,禁止惡意域名解析,只允許域名訪問
10、配置防盜鏈、以及跨域訪問
11、防DDOS、CC攻擊,限制單IP并發(fā)連接,以及http請求
12、建立Nginx錯誤頁面
13、Nginx加密傳輸https優(yōu)化
14、Nginx proxy_cache、fastcgi_cache、uwsgi_cache緩存,第三方工具(squid、varnish)文章來源:http://www.zghlxwxcb.cn/news/detail-464242.html
我是koten,10年運(yùn)維經(jīng)驗,持續(xù)分享運(yùn)維干貨,感謝大家的閱讀和關(guān)注!文章來源地址http://www.zghlxwxcb.cn/news/detail-464242.html
到了這里,關(guān)于【運(yùn)維知識進(jìn)階篇】集群架構(gòu)-Nginx性能優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!