日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Nginx各個模塊的配置及常用配置選項_nginx

作者:vegetari ? 更新時間: 2022-04-07 編程語言

接下來,我們仔細分析下Nginx各個模塊的配置選項。
注意:http塊也可以進一步分成3塊,http全局塊里的配置對所有站點生效,server塊配置選項僅對單個站點生效,而location塊的配置僅對單個頁面或url生效。

Nginx Location配置

Nginx Location配置是Nginx的核心配置,它負責匹配請求的url, 并根據Location里定義的規則來處理這個請求,比如拒絕、轉發、重定向或直接提供文件下載。

URL匹配方式及優先級

Nginx的Location配置支持普通字符串匹配和正則匹配,不過url的各種匹配方式是有優先級的,如下所示:

匹配符 匹配規則 優先級逐級降低

= 精確匹配 1
^~ 以某個字符串開頭 2
~ 區分大小寫的正則匹配 3
~* 不區分大小寫的正則匹配 4
!~ 區分大小寫的不匹配正則 5
!~* 不區分大小寫的不匹配正則 6
/ 通用匹配,任何請求都會匹配到 7

為了加深你的理解,我們來看如下一個例子。由于規則2的優先級更高,當用戶訪問/static/或則/static/123.html時,Nginx會優先執行規則2里的操作,其它的的請求則會交由規則1執行。

 # 規則1:通用匹配
 location / {
 }
 # 規則2:處理以/static/開頭的url
 location ^~ /static {                         
     alias /usr/share/nginx/html/static; # 靜態資源路徑
 }

上例中我們使用了alias別名設置了靜態文件所在目錄,我們還可以使用root指定靜態文件目錄。這里請一定注意alias和root的區別:

root對路徑的處理:root路徑 + location路徑alias對路徑的處理:使用alias路徑替換location路徑

如果用root設置靜態文件資源路徑,可以按如下代碼設置。兩者是等同的。

# 規則2:處理以/static/開頭的url
 location ^~ /static {                         
     root /usr/share/nginx/html; # 靜態資源路徑
 }

Location還支持正則匹配,比如下例可以禁止用戶訪問所有的圖片格式文件。

# 拒絕訪問所有圖片格式文件
 location ~* .*\.(jpg|gif|png|jpeg)$ {
         deny all;
 }

請求轉發和重定向

另一個我們在Location塊里經常配置的就是轉發請求或重定向,如下例所示:

# 轉發動態請求
 server {  
     listen 80;                                                         
     server_name  localhost;                                               
     client_max_body_size 1024M;
     location / {
         proxy_pass http://localhost:8080;   
         proxy_set_header Host $host:$server_port;
     }
 } 
 # http請求重定向到https請求
 server {
     listen 80;
     server_name Domain.com;
     return 301 https://$server_name$request_uri;
 }

?無論是轉發請求還是重定向,我們都使用了以$符號開頭的變量,這些都是Nginx提供的全局變量。它們的具體含義如下所示:

$args, 請求中的參數;
 $content_length, HTTP請求信息里的"Content-Length";
 $content_type, 請求信息里的"Content-Type";
 $document_root, 針對當前請求的根路徑設置值;
 $document_uri, 與$uri相同;
 $host, 請求信息中的"Host",如果請求中沒有Host行,則等于設置的服務器名;
 $limit_rate, 對連接速率的限制;
 $request_method, 請求的方法,比如"GET"、"POST"等;
 $remote_addr, 客戶端地址;
 $remote_port, 客戶端端口號;
 $remote_user, 客戶端用戶名,認證用;
 $request_filename, 當前請求的文件路徑名
 $request_body_file,當前請求的文件
 $request_uri, 請求的URI,帶查詢字符串;
 $query_string, 與$args相同;
 $scheme, 所用的協議,比如http或者是https,比如rewrite ^(.+)$
 $scheme://example.com$1 redirect;        
 $server_protocol, 請求的協議版本,"HTTP/1.0"或"HTTP/1.1";
 $server_addr, 服務器地址;
 $server_name, 請求到達的服務器名;
 $server_port, 請求到達的服務器端口號;
 $uri, 請求的URI,可能和最初的值有不同,比如經過重定向之類的。

知道這些全局變量的含義后,我們就可以限制用戶的請求方法。比如下例中配置了只允許用戶通過GET或POST方法訪問,其他的請求方法則返回405。

