IT技術互動交(jiao)流平台

山东体彩网官网

來源(yuan)︰IT165收集  發(fa)布(bu)日(ri)期︰2020-02-26 14:40:18

本(ben)文(wen)為(wei)我yi) ginx時的筆(bi)記與心得(de),如有錯誤或者不當(dang)的地方,還望不吝(lin)指出

山东体彩网官网

1.1 正向代理和反(fan)向代理

正向代理

一(yi)般(ban)來ci)擔 頤撬檔拇砑際蹙褪侵剛虼砑際酢br />使用正向代理技術一(yi)般(ban)用來訪問我們無(wu)法(fa)訪問的服務器。正向代理服務器介(jie)于用戶和目標(biao)服務器之間(jian),比如用戶A想(xiang)去訪問目標(biao)服務器B,但是各種原因無(wu)法(fa)直接(jie)訪問,這時ben)涂梢醞 褂謎虼矸衿,用戶A向代理服務器C發(fa)送一(yi)個請求並指定目標(biao)服務器B,代理服務器會將請求轉發(fa)給B並將獲取的結(jie)果(guo)返回給用戶A。
使用正向代理,往往需要客戶去進(jin)行相關的配置(zhi)。典型(xing)的例子是,為(wei)防火牆內的局域網用戶提供訪問訪問Internet的途(tu)徑,有些(xie)公司內部的局域網本(ben)身是無(wu)法(fa)訪問互聯(lian)網的,但是qiang)梢醞 柚zhi)代理實現zhi)夢省;褂辛硪yi)個典型(xing)的例子就是“翻牆”。
反(fan)向代理
與正向代理技術相對的就是反(fan)向代理技術。
使用反(fan)向代理時,客戶端(duan)的用戶不需要任(ren)何(he)設置(zhi),而且用戶始終認為(wei)他訪問的代理服務器B就是目標(biao)服務器,用戶將請求發(fa)送給反(fan)向代理服務器,由反(fan)向代理服務器判斷應該將請求轉交(jiao)給哪(na)台目標(biao)服務器,然後將結(jie)果(guo)返回給用戶。

對比
通過對比,我們qiang)梢雜幸yi)個更清晰的認識(shi)。
a.誰(shui)在“牆”里(li)邊
對使用正向代理的環(huan)境來ci)擔 沒 揮誶嚼li)邊,牆限制了用戶與外界溝通的na)芰Γ 饈保 頤鞘褂謎虼砑際趵錘秤櫨沒?夢釋飩緇huan)境的na)芰Αbr />對使用反(fan)向代理的環(huan)境來ci)擔 勘biao)服務器位于牆里(li)邊 ,這面牆jie)懈雒牛  幌蚍fan)向代理服務器開放。本(ben)來任(ren)何(he)用戶都無(wu)法(fa)訪問目標(biao)服務器,但反(fan)向代理服務器的出現使之變(bian)成了可能,用戶直接(jie)訪問反(fan)向代理服務器即可。

b.用戶訪問的是誰(shui)
對正向代理來ci)擔 沒?夢實木褪悄勘biao)服務器。比如使用代理的局域網用戶訪問IPA時,他實際上(shang)是就是向IPA發(fa)起的請求,只是這個請求實際發(fa)給了正向代理服務器,然後由代理服務器做(zuo)了個轉發(fa),用戶需要告訴(su)代理服務器請求的na)諶菀約扒肭蟺哪(na)勘biao)。

對于反(fan)向代理來ci)擔 沒?夢實氖欠fan)向代理服務器。先拿nginx舉(ju)個例子,當(dang)我們使用nginx做(zuo)負載均(jun)衡時,一(yi)台nginx後邊是多(duo)台目標(biao)服務器,比如nginx的地址(zhi)為(wei)IPA,目標(biao)服務器的地址(zhi)為(wei)IPB1,IPB2,IPB3。用戶實際請求的是IPA,然後由反(fan)向代理服務器來決定將請求轉發(fa)給哪(na)一(yi)台目標(biao)服務器.

c.用戶是否需要配置(zhi)
對于正向代理來ci)擔 沒 枰﹦jin)行相應的配置(zhi)。
對于反(fan)向代理來ci)擔 沒?恍枰 渲zhi),而是需要對反(fan)向代理服務器配置(zhi)與之關聯(lian)的na)勘biao)服務器。

1.2 nginx

