Nginx優(yōu)化設(shè)計(jì)方案小結(jié)
摘要
本博文介紹Nginx的優(yōu)化設(shè)計(jì)方向和原理,幫助大家在nginx的使用和優(yōu)化中提供一個(gè)參考的方向,讓你的nginx發(fā)揮最大性能,節(jié)約系統(tǒng)資源。
一、Nginx開(kāi)啟Http2.0的優(yōu)化
HTTP/2是HTTP協(xié)議的最新標(biāo)準(zhǔn),它是HTTP/1.1的繼承者。由于它給Web開(kāi)發(fā)人員和用戶(hù)帶來(lái)的好處,它變得越來(lái)越受歡迎。通過(guò)支持HTTP/1.1的所有核心功能,它為HTTP語(yǔ)義提供了優(yōu)化的傳輸,但是旨在以多種方式提高效率。HTTP/2之上有許多功能,這些功能使您有更多的可能性來(lái)優(yōu)化網(wǎng)站/應(yīng)用程序。它提供了真正的多路復(fù)用和并發(fā),更好的報(bào)頭壓縮(二進(jìn)制編碼),更好的優(yōu)先級(jí),更好的流控制機(jī)制以及稱(chēng)為服務(wù)器推送的新交互模式,該模式使服務(wù)器能夠?qū)㈨憫?yīng)推送到客戶(hù)端。更不用說(shuō),HTTP/2基于Google的實(shí)驗(yàn)性SPDY協(xié)議。因此,HTTP/2的主要重點(diǎn)是減少整個(gè)網(wǎng)頁(yè)的加載時(shí)間,從而提高性能。它還關(guān)注網(wǎng)絡(luò)和服務(wù)器資源的使用以及安全性,因?yàn)閷?duì)于HTTP/2,必須進(jìn)行SSL/TLS加密。
1.1 Http2.0的優(yōu)點(diǎn)
HTTP2.0大幅度的提高了web性能,在HTTP1.1完全語(yǔ)意兼容的基礎(chǔ)上,進(jìn)一步減少了網(wǎng)絡(luò)的延遲。實(shí)現(xiàn)低延遲高吞吐量。對(duì)于前端開(kāi)發(fā)者而言,減少了優(yōu)化工作。有以下優(yōu)點(diǎn)
- 二進(jìn)制分幀
- 首部壓縮
- 流量控制
- 多路復(fù)用
- 請(qǐng)求優(yōu)先級(jí)
- 服務(wù)器推送
1.2 Nginx開(kāi)啟的前提
- 使用ngx_http_v2_module模塊構(gòu)建的NGINX 1.9.5或更高版本的正常安裝。
- 確保您的網(wǎng)站使用SSL/TLS證書(shū),如果您沒(méi)有SSL/TLS證書(shū),則可以從Let's Encrypt獲取或使用自簽名證書(shū)。
1.3 nginx配置Http2.0
如果已安裝NGINX,請(qǐng)ngx_http_v2_module通過(guò)運(yùn)行以下命令來(lái)驗(yàn)證它是由模塊構(gòu)建的。
# strings /usr/sbin/nginx | grep _module | grep -v configure| sort | grep ngx_http_v2_module
只需將http2參數(shù)添加到所有LISTEN指令,即可啟用HTTP/2支持
listen 443 ssl http2;
示例服務(wù)器塊配置如下所示。
server { server_name example.com www.example.com; access_log /var/log/nginx/example.com_access.log; error_log /var/log/nginx/example.com_error.log; listen [::]:443 ssl ipv6only=on http2; # managed by Certbot listen 443 ssl http2; # managed by Certbot ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }
二、Nginx配置Https功能
通過(guò)Nginx啟用SSL, 代理HTTPS, 并實(shí)現(xiàn)HTTP強(qiáng)制轉(zhuǎn)HTTPS。在配置ssl證書(shū)之前,要確保你的nginx已經(jīng)安裝了ssl模塊,一般情況下自己安裝的nginx都是不存在ssl模塊的。這里先檢查下自己是否存在ssl模塊:進(jìn)入到你的nginx安裝目錄下面,我的目錄是在(/usr/local/nginx),如果你的nginx安裝步驟和上面的文章一致的話,那你的目錄和我應(yīng)該是一致的進(jìn)入到目錄的sbin目錄下,輸入
#注意這里是大寫(xiě)的V,小寫(xiě)的只顯示版本號(hào) ./nginx -V
如果出現(xiàn) (configure arguments: --with-http_ssl_module), 則已安裝。一般情況下都是不存在ssl模塊的,接下來(lái)進(jìn)入到你的解壓縮后的nginx目錄,注意這里不是nginx安裝目錄,是解壓縮后的目錄,我的是在(/root/nginx),進(jìn)入目錄后,輸入
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make #切記不要執(zhí)行make install,否則會(huì)重新安裝nginx
上述操作執(zhí)行完成以后,你的目錄下會(huì)出現(xiàn)objs文件夾,文件夾內(nèi)存在nginx文件,如圖:
接下來(lái)使用新的nginx文件替換掉之前安裝目錄sbin下的nginx,注意這里的替換的時(shí)候可以先將之前的文件備份下,停掉nginx服務(wù)。
./nginx -s stop #停止nginx服務(wù) #替換之前的nginx cp /root/nginx/objs/nginx /usr/local/nginx/sbin
Nginx代理HTTPS,修改配置: 添加443端口監(jiān)聽(tīng), 開(kāi)啟SSL, 配置證書(shū)地址,反向代理HTTPS。
server { listen 443 ssl; server_name www.abc.com; ssl on; ssl_certificate /usr/cert/yourperm.pem; ssl_certificate_key /usr/cert/yourkey.key; location / { proxy_pass https://127.0.0.1:9443; proxy_set_header Host $host; } }
HTTP強(qiáng)制轉(zhuǎn) HTTPS,修改配置: 在80端口監(jiān)聽(tīng)HTTP請(qǐng)求, 并重寫(xiě)請(qǐng)求, 以實(shí)現(xiàn)跳轉(zhuǎn)。
rewrite ^(.*) https://$server_name$1 permanent; server { listen 80; server_name www.abc.com; rewrite ^(.*) https://$server_name$1 permanent; } server { listen 443 ssl; server_name www.abc.com; ssl on; ssl_certificate /usr/cert/yourperm.pem; ssl_certificate_key /usr/cert/yourkey.key; location / { proxy_pass https://127.0.0.1:9443; proxy_set_header Host $host; } }
三、Nginx開(kāi)啟數(shù)據(jù)壓縮
為提高用戶(hù)獲取響應(yīng)數(shù)據(jù)的速度,Nginx 服務(wù)器可以將響應(yīng)數(shù)據(jù)進(jìn)行 gzip 壓縮,在減小響應(yīng)數(shù)據(jù)的大小后再發(fā)送給用戶(hù)端瀏覽器,相對(duì)于使用戶(hù)瀏覽 Web 頁(yè)面,上述方式顯示速度更快。
要想啟用響應(yīng)數(shù)據(jù) gzip 壓縮(ngx_http_gzip_module 模塊)功能,需要用戶(hù)瀏覽器也支持 gzip 解壓功能,目前大多數(shù)瀏覽器都支持 gzip 壓縮數(shù)據(jù)的顯示。Nginx 服務(wù)器接收客戶(hù)端瀏覽器發(fā)送的請(qǐng)求后,通過(guò)請(qǐng)求頭中的屬性字段 Accept-Encoding 判斷瀏覽器是否支持 gzip 壓縮,對(duì)支持 gzip 壓縮的瀏覽器將發(fā)送 gzip 壓縮的響應(yīng)數(shù)據(jù)。
Nginx開(kāi)啟Gzip的配置如下:
# $gzip_ratio計(jì)算請(qǐng)求的壓縮率,$body_bytes_sent請(qǐng)求體大小 log_format main '$remote_addr - $remote_user [$time_local] "$host" - "$request" ' '$gzip_ratio - $body_bytes_sent - $request_time'; access_log logs/access.log main; # 開(kāi)啟gzip gzip on; # 啟用gzip壓縮的最小文件,小于設(shè)置值的文件將不會(huì)壓縮 gzip_min_length 1k; # gzip 壓縮級(jí)別,1-9,數(shù)字越大壓縮的越好,也越占用CPU時(shí)間,后面會(huì)有詳細(xì)說(shuō)明 gzip_comp_level 1; # 進(jìn)行壓縮的文件類(lèi)型。javascript有多種形式。其中的值可以在 mime.types 文件中找到。 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml; # 是否在http header中添加Vary: Accept-Encoding,建議開(kāi)啟 gzip_vary on; # 禁用IE 6 gzip gzip_disable "MSIE [1-6]\."; # 設(shè)置壓縮所需要的緩沖區(qū)大小 gzip_buffers 32 4k; # 設(shè)置gzip壓縮針對(duì)的HTTP協(xié)議版本 gzip_http_version 1.0;
我們以一個(gè)大小為92.6K的腳本文件為例,如下所示。其中最后三個(gè)數(shù)值分別表示壓縮比、包大小、平均處理時(shí)間(使用ab壓測(cè),100用戶(hù)并發(fā)下, ./ab -n 10000 -c 100 -H 'Accept-Encoding: gzip' http://10.27.180.75/jquery.js)以及CPU消耗。
從這我們可以得出結(jié)論:
- 隨著壓縮級(jí)別的升高,壓縮比有所提高,但到了級(jí)別6后,很難再提高;
- 隨著壓縮級(jí)別的升高,處理時(shí)間明顯變慢;
- gzip很消耗cpu的性能,高并發(fā)情況下cpu達(dá)到100%
因此,建議:一方面,不是壓縮級(jí)別越高越好,其實(shí)gzip_comp_level 1的壓縮能力已經(jīng)夠用了,后面級(jí)別越高,壓縮的比例其實(shí)增長(zhǎng)不大,反而很吃處理性能。另一方面,壓縮一定要和靜態(tài)資源緩存相結(jié)合,緩存壓縮后的版本,否則每次都?jí)嚎s高負(fù)載下服務(wù)器肯定吃不住。
四、Nginx開(kāi)啟合并請(qǐng)求
使用nginx-http-concat添加nginx資源請(qǐng)求合并功能
1.下載 這是https://github.com/alibaba/nginx-http-concat網(wǎng)址
cd /usr/local/src wget https://github.com/alibaba/nginx-http-concat/archive/master.zip -O nginx-http-concat-master.zip
再配置下nginx編譯參數(shù),查看版本號(hào)以及配置信息(目錄/模塊) 這很重要,因?yàn)槲覀冃枰惭b同一個(gè)版本來(lái)升級(jí)數(shù)據(jù)
/usr/local/nginx/sbin/nginx -V
也就是在原來(lái)的配置上添加 --add-module=--add-module=/usr/local/src/nginx-http-concat-master (解壓目錄)
編譯安裝: make && make install
server { listen 80; server_name localhost; index index.html index.htm; root /html; location /static/css/ { concat on; //開(kāi)啟 concat_max_files 20; //最大合并文件數(shù)量是20個(gè) concat_delimiter /* my file */; // concat_unique off; concat_types text/css application/javascript; } location /status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js)$ { expires off; } }
- concat ,是否打開(kāi)資源合并開(kāi)關(guān),選項(xiàng):on | off,默認(rèn):off
- concat_types ,模塊處理的資源類(lèi)型,默認(rèn):text/css application/x-javascript
- concat_unique ,是否允許合并不同類(lèi)型的資源,選項(xiàng):on | off,默認(rèn):on
- concat_max_files ,允許合并的最大資源數(shù)目,默認(rèn):10
- concat_delimiter ,合并后的文件內(nèi)容分隔符,用于區(qū)分不同文件的內(nèi)容
- concat_ignore_file_error ,是否忽略404或403錯(cuò)誤,選項(xiàng):on | off,默認(rèn):off
重啟nginx,命令:/usr/local/nginx/sbin/nginx -s reload
五、Nginx配置參數(shù)調(diào)優(yōu)
worker_processes 4; worker_cpu_affinity = 0001 0010 0100 1000; worker_rlimit_nofile 65538; events { use epoll; worker_connections 65538; accept_mutex off; multi_accept off; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; client_header_buffer_size 4k; client_max_body_size 2048m; gzip on; gzip_disable "msie6"; gzip_min_length 1024; gzip_vary on; gzip_comp_level 2; gunzip_static on; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; fastcgi_connect_timeout 600; fastcgi_read_timeout 600; fastcgi_send_timeout 600; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; # 靜態(tài)文件緩存 在各個(gè)server中按需單獨(dú)配置 server { location ~* .(jpg|jpeg|png|gif|ico)$ { expires 365d; } error_log /xxx/error.log; access_log off; } }
參數(shù)說(shuō)明:
- worker_processes 4; nginx進(jìn)程數(shù),一般設(shè)置為CPU核數(shù)量, grep processor /proc/cpuinfo | wc -l 命令可獲得CPU核數(shù)。
- worker_cpu_affinity = 0001 0010 0100 1000;將worker process與指定cpu核綁定,降低由于多CPU核切換造成的寄存器等現(xiàn)場(chǎng)重建帶來(lái)的性能損耗,如果為2核,則配置為:worker_cpu_affinity = 01 10;如果是8核,則配置為:worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;如果超過(guò)8核,(最多開(kāi)啟8個(gè),8個(gè)以上會(huì)不穩(wěn)定)則worker_processes auto;且不配置worker_cpu_affinity參數(shù)。
- worker_connections 65538; 每個(gè)進(jìn)程允許的最多連接數(shù),與ulimit -n值保持一致。
- worker_rlimit_nofile 65538; 一個(gè)nginx 進(jìn)程打開(kāi)的最多文件描述符數(shù)目,與worker_connections值保持一致
- sendfile on; 提高文件傳輸性能
- tcp_nopush on; sendfile為on時(shí)這里也應(yīng)該設(shè)為on,數(shù)據(jù)包會(huì)累積一下再一起傳輸,可以提高一些傳輸效率。
- tcp_nodelay on; 小的數(shù)據(jù)包不等待直接傳輸
- keepalive_timeout 65; keepalive_timeout 指定了與客戶(hù)端的 keep-alive 鏈接的超時(shí)時(shí)間。服務(wù)器會(huì)在這個(gè)時(shí)間后關(guān)閉鏈接。降低這個(gè)值,以避免讓 worker 過(guò)長(zhǎng)時(shí)間的忙碌。注:后臺(tái)有導(dǎo)出的話,其中參數(shù)keepalive_timeout可設(shè)置大些,為 1065
- client_header_buffer_size 4k; 客戶(hù)端請(qǐng)求的Header頭緩沖區(qū)大小
- client_max_body_size 2048m; 客戶(hù)端上傳的body的最大值(由于會(huì)診之類(lèi)的功能有大文件上傳,所以這里的值需要設(shè)置為可上傳最大文件上限)
- gzip on; 開(kāi)啟Gzip,gzip可以幫助Nginx減少大量的網(wǎng)絡(luò)傳輸工作
- gzip_disable “msie6”; 對(duì)IE6瀏覽器的數(shù)據(jù)不進(jìn)行GZIP壓縮。
- gzip_min_length 1024; Gzip壓縮功能對(duì)大數(shù)據(jù)的壓縮效果明顯,但是如果壓縮很小的數(shù)據(jù),可能出現(xiàn)越壓縮數(shù)據(jù)量越大的情況,因此應(yīng)該根據(jù)相應(yīng)頁(yè)面的大小,選擇性開(kāi)啟或者關(guān)閉Gzip功能。建議將值設(shè)置為1KB。
- gzip_vary on; 用于設(shè)置在使用Gzip功能時(shí)是否發(fā)送帶有“Vary:Accept-Encoding”頭域的響應(yīng)頭部,該頭域的主要功能是告訴接收方發(fā)送的數(shù)據(jù)經(jīng)過(guò)了壓縮處理,開(kāi)啟后端效果是在響應(yīng)頭部Accept-Encoding: gzip,對(duì)于本身不支持Gzip的壓縮的客戶(hù)端瀏覽器是有用的。
- gzip_comp_level 2; 壓縮級(jí)別
- gunzip_static on; 如果客戶(hù)端瀏覽器不支持Gzip處理,Nginx服務(wù)器將返回解壓后的數(shù)據(jù),如果客戶(hù)端瀏覽器支持Gzip處理。Nginx服務(wù)器忽略該指令設(shè)置,仍然返回壓縮數(shù)據(jù)。
- gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
- 啟用gzip壓縮的文件類(lèi)型
- access_log off; 日志,關(guān)閉訪問(wèn)日志,減少磁盤(pán)IO
- fastcgi_connect_timeout 600; Nginx服務(wù)器和后端FastCGI服務(wù)器連接的超時(shí)時(shí)間
- fastcgi_read_timeout 600; Nginx允許FastCGI服務(wù)器返回?cái)?shù)據(jù)的超時(shí)時(shí)間,即在規(guī)定時(shí)間內(nèi)后端服務(wù)器必須傳完所有的數(shù)據(jù),否則Nginx將斷開(kāi)這個(gè)連接
- fastcgi_read_timeout 600; Nginx從FastCGI服務(wù)器讀取響應(yīng)信息的超時(shí)時(shí)間,表示連接建立成功后,Nginx等待后端服務(wù)器的響應(yīng)時(shí)間
- fastcgi_buffer_size 64k; Nginx FastCGI 的緩沖區(qū)大小,用來(lái)讀取從FastCGI服務(wù)器端收到的第一部分響應(yīng)信息的緩沖區(qū)大小
- fastcgi_buffers 4 64k; 設(shè)定用來(lái)讀取從FastCGI服務(wù)器端收到的響應(yīng)信息的緩沖區(qū)大小和緩沖區(qū)數(shù)量
location ~* .(jpg|jpeg|png|gif|ico)$ { expires 365d; } 靜態(tài)文件緩存
配置完成后,執(zhí)行nginx -s reload命令重新加載配置文件
六、Ningx的擴(kuò)容方式
擴(kuò)容方式
- 單機(jī)垂直擴(kuò)容:硬件資源增加
- 水平擴(kuò)展:集群化
- 細(xì)粒度拆分:分布式
- 數(shù)據(jù)分區(qū)
- 上游服務(wù)SOA化(原生支持水平/垂直擴(kuò)容)
- 入口細(xì)分:瀏覽器、移動(dòng)端原生App(物聯(lián)網(wǎng))、H5內(nèi)嵌式應(yīng)用
- 數(shù)據(jù)異構(gòu)化
- 多級(jí)緩存
- 客戶(hù)端緩存
- CDN緩存
- 異地多活
- Nginx緩存
- 多級(jí)緩存
- 服務(wù)異步化
- 拆分請(qǐng)求
- 消息中間件
博文參考
《Nginx的優(yōu)化設(shè)計(jì)》
到此這篇關(guān)于Nginx優(yōu)化設(shè)計(jì)方案小結(jié)的文章就介紹到這了,更多相關(guān)Nginx優(yōu)化設(shè)計(jì)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx動(dòng)靜分離實(shí)現(xiàn)案例代碼解析
這篇文章主要介紹了Nginx動(dòng)靜分離實(shí)現(xiàn)案例代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08nginx做代理轉(zhuǎn)發(fā)前端請(qǐng)求到后端的代碼示例
Nginx作為反向代理服務(wù)器,可以有效處理請(qǐng)求并轉(zhuǎn)發(fā)到后端服務(wù)器,這篇文章主要介紹了nginx做代理轉(zhuǎn)發(fā)前端請(qǐng)求到后端的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01詳解nginx過(guò)濾url實(shí)現(xiàn)前臺(tái)js的配置問(wèn)題
本篇文章主要介紹了nginx過(guò)濾url實(shí)現(xiàn)前臺(tái)js的配置問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01nginx location中uri的截取的實(shí)現(xiàn)方法
這篇文章主要介紹了nginx location中uri的截取的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04nginx代理部署Vue刷新頁(yè)面404的問(wèn)題解決
在上線vue開(kāi)發(fā)的前端網(wǎng)頁(yè)部署在服務(wù)器上后,刷新頁(yè)面顯示404,本文就來(lái)介紹一下nginx代理部署Vue刷新頁(yè)面404的問(wèn)題解決,感興趣的可以了解一下2023-12-12Nginx、Apache、Lighttpd禁止目錄執(zhí)行php配置示例
這篇文章主要介紹了Nginx、Apache、Lighttpd禁止目錄執(zhí)行php配置示例,本文給出了單個(gè)目錄、多個(gè)目錄的禁止執(zhí)行PHP的方法,需要的朋友可以參考下2014-09-09通過(guò)Nginx解決網(wǎng)絡(luò)隔離實(shí)踐記錄詳解
這篇文章主要介紹了通過(guò)Nginx解決網(wǎng)絡(luò)隔離實(shí)踐記錄詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05nginx實(shí)現(xiàn)TCP反向代理的示例代碼
本文主要介紹了nginx實(shí)現(xiàn)TCP反向代理的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01nginx如何設(shè)置服務(wù)器響應(yīng)時(shí)間長(zhǎng)短
本文主要介紹了nginx如何設(shè)置服務(wù)器響應(yīng)時(shí)間長(zhǎng)短,主要介紹了兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09