Nginx靜態文件配置

Nginx可直接作為強大的靜態文件服務器使用,支持對靜態文件進行緩存還可以直接將Nginx作為文件下載服務器使用。

靜態文件緩存

緩存可以加快下次靜態文件加載速度。我們很多與網站樣式相關的文件比如css和js文件一般不怎么變化,緩存有效器可以通過expires選項設置得長一些。

 # 使用expires選項開啟靜態文件緩存,10天有效
     location ~ ^/(images|javascript|js|css|flash|media|static)/  {
       root    /var/www/big.server.com/static_files;
       expires 10d;
     }

靜態文件壓縮

Nginx可以對網站的css、js 、xml、html 文件在傳輸前進行壓縮,大幅提高頁面加載速度。經過Gzip壓縮后頁面大小可以變為原來的30%甚至更小。使用時僅需開啟Gzip壓縮功能即可。你可以在http全局塊或server塊增加這個配置。

 http {
     # 開啟gzip壓縮功能
     gzip on;
     
     # 設置允許壓縮的頁面最小字節數; 這里表示如果文件小于10k,壓縮沒有意義.
     gzip_min_length 10k; 
     
     # 設置壓縮比率,最小為1,處理速度快,傳輸速度慢;
     # 9為最大壓縮比,處理速度慢,傳輸速度快; 推薦6
     gzip_comp_level 6; 
     
     # 設置壓縮緩沖區大小,此處設置為16個8K內存作為壓縮結果緩沖
     gzip_buffers 16 8k; 
     
     # 設置哪些文件需要壓縮,一般文本,css和js建議壓縮。圖片視需要要鎖。
     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
 }

文件下載服務器

Nginx也可直接做文件下載服務器使用,在location塊設置autoindex相關選項即可。

 server {
 
     listen 80 default_server;
     listen [::]:80 default_server;
     server_name  _;
     
     location /download {    
         # 下載文件所在目錄
         root /usr/share/nginx/html;
         
         # 開啟索引功能
         autoindex on;  
         
         # 關閉計算文件確切大?。▎挝籦ytes),只顯示大概大小(單位kb、mb、gb)
         autoindex_exact_size off; 
         
         #顯示本機時間而非 GMT 時間
         autoindex_localtime on;   
                 
         # 對于txt和jpg文件,強制以附件形式下載,不要瀏覽器直接打開
         if ($request_filename ~* ^.*?\.(txt|jpg|png)$) {
             add_header Content-Disposition 'attachment';
         }
     }
 }

Nginx配置HTTPS

# 負載均衡,設置HTTPS
 upstream backend_server {
     server APP_SERVER_1_IP;
     server APP_SERVER_2_IP;
 }
 
 # 禁止未綁定域名訪問,比如通過ip地址訪問
 # 444:該網頁無法正常運作,未發送任何數據
 server {
     listen 80 default_server;
     server_name _;
     return 444;
 # HTTP請求重定向至HTTPS請求
     listen 80;
     listen [::]:80;
     server_name your_domain.com;
     
     location / {
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_pass http://backend_server; 
      }
     return 301 https://$server_name$request_uri;
     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     # ssl證書及密鑰路徑
     ssl_certificate /path/to/your/fullchain.pem;
     ssl_certificate_key /path/to/your/privkey.pem;
     # SSL會話信息
     client_max_body_size 75MB;
     keepalive_timeout 10;
         proxy_pass http://django; # Django+uwsgi不在本機上,使用代理轉發
     }

Nginx日志配置

Nginx的日志主要包括訪問日志access_log和錯誤日志error_log,你還可以通過log_format定義日志格式。你可以在全局塊,Server塊或Location塊定義日志。比如下例在http塊中定義了一個名為main的日志格式,所有站點的日志都會按這個格式記錄。

http {
  # 日志格式及access日志路徑
   log_format main '$remote_addr - $remote_user [$time_local]  $status '
     '"$request" $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log   logs/access.log  main;
 }

access_log文件隨著訪問記錄增多有可能變得非常大,我們可以使用access_log off關閉一些不需要記錄的訪問。比如當一個站點沒有設置favicon.ico時,access_log會記錄了大量favicon.ico 404信息, 這是沒有必要的, 可以按如下方式關閉訪問日志記錄。

 location = /favicon.ico {
   log_not_found off; 
   access_log off; # 不在access_log記錄該項訪問
 }