是什(shi)麼?
nginx是一(yi)個高性能的web和反(fan)向代理服務器,同時也支持IMAP/POP3/SMTP 代理。
做(zuo)什(shi)麼?
nginx主(zhu)要就是用來做(zuo)反(fan)向代理及負載均(jun)衡。

山东体彩网官网

2.1 安裝(zhuang)

一(yi)般(ban)情況,使用如下命令(ling)直接(jie)安裝(zhuang)即可

sudo apt-get install nginx

安裝(zhuang)之後啟動nginx進(jin)行測試(shi),使用下面兩種zhi)ling)都可以啟動

 sudo /etc/init.d/nginx start

或者

sudo service nginx start

啟動後在瀏覽器地址(zhi)欄輸入︰http://localhost 進(jin)行確認,如果(guo)進(jin)入nginx的歡(huan)迎界面,說de)ginx已(yi)安裝(zhuang)並且啟動成功(gong)

2.2 命令(ling)

命令(ling)功(gong)能
sudo service nginx start啟動nginx
sudo /etc/init.d/nginx start啟動nginx
sudo service nginx stop停止(zhi)nginx
sudo /etc/init.d/nginx stop停止(zhi)nginx
sudo service nginx restart重啟nginx
sudo /etc/init.d/nginx restart重啟nginx

山东体彩网官网

3.1 master & worker

大多(duo)數(shu)情況下nginx是以多(duo)進(jin)程的方式執行的(好(hao)像也支持單進(jin)程模式︰nginx的單進(jin)程模式)
nginx啟動後,會在後台產生一(yi)個master進(jin)程和tou)duo)個worker進(jin)程。master和worker是主(zhu)進(jin)程與子進(jin)程的關系。
master進(jin)程類似于監工,而worker進(jin)程類似于工人。master進(jin)程主(zhu)要負責管理worker進(jin)程。
master進(jin)程的工作(zuo)包含︰
1.接(jie)收外界信號,並向各個worker進(jin)程發(fa)送信號。
2.監控worker進(jin)程(工作(zuo)進(jin)程)的運行狀(zhuang)態,當(dang)worker進(jin)程異常退出後,會自動重新啟動新的worker進(jin)程。
worker進(jin)程的工作(zuo)為(wei)︰
基本(ben)的網絡事lu)嵊orker進(jin)程來執行,多(duo)個worker一(yi)同競爭客戶端(duan)請求,而這個競爭是公平的,每個worker進(jin)程都有xing) deng)的機會獲取到客戶端(duan)請求。一(yi)個請求只能被一(yi)個worker進(jin)程處理,一(yi)個worker也不能處理其他進(jin)程處理的請求。

3.2 具(ju)體流程

首先了解一(yi)下linux的fork函數(shu)︰
fork的作(zuo)用是創建(jian)子進(jin)程,fork創建(jian)的子進(jin)程會基本(ben)復制主(zhu)進(jin)程的全部信息(xi),也就是說子進(jin)程會繼承主(zhu)進(jin)程的所(suo)有屬(shu)性。
對于nginx來ci)擔aster進(jin)程會首先建(jian)立好(hao)需要的socket,然後fork生成子進(jin)程worker(worker進(jin)程的個數(shu)一(yi)般(ban)與機器cpu的核數(shu)一(yi)致),此(ci)時每個worker進(jin)程都繼承了master進(jin)程的屬(shu)性,包括socket,當(dang)然,這個socket不是同一(yi)個,每個進(jin)程都有一(yi)個自己的socket,只不過都會監听同一(yi)個IP和tou)duan)口(kou)。當(dang)有一(yi)個連(lian)接(jie)請求發(fa)生時,由于每個worker進(jin)程在獲取請求上(shang)都是公平的,所(suo)以每個worker進(jin)程都會收到通知。為(wei)了確保一(yi)個請求只被一(yi)個進(jin)程處理,所(suo)以nginx中使用了互斥鎖accept_mutex,所(suo)有的worker進(jin)程首先去爭奪互斥鎖,只有搶到jiao)?饉慕jin)程才(cai)能去處理該請求。一(yi)個worker進(jin)程處理請求的過程包括︰獲取連(lian)接(jie),讀取請求,解析請求,處理請求,斷開連(lian)接(jie)。

3.3 同步&異步 阻(zu)塞&非阻(zu)塞

