Nginx:架構基礎與配置文件祥解

Nginx是什麼,可以用來做什麼?

Nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP3、SMTP代理服務器;Nginx可以作爲一個HTTP服務器進行網站的發佈處理,另外Nginx可以作爲反向代理進行負載均衡的實現。

Nginx基礎概念

connection

1、一個nginx進程鎖允許的最大連接數的參數爲worker_connections 默認爲1024,這個參數可以根據服務器的性能和內存使用量來調整;
2、對於http請求本地資源來說,鎖允許的最大併發數量爲worker_process * worker_connections,總數保持在3w左右;
3、HTTP作爲反向代理來說,最大併發數量應該是worker_connections * worker_processes/2 (客戶端的鏈接和後端服務的鏈接);
在這裏插入圖片描述

request

在這裏插入圖片描述
nginx處理網絡請求的生命週期:
1、ngx_http_request_t是對一個http請求的封裝,用來保存解析請求與輸出響應相關的數據;
2、從ngx_http_init_request開始,這個函數設置ngx_http_process_request_line來處理請求行,通過ngx_http_read_request_header來處理請求頭;
3、以請求行中的host域來查找虛擬機;
4、解析到的數據會存儲在ngx_http_request_t結構中;
5、nginx解析到兩個回車換行符表示請求頭結束,使用ngx_http_process_request來處理請求;
6、ngx_http_process_request設置處理函數爲ngx_http_request_handler;
7、然後調用ngx_http_handler來真正地處理一個完整的HTTP請求。

keepalive

1、客戶端的請求頭中的connection爲close,表示客戶端請求關掉長連接;
2、如果爲keep-alive,則客戶端需要打開長連接;
3、如果客戶端的請求中沒有connection這個頭,那麼根據協議,如果是http1.0,則默認爲close,如果是http1.1,則默認爲keep-alive;
4、如果客戶端請求中沒有connection這個頭,那麼根據協議,如果是http1.0,則默認爲close,如果是http1.1,則默認是keep-alive;
5、如果服務端最後決定長連接打開,則請求頭中會包含connection:keep-alive,否則就是connection:close;
6、keep-alive的好處:客戶端需要多次訪問同一個server時,開啓keep-alive可以大大減少time-wait的數量。

pipeline

1、pipeline流水線作業,是keepalive的一種昇華;
2、與keepalive相同,也是基於TCP長連接;
3、利用一個連接進行多次請求;
4、與keepalive的區別:
1、keepalive:第二個請求必須要在第一個請求的嚮應完全接收後才能發起。
2、pipeline:nginx對pipeline中的請求的處理也不是並行的,依然是一個一個的處理,只是在處理第一個請求時,就可以發起第二個請求。
5、pipeline實現原理:nginx在讀取數據時,會將數據放在一個buffer裏面,在處理完前一個請求之後,如果buffer中還有請求,就認爲是下一個處理的請求,然後處理它,如果沒有,則設置爲keepalive。

lingering_close

1、延遲關閉,當關閉nginx連接時,先關閉TCP的寫,等待一段時間再關閉連接的讀
2、保持更好的客戶端兼容性,但是要消耗更多的資源。

Nginx配置文件祥解

