總結(jié)高并發(fā)下Nginx性能如何優(yōu)化
我們終將在,沒有黑暗的地方相見。 ~喬治《1984》
Nginx同Apache一樣都是一種WEB服務(wù)器?;赗EST架構(gòu)風(fēng)格,以統(tǒng)一資源描述符(UniformResources ldentifier)URl或者統(tǒng)一資源定位符(Uniform Resources Locator)URL作為溝通依據(jù),通過HTTP協(xié)議提供各種網(wǎng)絡(luò)服務(wù)。
Apache的發(fā)展時期很長,而且是毫無爭議的世界第一大服務(wù)器。它有著很多優(yōu)點:穩(wěn)定、開源、跨平臺等等。它出現(xiàn)的時間太長了,它興起的年代,互聯(lián)網(wǎng)產(chǎn)業(yè)遠遠比不上現(xiàn)在。所以它被設(shè)計為一個重量級的。它不支持高并發(fā)的服務(wù)器。在Apache上運行數(shù)以萬計的并發(fā)訪問,會導(dǎo)致服務(wù)器消耗大量內(nèi)存sz操作系統(tǒng)對其進行進程或線程間的切換也消耗了大量的CPU資源,導(dǎo)致HTTP請求的平均響應(yīng)速度降低。
這些都決定了Apache不可能成為高性能WEB服務(wù)器,輕量級高并發(fā)服務(wù)器Nginx就應(yīng)運而生了。
特點
是一個高性能的HTTP和反向代理web服務(wù)器,輕量級提供了IMAP/POP3/SMTP服務(wù)發(fā)布于2004年10月4日(第一個公開版本0.1.0 )Nginx的1.4.0穩(wěn)定版已經(jīng)于2013年4月24日發(fā)布C語言編寫Nginx是一個跨平臺服務(wù)器Nginx有自己的函數(shù)庫,并且除了zlib、PCRE和OpenSSL之外,標(biāo)準(zhǔn)模塊只使用系統(tǒng)C庫函數(shù)。
優(yōu)勢
占有內(nèi)存少(在3W并發(fā)連接中,開啟的10個nginx進程消耗內(nèi)存大約150M)高并發(fā)能力強(官方測試能夠支撐5W并發(fā)連接,在實際生產(chǎn)環(huán)境中能到2-3W并發(fā)連接數(shù))簡單(配置文件通俗易懂)價格(免費、開源)支持Rewriter重寫(能夠根據(jù)域名、URL的不同,將HTTP請:求分到不同的后端服務(wù)器群組)內(nèi)置健康檢查(如果nginx后端有幾個服務(wù)宕機了,不會影響前端訪問,能自動檢測服務(wù)狀態(tài))節(jié)省帶寬(支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭)
穩(wěn)定性高,反向代理,很少宕機中國大陸使用nginx網(wǎng)站用戶有:百度、京東、新浪、網(wǎng)易、騰訊、淘寶等
功能:web服務(wù)器、輕量級;負載、均衡;緩存;高并發(fā)
應(yīng)用場景:代理服務(wù)器;IP負載、靜態(tài)負載;動靜分離;限流、健康監(jiān)控
安裝和命令
安裝:
sudo apt-get install nginx
查看版本
nginx -v nginx version: nginx/1.18.0 (Ubuntu)
基本命令
# nginx的訪問頁面(welcome to nginx)具體所在位置 vi /usr/share/nginx/html/index.html # 訪問IP curl 192.168.100.111 # 關(guān)閉nginx進程 nginx -s stop # 啟動nginx進程 /usr/sbin/nginx # yum安裝的nginx也可以使用 servic nginx start # 檢查配置文件是否有誤 nginx –t # 重新加載配置文件 nginx –s reload # 查看日志 tail -f filename #顯示文件默認10行,刷新顯示 # 例:tail -f /var/log/lvs-agent.log tail -f /etc/nginx/nginx.conf # 查看文件后幾行 tail -n 行數(shù) 文件名 例: tail -n 100 /var/log/aa.log # 刪除網(wǎng)卡ip ip addr del 192.168.11.5/32 dev lo (lo eth1 eth2) # lvs清空所有集群服務(wù) ipvsadm –C # 獲取eth0網(wǎng)卡上的所掛的ip值 ip a|grep eth0|grep inet|awk ‘{print $2}'|cut -d “/” -f1 # 驗證該ip或者網(wǎng)址是否通 可用返回200 curl -I -m 10 -o /dev/null -s -w %{http_code} 10.110.26.10:8080 # 后臺啟動jar包 nohup java -jar /usr/sbin/項目名.jar >>/var/log/項目名.log 2>&1 & # 查看上一個命令是否執(zhí)行成功 返回0執(zhí)行成功 其他不成 echo $? # 查看nginx進程是否啟動。此命令用在代碼判斷nginx進程是否啟動,如果只用ps aux | grep nginx 即使沒有啟動也會用內(nèi)容返回,影響判斷 ps aux | grep nginx | greo –v grep
配置文件
nginx.conf
# nginx.conf # 全局配置區(qū) user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; # 網(wǎng)絡(luò)事件配置區(qū) events { worker_connections 768; # multi_accept on; } # HTTP模塊 http { ## # HTTP 全局設(shè)置 ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL 設(shè)置 ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # 日志設(shè)置 ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # 資源壓縮設(shè)置 ## gzip on; # 默認開啟 # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # 虛擬主機配置 ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
/etc/nginx/sites-enabled/*
server { # 虛擬主機配置 listen 80 default_server; # 監(jiān)聽端口 listen [::]:80 default_server; # SSL 配置 # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # # Note: You should disable gzip for SSL traffic. # See: https://bugs.debian.org/773332 # # Read up on ssl_ciphers to ensure a secure configuration. # See: https://bugs.debian.org/765782 # # Self signed certs generated by the ssl-cert package # Don't use them in a production server! # # include snippets/snakeoil.conf; # 數(shù)據(jù)緩存位置 root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; # 域名,可以有多個 server_name _; # 對/進行反向代理 location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # uwsgi_pass 127.0.0.1:8000; # include /etc/nginx/uwsgi_params; try_files $uri $uri/ =404; } # pass PHP scripts to FastCGI server # #location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php-fpm (or other unix sockets): # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
代理模式和配置反向代理
正向代理(forward proxy) :
是一個位于客戶端(用戶A)和原始服務(wù)器(origin server)(目標(biāo)服務(wù)器)之間的服務(wù)器(代理服務(wù)器),為了從原始服務(wù)器取得內(nèi)容,客戶端向代理服務(wù)器發(fā)送一個請求并指定目標(biāo)(原始服務(wù)器),然后代理服務(wù)器向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端??蛻舳吮仨氁M行一些特別的配置才能使用正向代理。一般情況下,如果沒有特別說明,代理技術(shù)默認是指正向代理技術(shù)。
相當(dāng)于是一個職業(yè)中介,且客戶端和實際服務(wù)器不能溝通,客戶端知道他是中介
反向代理(reverse proxy)︰
和正向代理正好相反,對于客戶端而言它就像是原始服務(wù)器,并且客戶端不需要進行任何特別的設(shè)置??蛻舳讼蚍聪虼淼拿臻g(name-space)中的內(nèi)容發(fā)送普通請求,接著反向代理將判斷向何處(原始服務(wù)器)轉(zhuǎn)交請求,并將獲得的內(nèi)容返回給客戶端,就像這些內(nèi)容原本就是它自己的一樣。
相當(dāng)于是一個買房和賣房的人,買房的時候相對于賣房的是一個買房的,賣房的時候相對于買房的是一個賣房的。
客戶端不知道他是一個代理服務(wù)器,服務(wù)器也認為他只是客戶端而不是代理服務(wù)器
透明代理∶
透明代理的意思是客戶端根本不需要知道有代理服務(wù)器的存在,它改編你的requestfields(報文),并會傳送真實IP。注意,加密的透明代理則是屬于匿名代理,意思是不用設(shè)置使用代理了。透明代理實踐的例子就是時下很多公司使用的行為管理軟件
# 反向代理默認是關(guān)閉的 # upstream localhost是第三方模塊,均衡 upstream localhost { # 實際服務(wù)器 server 192.168.136.133:8081; server 192.168.136.133:8081; server 192.168.136.133:8081; } # 負載 server { listen 80 # 代理服務(wù)器的端口 server_name localhost; location / { proxy_pass http://localhost; # 將請求發(fā)送給其中一臺實際服務(wù)器 } }
負載均衡方法:
輪詢法(默認)
加權(quán)輪詢法(權(quán)重)
Fair
url_hash
源地址哈希法
最小連接法(least_conn)
動靜分離
Nginx動靜分離簡單來說就是把動態(tài)跟靜態(tài)請求分開,不能理解成只是單純的把動態(tài)頁面和靜態(tài)頁面物理分離
嚴格意義上說應(yīng)該是動態(tài)請求跟靜態(tài)請求分開,可以理解成使用Nginx處理靜態(tài)頁面,Tomcat處理動態(tài)頁面
動靜分離從目前實現(xiàn)角度來講大致分為兩種:
- 一種是純粹把靜態(tài)文件獨立成單獨的域名,放在獨立的服務(wù)器上,也是目前主流推崇的方案
- 一種是動態(tài)跟靜態(tài)文件混合在一起發(fā)布,通過nginx來分開
mkdir static# 存放靜態(tài)文件
server { # 虛擬主機配置 listen 80 default_server; # 監(jiān)聽端口 listen [::]:80 default_server; # 數(shù)據(jù)緩存位置 root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; # 域名,可以有多個 server_name _; # 對/進行反向代理 location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # uwsgi_pass 127.0.0.1:8000; # include /etc/nginx/uwsgi_params; try_files $uri $uri/ =404; } # 如果是這些文件后綴就去這里面找 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css) $ { root /static; expires 30d; # 緩存有效期 } }
日志管理
日志格式
日志生成的到Nginx根目錄logs/access.log文件,默認使用“main”日志格式,也可以自定義格式默認“main”日志格式
og_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_age
日志切割
nginx的日志文件沒有rotate功能
編寫每天生成一個日志,我們可以寫一個nginx日志切割腳本來自動切割日志文件
- 第一步就是重命名日志文件 (不用擔(dān)心重命名后nginx找不到日志文件而丟失日志。在你未重新打開原名字的日志文件前,nginx還是會向你重命名的文件寫日志,Linux是靠文件描述符而不是文件名定位文件 )
- 第二步向nginx主進程發(fā)送USR1信號
nginx主進程接到信號后會從配置文件中讀取日志文件名稱
重新打開日志文件 (以配置文件中的日志名稱命名) ,并以工作進程的用戶作為日志文件的所有者
重新打開日志文件后,nginx主進程會關(guān)閉重名的日志文件并通知
工作進程使用新打開的日志文件工作進程立刻打開新的日志文件并關(guān)閉重名名的日志文件,然后你就可以處理舊的日志文件了。[或者重啟nginx服務(wù)]
nginx日志按每分鐘自動切割腳本如下 :
新建shell腳本
高并發(fā)架構(gòu)分析
什么是高并發(fā)?
高并發(fā)(High Concurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計中必須考慮的因素之一,它通常是指,通過設(shè)計保證系統(tǒng)能夠同時并行處理很多請求。
高并發(fā)相關(guān)常用的一些指標(biāo)有響應(yīng)時間(Response Time),吞吐量(Throughput),每秒查詢率QPS (Query Per Second),并發(fā)用戶數(shù)等。
- 響應(yīng)時間:系統(tǒng)對請求做出響應(yīng)的時間
- 吞吐量:單位時間內(nèi)處理的請求數(shù)量。
- QPS:每秒響應(yīng)請求數(shù)
如何提升系統(tǒng)的并發(fā)能力?
互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計,提高系統(tǒng)并發(fā)能力的方式,方法論上主要有兩種:垂直擴展(ScaleUp)與水平擴展(Scale Out)。
垂直擴展:提升單機處理能力。垂直擴展的方式又有兩種。
- 增強單機硬件性能
- 提升單機架構(gòu)性能
在互聯(lián)網(wǎng)業(yè)務(wù)發(fā)展非常迅猛的早期,如果預(yù)算不是問題,強烈建議使用“增強單機硬件性能”的方式提升系統(tǒng)并發(fā)能力,因為這個階段,公司的戰(zhàn)略往往是發(fā)展業(yè)務(wù)搶時間,而“增強單機硬件性能”往往是最快的方法。
不管是提升單機硬件性能,還是提升單機架構(gòu)性能,都有一個致命的不足:單機性能總是有極限的。所以互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計高并發(fā)終極解決方案還是水平擴展。
水平擴展:只要增加服務(wù)器數(shù)量,就能線性擴充系統(tǒng)性能。
服務(wù)器都有極限
三種方式實現(xiàn)
limit_conn_zone(限制連接流)
limit_req_zone(限制請求流)
ngx_http_upstream_module(后臺服務(wù)限制)
此處插上一個小工具:限制測試工具下載
yum install http-tools -y
key | 含義 |
---|---|
Document Path | 測試的頁面 |
Document Length | 頁面的大小 |
Concurrency Level | 并發(fā)數(shù)量、并發(fā)用戶數(shù) |
Time taken for tests | 測試耗費總時間 |
Complete requests | 請求總量、并發(fā)連接數(shù) |
Failed requests | 請求失敗的數(shù)量 |
Write errors | 錯誤數(shù)量 |
Requests per second | 每秒鐘的請求量吞吐率 |
Time per request | 每次請求需要時間響應(yīng)時間 |
限制連接流
http { # binary_remote_addr:IP # zone=one:10m;申請一塊10M的空間存放連接的IP limit_conn_zone $binary_remote_addr zone=one:10m; server { # zone區(qū)域中每次放出10個連接nginx處理 limit_conn one 10; } }
限制請求流(限速)
http { # rate意思是每個連接每秒能發(fā)一個連接 limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s; server { # brust:令牌,每次新增一個,120個發(fā)完后會報錯503 limit_req zone=req_one brust=120; } }
后臺服務(wù)限制
該模塊是提供了我們需要的后端限流功能的
該模塊有一個參數(shù): max_conns可以對服務(wù)端進行限流,可惜在商業(yè)版nginx中才能使用
在nginx1.11.5版本以后,官方已經(jīng)將該參數(shù)從商業(yè)版中脫離出來了,也就是說只要我們將生產(chǎn)上廣泛使用的nginx1.9.12版本和1.10版本升級即可使用
server { # max_conns最大接收服務(wù)數(shù)量 server 127.0.0.1:8080 max_conns=100; }
安全配置
版本安全
http { server_tokens off; }
IP安全
http { location / { allow 127.0.0.1; # 白名單 deny all; # 黑名單 } }
文件安全
http { location /logs{ autoindex on; # 展示目錄 root /static; } location ^/logs~*\.(log|txt)$ { add_header Content_Type text/plain; root /static; } }
連接安全
http { # SSL settings }
Nginx優(yōu)化
調(diào)整Nginx的主配置文件,增加并發(fā)量
worker_processes 2;# 調(diào)整與CPU一致 events { # 每個worker最大并發(fā)數(shù)量 worker_connection 65535; }
Nginx長連接:HTTP1.1之后,HTTP協(xié)議支持持久連接,也就是長連接,優(yōu)點在于在一個TCP連接上可以傳送多個HTTP請求和響應(yīng),
nginx長連接短連接,可以增強服務(wù)器的容災(zāi)能力
減少了建立和關(guān)閉連接的消耗和延遲。如果我們使用了nginx去作為反向代理或者負載均衡,從客戶端過來的長連接請求就會被轉(zhuǎn)換成短連接發(fā)送給服務(wù)器端,為了支持長連接,我們需要在nginx服務(wù)器上做一些配置
使用nginx時,想要做到長連接,我們必須做到以下兩點:
- 從client到nginx是長連接(events)
- 從nginx到server是長連接(http)
對于客戶端而言,nginx其實扮演著server的角色,反之,之于server,nginx就是一個client
events { # keepalive超時時間,默認是60s,切記這個參數(shù)也不能設(shè)置過大!否則會導(dǎo)致許多無效的http連接占據(jù)著nginx的連接數(shù),終nginx崩潰! keepalive_timeout 60; } http { keepalive_timeout 60; }
Nginx壓縮
gzip壓縮作用:將響應(yīng)報文發(fā)送至客戶端之前可以啟用壓縮功能,這能夠有效地節(jié)約帶寬,并提高響應(yīng)至客戶端的速度,壓縮會消耗nginx的cpu性能。
gzip壓縮可以配置http,server和location模塊下
http { #gzip模塊設(shè)置 #開啟壓縮 gzip on; # 設(shè)置允許壓縮的頁面最小字節(jié)數(shù),頁面字節(jié)數(shù)從header頭得content-length中進行獲取。 默認值是0,不管頁面多大都壓縮。建議設(shè)置成大于2k的字節(jié)數(shù),小于2k可能會越壓越大。 gzip_min_length 2k; # 設(shè)置系統(tǒng)獲取幾個單位的緩存用于存儲gzip的壓縮結(jié)果數(shù)據(jù)流。 例如 4 4k 代表以4k為單 位,按照原始數(shù)據(jù)大小以4k為單位的4倍申請內(nèi)存。 4 8k 代表以8k為單位,按照原始數(shù)據(jù)大小以8k 為單位的4倍申請內(nèi)存。 # 如果沒有設(shè)置,默認值是申請跟原始數(shù)據(jù)相同大小的內(nèi)存空間去存儲gzip壓縮結(jié)果。 gzip_buffers 4 16k; #壓縮級別,1-10,數(shù)字越大壓縮的越好,也越占用CPU時間 gzip_comp_level 5; # 默認值: gzip_types text/html (默認不對js/css文件進行壓縮) # 壓縮類型,匹配MIME類型進行壓縮 # 不能用通配符 text/* # (無論是否指定)text/html默認已經(jīng)壓縮 # 設(shè)置哪壓縮種文本文件可參考 conf/mime.types gzip_types text/plain application/xjavascript text/css application/xml; # 值為1.0和1.1 代表是否壓縮http協(xié)議1.0,選擇1.0則1.0和1.1都可以壓縮 gzip_http_version 1.0 # IE6及以下禁止壓縮 gzip_disable "MSIE [1-6]\."; # 默認值:off # Nginx作為反向代理的時候啟用,開啟或者關(guān)閉后端服務(wù)器返回的結(jié)果,匹配的前提是后端服 務(wù)器必須要返回包含"Via"的 header頭。 # off - 關(guān)閉所有的代理結(jié)果數(shù)據(jù)的壓縮 # expired - 啟用壓縮,如果header頭中包含 "Expires" 頭信息 # no-cache - 啟用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭信息 # no-store - 啟用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭信息 # private - 啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭信息 # no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified" 頭信息 # no_etag - 啟用壓縮 ,如果header頭中不包含 "ETag" 頭信息 # auth - 啟用壓縮 , 如果header頭中包含 "Authorization" 頭信息 # any - 無條件啟用壓縮 gzip_proxied expired no-cache no-store private auth; # 給CDN和代理服務(wù)器使用,針對相同url,可以根據(jù)頭信息返回壓縮和非壓縮副本 gzip_vary on }
狀態(tài)監(jiān)控
server { location /NginxStatus { stub_status on; access_log off; } }
插件安裝
./configure --prefix=... --with-http_stub_status _module
以上就是總結(jié)高并發(fā)下Nginx性能如何優(yōu)化的詳細內(nèi)容,更多關(guān)于高并發(fā)下Nginx性能優(yōu)化的資料請關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。