通過3.2我們知道一(yi)個worker進(jin)程只能處理一(yi)個請求,而worker進(jin)程的數(shu)量(liang)又是有限的,那nginx何(he)來處理高並發(fa)一(yi)說呢?
首先ren)頤竅攘私庖yi)下 同步&異步 阻(zu)塞&非阻(zu)塞
偶然在網上(shang)看到一(yi)個例子,很生動,給大家分享一(yi)下︰

故事背景︰隔壁老(lao)王煮(zhu)開水
出場人物︰老(lao)王,普通水壺,鳴笛水壺(水燒開後會響)
第一(yi)天︰
老(lao)王把普通水壺放在火上(shang),盯著水壺等(deng)著水開。(同步阻(zu)塞
老(lao)王覺得(de)這樣太浪費時間(jian)。
第二天︰
老(lao)王把普通水壺放在火上(shang),去客廳看電(dian)視,時不時去看一(yi)下水是否開了(同步非阻(zu)塞
老(lao)王覺得(de)這樣太麻煩。
第三天︰
老(lao)王把響水壺放火上(shang),盯著水壺等(deng)著水開鳴笛(異步阻(zu)塞
老(lao)王覺得(de)自己有點傻
第四天︰
老(lao)王把響水壺放火上(shang),去客廳看電(dian)視,等(deng)水壺響了再去拿壺(異步非阻(zu)塞)

在這個故事中,
同步&異步是針(zhen)對水壺來ci)檔模 脹ㄋ 峭 劍 燜 且觳健Ksuo)謂同步,就是需要調用者主(zhu)動去等(deng)待調用的結(jie)果(guo),異步是調用發(fa)生後,調用者不會立即得(de)到調用結(jie)果(guo),而是被調用者在處理完後將結(jie)果(guo)通知給他。
阻(zu)塞&非阻(zu)塞是針(zhen)對老(lao)王來ci)檔摹I檔deng)的老(lao)王是阻(zu)塞,看電(dian)視的老(lao)王是非阻(zu)塞。阻(zu)塞&非阻(zu)塞關注的是程序在等(deng)待調用結(jie)果(guo)(消息(xi),返回值)時的狀(zhuang)態.阻(zu)塞調用是指調用結(jie)果(guo)返回之前,當(dang)前線程會被掛(gua)起。調用線程只有在得(de)到結(jie)果(guo)之後才(cai)會返回。
非阻(zu)塞調用指在不能立刻得(de)到結(jie)果(guo)之前,該調用不會阻(zu)塞當(dang)前線程。所(suo)以阻(zu)塞的老(lao)王只能等(deng)水開,而非阻(zu)塞的老(lao)王在水開前可以看電(dian)視。

而nginx使用的就是異步非阻(zu)塞,比如nginx會在一(yi)個線程中處理所(suo)有的IOq請求(IO多(duo)路復用技術),當(dang)一(yi)個IO操作(zuo)A開始時,nginx並不會等(deng)待這個IO操作(zuo)完成,而是會繼續處理一(yi)下IO操作(zuo)B,直到jiao)竦de)這個IO操作(zuo)A已(yi)完成的通知再進(jin)行下一(yi)步處理。所(suo)以nginx可以yuan) 碭  fa)的請求。

山东体彩网官网

使用nginx -t命令(ling)可以查看nginx配置(zhi)文(wen)件(jian)的存放位置(zhi)。
首先看一(yi)下默認配置(zhi)︰