Nginx超時設置

Nginx提供了很多超時設置選項,目的是保護服務器資源,CPU,內存并控制連接數。你可以根據實際項目需求在全局塊、Server塊和Location塊進行配置。

請求超時設置

# 客戶端連接保持會話超時時間,超過這個時間,服務器斷開這個鏈接。
 keepalive_timeout 60;
 
 # 設置請求頭的超時時間,可以設置低點。
 # 如果超過這個時間沒有發送任何數據,nginx將返回request time out的錯誤。
 client_header_timeout 15;
 
 # 設置請求體的超時時間,可以設置低點。
 # 如果超過這個時間沒有發送任何數據,nginx將返回request time out的錯誤。
 client_body_timeout 15;
 
 # 響應客戶端超時時間
 # 如果超過這個時間,客戶端沒有任何活動,nginx關閉連接。
 send_timeout 15;
 
 # 上傳文件大小限制
 client_max_body_size 10m;
 
 # 也是防止網絡阻塞,不過要包涵在keepalived參數才有效。
 tcp_nodelay on;
 
 # 客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設置。
 # 一般一個請求頭的大小不會超過 1k,不過由于一般系統分頁都要大于1k
 client_header_buffer_size 2k;
 
 # 這個將為打開文件指定緩存,默認是沒有啟用的。
 # max指定緩存數量,建議和打開文件數一致,inactive 是指經過多長時間文件沒被請求后刪除緩存。
 open_file_cache max=102400 inactive=20s;
 
 # 這個是指多長時間檢查一次緩存的有效信息。
 open_file_cache_valid 30s;
 
 # 告訴nginx關閉不響應的客戶端連接。這將會釋放那個客戶端所占有的內存空間。
 reset_timedout_connection on;

Proxy反向代理超時設置

 # 該指令設置與upstream服務器的連接超時時間,這個超時建議不超過75秒。
 proxy_connect_timeout 60;
 
 # 該指令設置應用服務器的響應超時時間,默認60秒。
 proxy_read_timeout 60;
 # 設置了發送請求給upstream服務器的超時時間
 proxy_send_timeout 60;
 # max_fails設定Nginx與upstream服務器通信的嘗試失敗的次數。
 # 在fail_timeout參數定義的時間段內,如果失敗的次數達到此值,Nginx就認為服務器不可用。
 upstream big_server_com {
    server 192.168.0.1:8000 weight=5  max_fails=3 fail_timeout=30s; # weight越高,權重越大
    server 192.168.0.2:8000 weight=1  max_fails=3 fail_timeout=30s;
    server 192.168.0.3:8000;
    server 192.168.0.4:8001 backup; # 熱備
 }

Nginx負載均衡

Nginx提供了多種負載均衡算法, 最常見的有5種。我們只需修改對應upstream模塊即可。

輪詢(默認)