基礎配置解釋

 1 # 定義Nginx運行的用戶和用戶組,來指定Nginx Worker進程運行用戶以及用戶組,默認由nobody帳號運行
  2 user  nginx;
  3 
  4 # nginx進程數,建議設置爲CPU總核心數,可以使用lscpu查看cou數量
  5 worker_processes  1;
  6 
  7 # 全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ],其中debug輸出日
    志最爲最詳細,而crit輸出日誌最少 
  8 error_log  logs/error.log;
  9 error_log  logs/error.log  notice;
 10 error_log  logs/error.log  info;
 11 
 12 # 進程文件,用來指定進程id的存儲文件位置 
 13 pid        logs/nginx.pid;
 14 
 15 # 一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值 ulimit -n)
 與nginx進程數相除,但是nginx分配請求並不均勻,所以建議與ulimit -n的值保持一致,可以使用u   
 limit -n ‘num’來設置其他值。最多65535
 16 worker_rlimit_nofile 4864;
 17 
 18 # 工作模式與連接數上限
 19 events {
 20     # 參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是linux2.6以
 上版本內核中的高性能I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
 21     use epoll; # mac平臺用kqueue,對於linux系統,epoll工作模型是首選
 22 
 23     # worker_connections用於定義nginx每個進程的最大連接數,即接收前端的最大請求數,默認
 是1024.最大客戶端連接數由worker_processes和worker_connections決定,即
Max_clients=worker_ processes*worker_connections,在作爲反向代理時,Max_clients變
爲:Max_clients = worker_pro    cesses*worker_connections/4。進程的最大連接數受Linux系統進
程的最大打開文件數限制,在執行操作系統命令"ulimit -n 65535"後worker_connections的設置才能生效
 24     worker_connections  1024;
 25 }
 26 
 27 # 設定http服務器
 28 http {
 29     # 用來設定文件的mime類型,類型在配置文件目錄下的mime.type文件定義,來告訴nginx來識別
    文件類型。
 30     include       mime.types;
 31 
 32     # 默認文件類型,默認爲二進制流
 33     default_type  application/octet-stream;
 34 
 35     #charset utf-8; # 默認編碼
 36 
 37 
38     # 用於設置日誌的格式,和記錄哪些參數,這裏設置爲main,剛好用於access_log來記錄這種類
    型
 39     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 40     #                  '$status $body_bytes_sent "$http_referer" '
 41     #                  '"$http_user_agent" "$http_x_forwarded_for"';
 42 
 43     #access_log  logs/access.log  main;
 44 
 45     sendfile        on; # 開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸
出文件,對於普通應用設爲on,如果用來進行下載等應用磁盤IO重負載應用可設置爲off,以平衡磁
盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改稱off。
 46 
 47     #tcp_nopush     on; # 防止網絡阻塞
 48     #tcp_nodelay    on; # 防止網絡阻塞
 49 
 50     # 長連接超時時間,單位是秒
 51     #keepalive_timeout  0;
 52     keepalive_timeout  65;
 53 
 54     # 開啓gzip壓縮輸出
 55     #gzip  on;

其他配置解釋

負載均衡配置

1、設定負載均衡服務器列表

35     upstream gd.com{
36         ip_hash;
37         server 172.25.66.2:80;
38         server 172.25.66.3:8080 down;
39         server 172.25.66.4:80 max_fails=3 fail_timeout=20s;
40         }

 50         location / {
 51             proxy_pass http://gd.com;    # 調用負載均衡器gd.com
 52         }   

在這裏插入圖片描述
upstream是Nginx的HTTP Upstream模塊,這個模塊通過一個簡單的調度算法來實現客戶端IP到後端服務器的負載均衡。
在上面的設定中,通過upstream指令指定了一個負載均衡器的名稱gd.com。這個名稱可以任意指定,在後面需要的地方直接調用即可。
Nginx的負載均衡模塊目前支持4種調度算法,下面進行分別介紹,其中後兩項屬於第三方的調度方法。

輪詢(默認):每個請求按時間順序逐一分配到不同的後端服務器,如果後端某臺服務器宕機,
故障系統被自動剔除,使用戶訪問不受影響;

Weight:指定輪詢權值,Weight值越大,分配到的訪問機率越高,主要用於後端每個服務器性能
不均的情況下;

ip_hash:每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端服務
器,有效解決了動態網頁存在的session共享問題;

fair:比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進
行負載均衡,也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身
是不支持fair的,如果需要使用這種調度算法,必須下載Nginx的upstream_fair模塊;

url_hash:按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,可以進一步提
高後端緩存服務器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調度算法,必須安
裝Nginx 的hash軟件包。

在HTTP Upstream模塊中,可以通過server指令指定後端服務器的IP地址和端口,同時還可以設定每個後端服務器在負載均衡調度中的狀態。常用的狀態有:

down:表示當前的server暫時不參與負載均衡;

backup:預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,纔會請求backup
機器,因此這臺機器的壓力最輕;

max_fails:允許請求失敗的次數,默認爲1。當超過最大次數時,返回proxy_next_upstream 模塊
定義的錯誤;

fail_timeout:在經歷了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使
用。

注意,當負載調度算法爲ip_hash時,後端服務器在負載均衡調度中的狀態不能是weight和backup。

測試:
在這裏插入圖片描述

虛擬主機配置

虛擬主機技術主要應用於HTTP(Hypertext Transfer Protocol,超文本傳輸協議)服務,將一臺服務器的某項或者全部服務內容邏輯劃分爲多個服務單位,對外表現爲多個服務器,從而充分利用服務器硬件資源。
1、編輯配置文件,生成虛擬主機

 90     server {
 91         listen       80;
 92         server_name  www.westos.org;        # 設置域名爲www.westos.org
 93         
 94         location / {
 95             root   /www1;        # 第一個虛擬主機的發佈目錄
 96             index  index.html index.htm;
 97         }   
 98     }   
 99     
100     server {
101         listen       80;
102         server_name  www.linux.org;        # 設置域名爲www.linux.org
103     
104         location / {
105             root   /www2;        # 第二個虛擬主機的發佈目錄
106             index  index.html index.htm;
107         }
108     }

2、創建/www1與/www2目錄,並在目錄中編輯發佈文件index.html
3、在真機中的/etc/hosts文件中做解析
172.25.66.1 www.westos.org www.linux.org
4、重啓nginx
5、驗證

在這裏插入圖片描述

使用https

1、編輯nginx配置文件

110     # HTTPS server
111     #
112     server {
113         listen       443 ssl;
114         server_name  www.westos.org;
115 
116         ssl_certificate      cert.pem;        # https要用到的鎖和鑰匙
117         ssl_certificate_key  cert.key;
118 
119         ssl_session_cache    shared:SSL:1m;
120         ssl_session_timeout  5m;
121 
122         ssl_ciphers  HIGH:!aNULL:!MD5;
123         ssl_prefer_server_ciphers  on;
124 
125         location / {
126             root   /www1;
127             index  index.html index.htm;
128         }
129     }

在這裏插入圖片描述
2、重啓nginx時會報錯
在這裏插入圖片描述
報錯原因是找不到認證文件,我們需要生成認證文件並將其放在nginx的配置目錄下
3、生成認證文件
cd /etc/pki/tls/certs
make cert.pem
cp cert.pem /usr/local/nginx/conf/cert.pem
cp cert.pem /usr/local/nginx/conf/cert.key
4、重啓nginx
5、測試,在瀏覽器中訪問第一個虛擬主機的域名
www.westos.org
在這裏插入圖片描述
在這裏插入圖片描述

重定向

1、將域名爲westos.rg的請求重定向到www.westos.org

 90     server {
 91         listen       80;
 92         server_name  www.westos.org westos.org;
 93         rewrite ^(.*)$ https://www.westos.org permanent;
 94         # 將域名爲westos.org與www.westos.org的請求重定向到https://www.westos.org
 95         # permanent表示永久重定向
 96         
 97         location / {
 98             root   /www1;
 99             index  index.html index.htm;
100         }
101     }

在這裏插入圖片描述
測試
在這裏插入圖片描述
2、將www.westos.org/bbs重定向到bbs.westos.org(將www.westos.org下的一個子目錄定向到一個新的站點)
在這裏插入圖片描述
在這裏插入圖片描述
3、將www.westos.org/bbs/index.html重定向到https://bbs.westos.org/index.html
在這裏插入圖片描述
在這裏插入圖片描述

對客戶端併發量、下載速度的限制

1、限制客戶端請求的併發量爲1
在nginx配置文件中的http服務器配置模塊中編輯:

 34     limit_conn_zone $binary_remote_addr zone=addr:10m;   限制帶寬
 42     server {
 43         listen       80;
 44         server_name  localhost;
 45         
 46         location /download {
 47                 limit_conn addr 1;         # 限制客戶端併發量爲1
 48         }       

在這裏插入圖片描述
在/usr/local/nginx/html/下創建download目錄
在物理機中使用ab工具進行壓測,併發量設爲1
在這裏插入圖片描述
在nginx服務器上查看訪問日誌,可以看到被訪問10次全部成功
在這裏插入圖片描述
將併發量設置爲10次再次進行壓測
在這裏插入圖片描述
在這裏插入圖片描述
2、限制客戶端下載速率

 35     limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;         #限制下載速率
 43     server {
 44         listen       80;
 45         server_name  localhost;
 46 
 47         location /download {
 48                 limit_conn addr 1;
 49                 limit_rate 50k;        # 限制下載速率爲50k/s
 50                 limit_req zone=one burst=5;

我們在download目錄中生成一個100M的文件,然後在物理機中去下載
在這裏插入圖片描述
在這裏插入圖片描述
可以看到,下載速率一直維持在50k/s左右。

訪問控制

1、允許172.25.66.250主機訪問,禁止其他主機訪問

 52         location /admin {
 53                 allow 172.25.66.250;
 54                 deny all;
 55         }

創建admin目錄
使用172.25.66.250主機訪問該目錄
在這裏插入圖片描述
使用172.25.66.2主機訪問
在這裏插入圖片描述
訪問被拒!

防盜鏈機制

**盜鏈:**此內容不在自己服務器上,而通過技術手段,繞過別人放廣告有利益的最終頁,直接在自己的有廣告有利益的頁面上向最終用戶提供此內容。 常常是一些名不見經傳的小網站來盜取一些有實力的大網站的地址(比如一些音樂、圖片、軟件的下載地址)然後放置在自己的網站中,通過這種方法盜取大網站的空間和流量。

我們可以利用防盜鏈機制來禁止外部對本機內容進行盜鏈
1、我們開啓另外一臺部署有apache的主機來對nginx服務器進行盜鏈
首先在apache的主機中編輯apache默認發佈文件,寫入如下內容:

<html>

<body>

<img src="http://172.25.66.1/download/301764.jpg">    # 盜取172.25.66.1主機上的圖片

</body>

</html>
使用這種方法可以得到172.25.66.1主機上的圖片,從而達到沒有付出而獲得客戶端流量的作用

在這裏插入圖片描述
現在我們到nginx服務器上添加防盜鏈機制
編輯nginx配置文件

 56         location ~ .*\.(png|jpg|gif)$ {
 57                 valid_referers www.westos.org;
 58                 if ($invalid_referer) {
 59                         #return 403;     # 禁止其訪問
 60                         rewrite ^/(.*) http://bbs.westos.org/daolian.png;  # 將盜鏈請求重定向,對其顯示防盜鏈圖片
 61                 }
 62         }

將圖片防止/www2目錄下
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章