user www-data;worker_processes auto;pid /run/nginx.pid;events { worker_connections 768; # multi_accept on;}http { ## # Basic Settings ## 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 Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable 'msie6'; # 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; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*;}#mail {# # See sample authentication script at:# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript# # # auth_http localhost/auth.php;# # pop3_capabilities 'TOP' 'USER';# # imap_capabilities 'IMAP4rev1' 'UIDPLUS';# # server {# listen localhost:110;# protocol pop3;# proxy on;# }# # server {# listen localhost:143;# protocol imap;# proxy on;# }#}

首先需要了解的就是nginx是基于模塊化的配置(zhi),配置(zhi)的結(jie)構圖如下︰
這里(li)寫圖片(pian)描述(shu)

4.1 高級(ji)配置(zhi)

其中,文(wen)件(jian)頂(ding)部的為(wei)高級(ji)配置(zhi)︰

user www-data;worker_processes auto;pid /run/nginx.pid;

對于user和pid,我們應該保持默認設置(zhi)。
worker_processes表示worker進(jin)程的數(shu)量(liang),設置(zhi)為(wei)auto時將與可用的CPU內核數(shu)保持一(yi)致。
除此(ci)之外,下面的配置(zhi)用來設置(zhi)worker進(jin)程打開文(wen)件(jian)數(shu)的限制︰

worker_rlimit_nofile 100000;

如果(guo)沒有設置(zhi)的話,該值將與操作(zuo)系統的限制值一(yi)樣,設大一(yi)點可以避免“too many open files”的問題(ti)

4.2 events 模塊

events模塊中包含nginx中所(suo)有處理連(lian)接(jie)的設置(zhi)
默認配置(zhi)為(wei)︰

events { worker_connections 768; # multi_accept on;}

worker_connections:表示一(yi)個worker進(jin)程可以同時打開的最大連(lian)接(jie)數(shu)。
multi_accept ︰告訴(su)nginx收到一(yi)個新連(lian)接(jie)通知後接(jie)受盡可能多(duo)的連(lian)接(jie)。
初次之外,還提供了use屬(shu)性

use epoll;

設置(zhi)用于復用客戶端(duan)線程的輪詢(xun)方法(fa)。如果(guo)你使用Linux 2.6+,你應該使用epoll。如果(guo)你使用*BSD,你應該使用kqueue。

4.3 http模塊

HTTP模塊控制著nginx http處理的所(suo)有核心特性.
對比上(shang)邊的配置(zhi)文(wen)件(jian)

sendfile

服務器響應一(yi)個http請求的步驟(zhou)為(wei)︰
1.把磁盤文(wen)件(jian)讀入內核緩沖區
2.從內核緩沖區讀到內存
3.處理(靜(jing)態資shi)yuan)不需處理)
4.發(fa)送到網卡的na)諍嘶撼邇 fa)送緩存)
5.網卡發(fa)送數(shu)據
而使用linux的sendfile()可以跳過2,3步,實現數(shu)據在磁盤和socket之間(jian)的互相拷貝。sendfile屬(shu)性就是讓sendfile()函數(shu)發(fa)揮作(zuo)用

tcp_nopush

該參數(shu)表示將在一(yi)個數(shu)據包中發(fa)送所(suo)有xing)肺wen)件(jian),而不是一(yi)個一(yi)個發(fa)送。

tcp_nodelay

告訴(su)nginx不要緩存數(shu)據,而是一(yi)段一(yi)段的發(fa)送

keepalive_timeout

表示與客戶端(duan)鏈(lian)接(jie)的超時bi)奔jian),超過設置(zhi)的時間(jian)後將會斷開連(lian)接(jie)

types_hash_max_size

types_hash_bucket_size 設置(zhi)了每個散列塊佔用的na)詿媧笮。ypes_hash_max_size影響散列表的沖突率。types_hash_max_size越大,就會消耗(hao)更多(duo)的na)詿媯   ey的沖突率會降低,檢索速度(du)就更快(kuai)。types_hash_max_size越小,消耗(hao)的na)詿婢馱叫。   ey的沖突率可能上(shang)升

server_tokens

用于隱(yin)藏頁(ye)面中的nginx版(ban)本(ben)號

server_names_hash_bucket_size

該屬(shu)性可以解決虛擬主(zhu)機多(duo)域名的問題(ti),當(dang)配置(zhi)多(duo)個虛擬主(zhu)機時,必須配置(zhi)該屬(shu)性,並適當(dang)太大對應的值,以32的倍數(shu)為(wei)宜。

server_name_in_redirect

nginx的重定向規則。
當(dang) URL 指向一(yi)個目錄(lu)並且在最後沒有包含“/”時,Nginx 內部會自動的做(zuo)一(yi)個 301 重定向,這時會有兩種情況︰
1、server_name_in_redirect on(默認),URL 重定向為(wei)︰ server_name 中的第一(yi)個域名 + 目錄(lu)名 + /;
2、server_name_in_redirect off,URL 重定向為(wei)︰ 原 URL 中的域名 + 目錄(lu)名 + /。

client_header_timeout

設置(zhi)請求頭的超時bi)奔jian)

client_body_timeout

設置(zhi)請求體的超時bi)奔jian)。


以上(shang)為(wei)nginx的http模塊的基礎設置(zhi)。

