網站首頁 編程語言 正文
接下來,我們仔細分析下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
相關推薦
- 2022-09-02 Qt為exe添加ico圖片的簡單實現步驟_C 語言
- 2022-03-23 C語言實現打印楊輝三角的方法詳細(三種方法)_C 語言
- 2022-10-11 RabbitMQ:生產者消息確認、消息持久化、消費者消息確認、消費失敗重試機制
- 2022-10-11 Android獲取Apk使用信息
- 2023-03-03 詳解Flask框架中Flask-Login模塊的使用_python
- 2023-12-13 Excel統計某個關鍵字出現的次數
- 2022-06-11 Python?tkinter庫圖形繪制例子分享_python
- 2023-06-16 C語言函數調用底層實現原理分析_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支