每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除;

 # 輪詢,大家權重一樣
 upstream backend_server {
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
    server 192.168.0.3:8000 down; # 不參與負載均衡
    server 192.168.0.4:8001 backup; # 熱備
 }
 
 server {
    listen          80;
    server_name     big.server.com;
    access_log      logs/big.server.access.log main;
     
    charset utf-8;
    client_max_body_size 10M; # 限制用戶上傳文件大小,默認1M
    location / {
      # 使用proxy_pass轉發請求到通過upstream定義的一組應用服務器
      proxy_pass      http://backend_server;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_set_header X-Real-IP  $remote_addr;
    }

?權重(weight)

通過weight指定輪詢幾率,訪問比率與weight成正比,常用于后端服務器性能不均的情況。不怎么忙的服務器可以多承擔些任務。

# 權重,weight越大,承擔任務越多
 upstream backend_server {
    server 192.168.0.1:8000 weight=3;
    server 192.168.0.2:8000 weight=1;
 }

ip_hash

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。

# 權重,weight越大,承擔任務越多
 upstream backend_server {
    ip_hash;
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
 }

url_hash

按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。

 # URL Hash
 upstream backend_server {
    hash $request_uri;
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
 }

fair(第三方)

按后端服務器的響應時間來分配請求,響應時間短的優先分配。使用這個算法需要安裝nginx-upstream-fair這個庫。

# Fair
 upstream backend_server {
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
    fair;
 }

Nginx與uWSGI服務器的溝通

在前面的案例中,Nginx都是使用proxy_pass轉發的動態請求,proxy_pass使用普通的HTTP協議與應用服務器進行溝通。如果你部署的是Python Web應用(Django, Flask), 你的應用服務器(uwsgi, gunicorn)一般是遵守uwsgi協議的,對于這種情況,建議使用uwsgi_pass轉發請求。

如果你部署的是Django或則Flask Web應用,一個完整的nginx配置文件如下所示,可以使用通過uWSGI或gunicorn部署的Python Web項目。

# nginx配置文件,nginx.conf
 # 全局塊
 user www-data;
 worker_processes  2;  ## 默認1,一般建議設成CPU核數1-2倍
 
 # Events塊
 events {
   # 使用epoll的I/O 模型處理輪詢事件。
   # 可以不設置,nginx會根據操作系統選擇合適的模型
   use epoll;
   
   # 工作進程的最大連接數量, 默認1024個
   worker_connections  2048;
   # http層面的keep-alive超時時間
   keepalive_timeout 60;
 }
 http {    
     # 開啟gzip壓縮功能
     gzip on;
     
     # 設置允許壓縮的頁面最小字節數; 這里表示如果文件小于10k,壓縮沒有意義.
     gzip_min_length 10k; 
     # 設置壓縮比率,最小為1,處理速度快,傳輸速度慢;
     # 9為最大壓縮比,處理速度慢,傳輸速度快; 推薦6
     gzip_comp_level 6; 
     # 設置壓縮緩沖區大小,此處設置為16個8K內存作為壓縮結果緩沖
     gzip_buffers 16 8k; 
     # 設置哪些文件需要壓縮,一般文本,css和js建議壓縮。圖片視需要要鎖。
     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
     upstream backend_server {
         server 192.168.0.1:8000; # 替換成應用服務器或容器實際IP及端口
         server 192.168.0.2:8000;
     }
     server {
         listen 80; # 監聽80端口
        # 可以是nginx容器所在ip地址或127.0.0.1,不能寫宿主機外網ip地址
         server_name localhost; 
         charset utf-8;
         client_max_body_size 10M; # 限制用戶上傳文件大小
         
         # 客戶端請求頭部的緩沖區大小
         client_header_buffer_size 2k;
         client_header_timeout 15;
         client_body_timeout 15;
         access_log /var/log/nginx/mysite1.access.log main;
         error_log /var/log/nginx/mysite1.error.log warn;
         # 靜態資源路徑
         location /static {
             alias /usr/share/nginx/html/static; 
         }
         # 媒體資源路徑,用戶上傳文件路徑
         location /media {
             alias /usr/share/nginx/html/media;
         location / {     
             include /etc/nginx/uwsgi_params;
             uwsgi_pass backend_server;   # 使用uwsgi_pass, 而不是proxy_pass
             uwsgi_read_timeout 600; # 指定接收uWSGI應答的超時時間
             uwsgi_connect_timeout 600;  # 指定連接到后端uWSGI的超時時間。
             uwsgi_send_timeout 600; # 指定向uWSGI傳送請求的超時時間
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header Host $http_host;
             proxy_redirect off;
             proxy_set_header X-Real-IP  $remote_addr;

如果你的nginx與uwsgi在同一臺服務器上,用不到負載均衡,你還可以通過本地機器的unix socket進行通信,這樣速度更快,如下所示:

location / {     
     include /etc/nginx/uwsgi_params;
     uwsgi_pass unix:/run/uwsgi/django_test1.sock;
 }

注意:取決于Nginx采用那種方式與uWSGI服務器進行通信(本地socket, 網絡TCP socket和http協議),uWSGI的配置文件也會有所不同。這里以uwsgi.ini為例展示了不同。

uwsgi.ini配置文件

# 對于uwsgi_pass轉發的請求,使用本地unix socket通信
# 僅適用于nginx和uwsgi在同一臺服務器上的情形
socket=/run/uwsgi/django_test1.sock
 
# 對于uwsgi_pass轉發的請求,使用TCP socket通信
socket=0.0.0.0:8000
# 對于proxy_pass HTTP轉發的請求,使用http協議
http=0.0.0.0:8000

小結

本文總結了Nginx常用配置選項,包括url匹配優先級、請求轉發、日志配置、超時配置、靜態文件處理以及負載均衡的各項算法。

原文鏈接:https://blog.csdn.net/qq_41169544/article/details/122676787

欄目分類
最近更新