Nginx正向代理、反向代理、負(fù)載均衡及性能優(yōu)化
時(shí)間:2023-07-14 06:18:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-07-14 06:18:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
Nginx正向代理、反向代理、負(fù)載均衡及性能優(yōu)化:
一、Nginx是什么Nginx是一款高性能的 HTTP 和反向代理服務(wù)器,由俄羅斯人Igor Sysoev(伊戈?duì)枴べ愃饕颍槎砹_斯網(wǎng)站
http://Rambler.ru開(kāi)發(fā)的,在
http://Rambler.ru網(wǎng)站平穩(wěn)的運(yùn)行了四年,而且俄羅斯超過(guò)20%的虛擬主機(jī)平臺(tái)采用Nginx作為反向代理服務(wù)器。
在國(guó)內(nèi),使用nginx網(wǎng)站有:百度、京東、金山愛(ài)詞霸、新浪、校內(nèi)網(wǎng)、淘寶、YUPOO相冊(cè)、豆瓣、迅雷看看、網(wǎng)易、騰訊等。
文章視頻講解:Nginx應(yīng)用場(chǎng)景分析:靜態(tài)web服務(wù)、反向代理、正向代理、負(fù)載均衡
C/C++Linux服務(wù)器開(kāi)發(fā)高級(jí)架構(gòu)師,免費(fèi)學(xué)習(xí)資料點(diǎn)擊:二、Nginx的優(yōu)點(diǎn)- 高并發(fā)量:根據(jù)官方給出的數(shù)據(jù),能夠支持高達(dá) 50,000 個(gè)并發(fā)連接數(shù)的響應(yīng);
- 內(nèi)存消耗少:處理靜態(tài)文件,同樣起 web 服務(wù),比 apache 占用更少的內(nèi)存及資源,所有它是輕量級(jí)的;
- 簡(jiǎn)單穩(wěn)定:配置簡(jiǎn)單,基本在一個(gè)conf文件中配置,性能比較穩(wěn)定,可以7*24小時(shí)長(zhǎng)時(shí)間不間斷運(yùn)行;
- 模塊化程度高:Nginx是高度模塊化的設(shè)計(jì),編寫(xiě)模塊相對(duì)簡(jiǎn)單,包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter,支持 SSL 和 TLSSNI;
- 支持Rwrite重寫(xiě)規(guī)則:能夠根據(jù)域名、URL的不同, 將HTTP請(qǐng)求分發(fā)到不同的后端服務(wù)器群組;
- 支持多系統(tǒng):Nginx代碼完全用C語(yǔ)言從頭寫(xiě)成,已經(jīng)移植到許多體系結(jié)構(gòu)和操作系統(tǒng),包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows,由于Nginx是免費(fèi)開(kāi)源的,可以在各系統(tǒng)上編譯并使用;
三、Nginx的缺點(diǎn)- 動(dòng)態(tài)處理差:nginx處理靜態(tài)文件好,耗費(fèi)內(nèi)存少,但是處理動(dòng)態(tài)頁(yè)面則很雞肋,現(xiàn)在一般前端用nginx作為反向代理抗住壓力,Tomcat作為后端處理動(dòng)態(tài)請(qǐng)求。
- rewrite弱:雖然nginx支持rewrite功能,但是相比于Apache來(lái)說(shuō),Apache比nginx 的rewrite 強(qiáng)大;
四、正向代理正向代理類(lèi)似一個(gè)跳板機(jī),代理訪問(wèn)外部資源。
舉個(gè)例子: 我是一個(gè)用戶,我訪問(wèn)不了某網(wǎng)站,但是我能訪問(wèn)一個(gè)代理服務(wù)器,這個(gè)代理服務(wù)器呢,他能訪問(wèn)那個(gè)我不能訪問(wèn)的網(wǎng)站,于是我先連上代理服務(wù)器,告訴他我需要那個(gè)無(wú)法訪問(wèn)網(wǎng)站的內(nèi)容,代理服務(wù)器去取回來(lái),然后返回給我。從網(wǎng)站的角度,只在代理服務(wù)器來(lái)取內(nèi)容的時(shí)候有一次記錄,有時(shí)候并不知道是用戶的請(qǐng)求,也隱藏了用戶的資料,這取決于代理告不告訴網(wǎng)站。
客戶端必須設(shè)置正向代理服務(wù)器,當(dāng)然前提是要知道正向代理服務(wù)器的IP地址,還有代理程序的端口。
總結(jié)來(lái)說(shuō): 正向代理是一個(gè)位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個(gè)請(qǐng)求并指定目標(biāo)(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端??蛻舳吮仨氁M(jìn)行一些特別的設(shè)置才能使用正向代理。
正向代理的用途:- 訪問(wèn)原來(lái)無(wú)法訪問(wèn)的資源,如google;
- 可以做緩存,加速訪問(wèn)資源;
- 對(duì)客戶端訪問(wèn)授權(quán),上網(wǎng)進(jìn)行認(rèn)證;
- 代理可以記錄用戶訪問(wèn)記錄(上網(wǎng)行為管理),對(duì)外隱藏用戶信息;
五、反向代理 對(duì)于反向代理來(lái)說(shuō),客戶端是無(wú)感知代理的存在的,反向代理對(duì)外都是透明的,訪問(wèn)者者并不知道自己訪問(wèn)的是一個(gè)代理。因?yàn)榭蛻舳瞬恍枰魏闻渲镁涂梢栽L問(wèn)。
反向代理(Reverse Proxy)實(shí)際運(yùn)行方式是指以代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)服務(wù)器。
反向代理的作用:- 保證內(nèi)網(wǎng)的安全,可以使用反向代理提供WAF功能,阻止web攻擊。大型網(wǎng)站,通常將反向代理作為公網(wǎng)訪問(wèn)地址,Web服務(wù)器是內(nèi)網(wǎng)。
- 負(fù)載均衡,通過(guò)反向代理服務(wù)器來(lái)優(yōu)化網(wǎng)站的負(fù)載
二者的區(qū)別:- 正向代理中,代理服務(wù)器和客戶端處于同一網(wǎng)絡(luò)環(huán)境下,對(duì)server透明;
- 反向代理中,代理服務(wù)器和服務(wù)端處于同一網(wǎng)絡(luò)環(huán)境下,對(duì)client透明;
- 實(shí)際上,代理服務(wù)器在兩種代理中做的事都是收發(fā)請(qǐng)求和響應(yīng)。正向代理代理客戶端發(fā)送請(qǐng)求給服務(wù)端,反向代理代理服務(wù)端響應(yīng)數(shù)據(jù)給客戶端;
C/C++Linux服務(wù)器開(kāi)發(fā)高級(jí)架構(gòu)師學(xué)習(xí)文檔電子書(shū)籍 點(diǎn)擊 linux服務(wù)器學(xué)習(xí)資料
獲取,內(nèi)容知識(shí)點(diǎn)包括Linux,Nginx,ZeroMQ,MySQL,Redis,線程池,MongoDB,ZK,Linux內(nèi)核,CDN,P2P,epoll,Docker,TCP/IP,協(xié)程,DPDK等等。學(xué)習(xí)視頻點(diǎn)擊:六、負(fù)載均衡及反向代理配置負(fù)載均衡反向代理七、性能優(yōu)化一般來(lái)說(shuō)nginx配置文件中對(duì)優(yōu)化比較有作用的為以下幾項(xiàng):
1、worker_processes 8nginx進(jìn)程數(shù),建議按照cpu數(shù)目來(lái)指定,一般為它的倍數(shù)
2、worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
為每個(gè)進(jìn)程分配cpu,上例中將8個(gè)進(jìn)程分配到8個(gè)cpu,當(dāng)然可以寫(xiě)多個(gè),或者將一個(gè)進(jìn)程分配到多個(gè)cpu
3、worker_rlimit_nofile 102400這個(gè)指令是指當(dāng)一個(gè)nginx進(jìn)程打開(kāi)的最多文件描述符數(shù)目,理論值應(yīng)該是最多打開(kāi)文件數(shù)(ulimit -n)與nginx進(jìn)程數(shù)相除,但是nginx分配請(qǐng)求并不是那么均勻,所以最好與ulimit -n的值保持一致
4、use epoll使用epoll的I/O模型,用這個(gè)模型來(lái)高效處理異步事件
5、worker_connections 102400每個(gè)進(jìn)程允許的最多連接數(shù),理論上每臺(tái)nginx服務(wù)器的最杭州接數(shù)為:worker_processes*worker_connections
6、keepalive_timeout 60http連接超時(shí)時(shí)間,默認(rèn)是60s,功能是使客戶端到服務(wù)器端的連接在設(shè)定的時(shí)間內(nèi)持續(xù)有效,當(dāng)出現(xiàn)對(duì)服務(wù)器的后繼請(qǐng)求時(shí),該功能避免了建立或者重新建立連接。切記這個(gè)參數(shù)也不能設(shè)置過(guò)大!否則會(huì)導(dǎo)致許多無(wú)效的http連接占據(jù)著nginx的連接數(shù),終nginx崩潰!
7、client_header_buffer_size 4k客戶端請(qǐng)求頭部的緩沖區(qū)大小,這個(gè)可以根據(jù)你的系統(tǒng)分頁(yè)大小來(lái)設(shè)置,一般一個(gè)請(qǐng)求的頭部大小不會(huì)超過(guò)1k,不過(guò)由于一般系統(tǒng)分頁(yè)都要大于1k,所以這里設(shè)置為分頁(yè)大小。分頁(yè)大小可以用命令getconf PAGESIZE取得
8、open_file_cache max=102400 inactive=20s這個(gè)將為打開(kāi)文件指定緩存,默認(rèn)是沒(méi)有啟用的,max指定緩存數(shù)量,建議和打開(kāi)文件數(shù)一致,inactive是指經(jīng)過(guò)多長(zhǎng)時(shí)間文件沒(méi)被請(qǐng)求后刪除緩存
9、open_file_cache_valid 30s這個(gè)是指多長(zhǎng)時(shí)間檢查一次緩存的有效信息
10、open_file_cache_min_uses 1open_file_cache指令中的inactive參數(shù)時(shí)間內(nèi)文件的最少使用次數(shù),如果超過(guò)這個(gè)數(shù)字,文件描述符一直是在緩存中打開(kāi)的,如上例,如果有一個(gè)文件在inactive時(shí)間內(nèi)一次沒(méi)被使用,它將被移除
11、server_tokens off隱藏響應(yīng)頭中的有關(guān)操作系統(tǒng)和web server(Nginx)版本號(hào)的信息,這樣對(duì)于安全性是有好處的
下面是一個(gè)簡(jiǎn)單的nginx配置文件:user www www;worker_processes 8;worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;error_log /www/log/nginx_error.log crit;pid /usr/local/nginx/nginx.pid;worker_rlimit_nofile 204800;events{ use epoll; worker_connections 204800;}http{ include mime.types; default_type application/octet-stream; charset utf-8; server_names_hash_bucket_size 128; client_header_buffer_size 2k; large_client_header_buffers 4 4k; client_max_body_size 8m; sendfile on; tcp_nopush on; keepalive_timeout 60; fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 16k; fastcgi_buffers 16 16k; fastcgi_busy_buffers_size 16k; fastcgi_temp_file_write_size 16k; fastcgi_cache TEST; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; fastcgi_cache_min_uses 1; fastcgi_cache_use_stale error timeout invalid_header http_500; open_file_cache max=204800 inactive=20s; open_file_cache_min_uses 1; open_file_cache_valid 30s; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; server { listen 8080; server_name backup.aiju.com; index index.php index.htm; root /www/html/; location /status { stub_status on; } location ~ .*/.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } location ~ .*/.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 30d; } log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /www/log/access.log access; }}
關(guān)于內(nèi)核參數(shù)的優(yōu)化(在/etc/sysctl.conf文件內(nèi)):1、net.ipv4.tcp_max_tw_buckets = 6000timewait的數(shù)量,默認(rèn)是180000。(Deven:因此如果想把timewait降下了就要把tcp_max_tw_buckets值減小)
2、net.ipv4.ip_local_port_range = 1024 65000允許系統(tǒng)打開(kāi)的端口范圍
3、net.ipv4.tcp_tw_recycle = 0啟用TIME-WAIT狀態(tài)sockets快速回收功能;用于快速減少在TIME-WAIT狀態(tài)TCP連接數(shù)。1表示啟用;0表示關(guān)閉。但是要特別留意的是:這個(gè)選項(xiàng)一般不推薦啟用,因?yàn)樵贜AT(Network Address Translation)網(wǎng)絡(luò)下,會(huì)導(dǎo)致大量的TCP連接建立錯(cuò)誤,從而引起網(wǎng)站訪問(wèn)故障
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
實(shí)際上,net.ipv4.tcp_tw_recycle功能的開(kāi)啟,要需要net.ipv4.tcp_timestamps(一般系統(tǒng)默認(rèn)是開(kāi)啟這個(gè)功能的)這個(gè)開(kāi)關(guān)開(kāi)啟后才有效果;
當(dāng)tcp_tw_recycle 開(kāi)啟時(shí)(tcp_timestamps 同時(shí)開(kāi)啟,快速回收 socket 的效果達(dá)到),對(duì)于位于NAT設(shè)備后面的 Client來(lái)說(shuō),是一場(chǎng)災(zāi)難!
會(huì)導(dǎo)致到NAT設(shè)備后面的Client連接Server不穩(wěn)定(有的 Client 能連接 server,有的 Client 不能連接 server)。
也就是說(shuō),tcp_tw_recycle這個(gè)功能,是為內(nèi)部網(wǎng)絡(luò)(網(wǎng)絡(luò)環(huán)境自己可控 ” ——不存在NAT 的情況)設(shè)計(jì)的,對(duì)于公網(wǎng)環(huán)境下,不宜使用。
通常來(lái)說(shuō),回收TIME_WAIT狀態(tài)的socket是因?yàn)椤盁o(wú)法主動(dòng)連接遠(yuǎn)端”,因?yàn)闊o(wú)可用的端口,而不應(yīng)該是要回收內(nèi)存(沒(méi)有必要)。
即:需求是Client的需求,Server會(huì)有“端口不夠用”的問(wèn)題嗎?
除非是前端機(jī),需要大量的連接后端服務(wù),也就是充當(dāng)著Client的角色。
正確的解決這個(gè)總是辦法應(yīng)該是:
net.ipv4.ip_local_port_range = 9000 6553 #默認(rèn)值范圍較小
net.ipv4.tcp_max_tw_buckets = 10000 #默認(rèn)值較小,還可適當(dāng)調(diào)小
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4、net.ipv4.tcp_tw_reuse = 1開(kāi)啟重用功能,允許將TIME-WAIT狀態(tài)的sockets重新用于新的TCP連接。
這個(gè)功能啟用是安全的,一般不要去改動(dòng)!5、net.ipv4.tcp_syncookies = 1開(kāi)啟SYN Cookies,當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理
6、net.core.somaxconn = 262144Web應(yīng)用中l(wèi)isten函數(shù)的backlog默認(rèn)會(huì)給我們內(nèi)核參數(shù)的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認(rèn)為511,所以有必要調(diào)整這個(gè)值
7、net.core.netdev_max_backlog = 262144每個(gè)網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時(shí),允許送到隊(duì)列的數(shù)據(jù)包的最大數(shù)目
8、net.ipv4.tcp_max_orphans = 262144系統(tǒng)中最多有多少個(gè)TCP套接字不被關(guān)聯(lián)到任何一個(gè)用戶文件句柄上。如果超過(guò)這個(gè)數(shù)字,孤兒連接將即刻被復(fù)位并打印出警告信息。這個(gè)限制僅僅是為了防止簡(jiǎn)單的DoS攻擊,不能過(guò)分依靠它或者人為地減小這個(gè)值,更應(yīng)該增加這個(gè)值(如果增加了內(nèi)存之后)
9、net.ipv4.tcp_max_syn_backlog = 262144錄的那些尚未收到客戶端確認(rèn)信息的連接請(qǐng)求的最大值。對(duì)于有128M內(nèi)存的系統(tǒng)而言,缺省值是1024,小內(nèi)存的系統(tǒng)則是128
10、net.ipv4.tcp_timestamps = 1時(shí)間戳可以避免序列號(hào)的卷繞。一個(gè)1Gbps的鏈路肯定會(huì)遇到以前用過(guò)的序列號(hào)。時(shí)間戳能夠讓內(nèi)核接受這種“異常”的數(shù)據(jù)包。這里需要將其關(guān)掉。
11、net.ipv4.tcp_synack_retries = 1為了打開(kāi)對(duì)端的連接,內(nèi)核需要發(fā)送一個(gè)SYN并附帶一個(gè)回應(yīng)前面一個(gè)SYN的ACK。也就是所謂三次握手中的第二次握手。這個(gè)設(shè)置決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量
12、net.ipv4.tcp_syn_retries = 1在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量
13、net.ipv4.tcp_fin_timeout = 30如果套接字由本端要求關(guān)閉,這個(gè)參數(shù) 決定了它保持在FIN-WAIT-2狀態(tài)的時(shí)間。對(duì)端可以出錯(cuò)并永遠(yuǎn)不關(guān)閉連接,甚至意外當(dāng)機(jī)。缺省值是60秒。2.2 內(nèi)核的通常值是180秒,你可以按這個(gè)設(shè)置,但要記住的是,即使你的機(jī)器是一個(gè)輕載的WEB服務(wù)器,也有因?yàn)榇罅康乃捞捉幼侄鴥?nèi)存溢出的風(fēng)險(xiǎn),F(xiàn)IN- WAIT-2的危險(xiǎn)性比FIN-WAIT-1要小,因?yàn)樗疃嘀荒艹缘?.5K內(nèi)存,但是它們的生存期長(zhǎng)些
14、net.ipv4.tcp_keepalive_time = 30當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí)
下面貼出一個(gè)常用的內(nèi)核參數(shù)的標(biāo)準(zhǔn)配置:1 net.ipv4.ip_forward = 0 2 net.ipv4.conf.default.rp_filter = 1 3 net.ipv4.conf.default.accept_source_route = 0 4 kernel.sysrq = 0 5 kernel.core_uses_pid = 1 6 net.ipv4.tcp_syncookies = 1 7 kernel.msgmnb = 65536 8 kernel.msgmax = 65536 9 kernel.shmmax = 6871947673610 kernel.shmall = 429496729611 net.ipv4.tcp_max_tw_buckets = 600012 net.ipv4.tcp_sack = 113 net.ipv4.tcp_window_scaling = 114 net.ipv4.tcp_rmem = 4096 87380 419430415 net.ipv4.tcp_wmem = 4096 16384 419430416 net.core.wmem_default = 838860817 net.core.rmem_default = 838860818 net.core.rmem_max = 1677721619 net.core.wmem_max = 1677721620 net.core.netdev_max_backlog = 26214421 net.core.somaxconn = 26214422 net.ipv4.tcp_max_orphans = 327680023 net.ipv4.tcp_max_syn_backlog = 26214424 net.ipv4.tcp_timestamps = 025 net.ipv4.tcp_synack_retries = 126 net.ipv4.tcp_syn_retries = 127 net.ipv4.tcp_tw_recycle = 128 net.ipv4.tcp_tw_reuse = 129 net.ipv4.tcp_mem = 94500000 915000000 92700000030 net.ipv4.tcp_fin_timeout = 131 net.ipv4.tcp_keepalive_time = 3032 net.ipv4.ip_local_port_range = 1024 6500033 net.ipv4.ip_conntrack_max = 6553500
關(guān)鍵詞:代理,性能,負(fù)載,均衡