access_log

設置(zhi)nginx是否將存儲訪問日(ri)志(zhi)。關閉這個選項可以讓讀取磁盤IO操作(zuo)更快(kuai)(aka,YOLO)。

error_log

設置(zhi)為(wei)只記錄(lu)嚴重的錯誤。

reset_timeout_connection

設置(zhi)為(wei)on時,將會關閉不響應的客戶端(duan)鏈(lian)接(jie)

send_timeout

客戶端(duan)的響應超時bi)奔jian)。


以上(shang)為(wei)nginx關于log的配置(zhi)。

gzip

告訴(su)nginx采用gzip壓縮的形式發(fa)送數(shu)據。這將會減少我們發(fa)送的數(shu)據量(liang)。

gzip_disable

為(wei)指定的客戶端(duan)禁(jin)用gzip功(gong)能。我們設置(zhi)成IE6或者更低版(ban)本(ben)以使我們的方案能夠(gou)廣泛兼(jian)容。

gzip_static

告訴(su)nginx在壓縮資shi)yuan)之前,先查找是否有預先gzip處理過的資shi)yuan)。這要求你預先壓縮你的文(wen)件(jian)(在這個例子中被注釋掉(diao)了),從而允許你使用最高壓縮比,這樣nginx就不用再壓縮這些(xie)文(wen)件(jian)了(想(xiang)要更詳(xiang)盡的gzip_static的信息(xi),請點擊(ji)這里(li))。

gzip_proxied

允許或者禁(jin)止(zhi)壓縮基于請求和響應的響應流。我們設置(zhi)為(wei)any,意味著將會壓縮所(suo)有的請求。

gzip_min_length

設置(zhi)對數(shu)據啟用壓縮的最少字節數(shu)。如果(guo)一(yi)個請求小于1000字節,我們最好(hao)不要壓縮它,因為(wei)壓縮這些(xie)小的數(shu)據會降低處理此(ci)請求的所(suo)有進(jin)程的速度(du)。

gzip_comp_level

設置(zhi)數(shu)據的壓縮等(deng)級(ji)。這個等(deng)級(ji)可以是1-9之間(jian)的任(ren)意數(shu)值,9是最慢(man)但是壓縮比最大的。我們設置(zhi)為(wei)4,這是一(yi)個比較折中的設置(zhi)。

gzip_type

設置(zhi)需要壓縮的數(shu)據格式。上(shang)面例子中已(yi)經有一(yi)些(xie)了,你也可以再添加更多(duo)的格式。

4.4 負載配置(zhi)

在http模塊中添加如下代碼(ma)︰

upstream proxy_set{  server 10.0.2.16:80 weight=1;  server 10.0.2.17:80 weight=1; }server{ listen 80; server_name localhost 127.0.0.1;location / { proxy_pass http://proxy_set proxy_set_header Host $host; proxy_set_header X-Real_IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #client_max_body_size 10m;}}

首先,在http節點下新lue)pstream節點,名稱為(wei)proxy_set,這個名稱可以自己指定,並在節點內配置(zhi)後端(duan)服務器的IP:port以及權重,權重可以省略(lue)。
然後配置(zhi)server節點,listen為(wei)監听的端(duan)口(kou),server_name為(wei)服務器地址(zhi),多(duo)個地址(zhi)以空(kong)格隔開,我這里(li)設置(zhi)了兩個個,分別為(wei)localhost和127.0.0.1,.然後配置(zhi)server的location節點,proxy_pass的至為(wei)http://+upstream的名稱,其他配置(zhi)保持一(yi)致(client_max_body_size為(wei)設置(zhi)文(wen)件(jian)上(shang)傳(chuan)大小的限制,nginx默認值為(wei)1M)。
配置(zhi)完以後重啟nginx服務。
瀏覽器地址(zhi)欄輸入localhost:80/項目名或者127.0.0.1:80/項目名即可訪問。

Tag標(biao)簽︰事兒  
  • 山东体彩网官网

About IT165 - 廣告服務 - 隱(yin)私聲明 - 版(ban)權申明 - 免責條款(kuan) - 網站地圖 - 網友投(tou)稿 - 聯(lian)系方式
本(ben)站內容來自于互聯(lian)網,僅供用于網絡技術學(xue)習,學(xue)習中請遵循相關法(fa)律法(fa)規
山东体彩网官网 | 下一页