Nginx 常用配置彙總
眾所周知,Nginx 是 Apache服務不錯的替代品。其特點是佔有記憶體少,併發能力強,事實上 Nginx 的併發能力在同類型的網頁伺服器中表現較好,因此國內知名大廠例如:淘寶,京東,百度,新浪,網易,騰訊等等都在使用Nginx網站
Nginx簡介
nginx 是開源、高效能、高可靠的 Web 和反向代理伺服器,而且支援熱部署,同時也提供了 IMAP/POP3/SMTP 服務,可以不間斷執行,提供熱更新功能。佔用記憶體少、併發能力強,最重要的是,Nginx 是免費的並可以商業化,配置使用都比較簡單。
Nginx 特點
-
高併發、高效能
-
模組化架構使得它的擴充套件性非常好
-
非同步非阻塞的事件驅動模型這點和 Node.js 相似
-
無需重啟可不間斷執行
-
熱部署、平滑升級
-
完全開源,生態好
Nginx 最重要的幾個使用場景:
-
靜態資源服務
-
反向代理服務,包括快取、負載均衡等
-
API 服務,OpenResty
所以,今天民工哥就給大家整理一份nginx 的常用配置清單,供大家學習與生產配置參考使用。主要包括以下三個方面:
-
基礎配置
-
高階配置
-
安全配置
基礎配置
去掉不用的 Nginx 模組
./configure --without-module1 --without-module2 --without-module3
例如:
./configure --without-http_dav_module --withouthttp_spdy_module
#注意事項:配置指令是由模組提供的。確保你禁用的模組不包含你需要使用的指令!在決定禁用模組之前,應該檢查Nginx文件中每個模組可用的指令列表。
Nginx 版本的平滑升級與回滾
程序相關的配置
worker_processes 8;
#Nginx 程序數,建議按照CPU數目來指定,一般為它的倍數 (如,2個四核的CPU計為8)。
worker_rlimit_nofile 65535;
#一個Nginx 程序開啟的最多檔案描述符數目
worker_connections 65535;
#每個程序允許的最多連線數
監聽埠
server {
listen 80; #監聽埠
server_name www.mingongge.com; #域名資訊
location / {
root /www/www; #網站根目錄
index index.html index.htm; #預設首頁型別
deny 192.168.2.11; #禁止訪問的ip地址,可以為all
allow 192.168.3.44; #允許訪問的ip地址,可以為all
}
}
小技巧補充:域名匹配的四種寫法
精確匹配:server_name www.mingongge.com ;
左側通配:server_name *.mingongge.com ;
右側統配:server_name www.mingongge.* ;
正則匹配:server_name ~^www\.mingongge\.*$ ;
匹配優先順序:精確匹配 > 左側萬用字元匹配 > 右側萬用字元匹配 > 正則表示式匹配
配置 Nginx 狀態頁面
[root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf
… …
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
… …
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
Nginx 日誌(訪問與錯誤日誌管理)
error_log /var/log/nginx/error.log warn;
#配置錯誤日誌的級別及儲存目錄
events {
worker_connections 1024;
}
http {
..................
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#配置日誌的模式
access_log /var/log/nginx/access.log main;
#配置訪問日誌儲存目錄
}
以上配置只是Nginx自身關於日誌的基本配置,在實際生產環境中,我們需要收集日誌、分析日誌,才定更好的去定位問題
採集nginx日誌(filebeat,logstash,rsyslog)
http 相關的配置
http {
sendfile on #高效傳輸檔案的模式 一定要開啟
keepalive_timeout 65 #客戶端服務端請求超時時間
}
靜態資源配置
server {
listen 80;
server_name mingongge.com;
location /static {
root /wwww/web/web_static_site;
}
}
也可以使用下面的方法
location /image {
alias /web/nginx/static/image/;
}
注意:使用alias末尾一定要新增/,並且它只能位於location中
反向代理
比如生產環境(同一臺服務中)有不同的專案,這個就比較實用了,用反向代理去做請示轉發。
http {
.............
upstream product_server{
127.0.0.1:8081;
}
upstream admin_server{
127.0.0.1:8082;
}
upstream test_server{
127.0.0.1:8083;
}
server {
#預設指向product的server
location / {
proxy_pass http://product_server;
}
location /product/{
proxy_pass http://product_server;
}
location /admin/ {
proxy_pass http://admin_server;
}
location /test/ {
proxy_pass http://test_server;
}
}
}
location 路徑匹配
2.1 匹配規則:
location 路徑正則匹配:
符號 | 說明 |
---|---|
~ |
正則匹配,區分大小寫 |
~* |
正則匹配,不區分大小寫 |
^~ |
普通字元匹配,如果該選項匹配,則,只匹配改選項,不再向下匹配其他選項 |
= |
普通字元匹配,精確匹配 |
@ |
定義一個命名的 location,用於內部定向,例如 error_page,try_files |
匹配優先順序:
路徑匹配,優先順序:(跟 location 的書寫順序關係不大)
-
精確匹配:
=
字首的指令嚴格匹配這個查詢。如果找到,停止搜尋。
-
普通字元匹配:
所有剩下的常規字串,最長的匹配。
如果這個匹配使用
^〜
字首,搜尋停止。 -
正則匹配:
正則表示式,在配置檔案中定義的順序,匹配到一個結果,搜尋停止;
-
預設匹配:
如果第3條規則產生匹配的話,結果被使用。
否則,如同從第2條規則被使用。
2.3 舉例
通過一個例項,簡單說明一下匹配優先順序:
location = / { # 精確匹配 / ,主機名後面不能帶任何字串 [ configuration A ]}location / { # 因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求 # 但是正則和最長字串會優先匹配 [ configuration B ]}location /documents/ { # 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜尋 # 只有後面的正則表示式沒有匹配到時,這一條才會採用這一條 [ configuration C ]}location ~ /documents/Abc { # 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜尋 # 只有後面的正則表示式沒有匹配到時,這一條才會採用這一條 [ configuration CC ]}location ^~ /images/ { # 匹配任何以 /images/ 開頭的地址,匹配符合以後,停止往下搜尋正則,採用這一條。 [ configuration D ]}location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 結尾的請求 # 然而,所有請求 /images/ 下的圖片會被 config D 處理,因為 ^~ 到達不了這一條正則 [ configuration E ]}location /images/ { # 字元匹配到 /images/,繼續往下,會發現 ^~ 存在 [ configuration F ]}location /images/abc { # 最長字元匹配到 /images/abc,繼續往下,會發現 ^~ 存在 # F與G的放置順序是沒有關係的 [ configuration G ]}location ~ /images/abc/ { # 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續往下搜尋,匹配到這一條正則,採用 [ configuration H ]}location ~* /js/.*/\.js
按照上面的location寫法,以下的匹配示例成立:
-
/
-> config A:精確完全匹配,即使/index.html也匹配不了
-
/downloads/download.html
-> config B:匹配B以後,往下沒有任何匹配,採用B
-
/images/1.gif
-> configuration D:匹配到F,往下匹配到D,停止往下
-
/images/abc/def
-> config D:最長匹配到G,往下匹配D,停止往下你可以看到 任何以/images/開頭的都會匹配到D並停止,FG寫在這裡是沒有任何意義的,H是永遠輪不到的,這裡只是為了說明匹配順序
-
/documents/document.html
-> config C:匹配到C,往下沒有任何匹配,採用C
-
/documents/1.jpg
-> configuration E:匹配到C,往下正則匹配到E
-
/documents/Abc.jpg
-> config CC:最長匹配到C,往下正則順序匹配到CC,不會往下到E
負載均衡
upstream server_pools {
server 192.168.1.11:8880 weight=5;
server 192.168.1.12:9990 weight=1;
server 192.168.1.13:8989 weight=6;
#weigth引數表示權值,權值越高被分配到的機率越大
}
server {
listen 80;
server_name mingongge.com;
location / {
proxy_pass http://server_pools;
}
}
代理相關的其它配置
proxy_connect_timeout 90; #nginx跟後端伺服器連線超時時間(代理連線超時)
proxy_send_timeout 90; #後端伺服器資料回傳時間(代理髮送超時)
proxy_read_timeout 90; #連線成功後,後端伺服器響應時間(代理接收超時)
proxy_buffer_size 4k; #代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小
proxy_buffers 4 32k; #proxy_buffers緩衝區
proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #設定快取資料夾大小
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr; #獲取客戶端真實IP
高階配置
重定向配置
location / {
return 404; #直接返回狀態碼
}
location / {
return 404 "pages not found"; #返回狀態碼 + 一段文字
}
location / {
return 302 /blog ; #返回狀態碼 + 重定向地址
}
location / {
return https://www.mingongge.com ; #返回重定向地址
}
示例如下
server {
listen 80;
server_name www.mingongge.com;
return 301 http://mingongge.com$request_uri;
}
server {
listen 80;
server_name www.mingongge.com;
location /cn-url {
return 301 http://mingongge.com.cn;
}
}
server{
listen 80;
server_name mingongge.com; # 要在本地hosts檔案進行配置
root html;
location /search {
rewrite ^/(.*) https://www.mingongge.com redirect;
}
location /images {
rewrite /images/(.*) /pics/$1;
}
location /pics {
rewrite /pics/(.*) /photos/$1;
}
location /photos {
}
}
設定緩衝區容量上限
這樣的設定可以阻止緩衝區溢位攻擊(同樣是Server模組)
client_body_buffer_size 1k;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
#設定後,不管多少HTTP請求都不會使伺服器系統的緩衝區溢位了
限制最大連線數
在http模組內server模組外配置limit_conn_zone,配置連線的IP,在http,server或location模組配置limit_conn,能配置IP的最大連線數。
limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 1;
Gzip壓縮
gzip_types
#壓縮的檔案型別
text/plain text/css
application/json
application/x-javascript
text/xml application/xml
application/xml+rss
text/javascript
gzip on;
#採用gzip壓縮的形式傳送資料
gzip_disable "msie6"
#為指定的客戶端禁用gzip功能
gzip_static;
#壓縮前查詢是否有預先gzip處理過的資源
gzip_proxied any;
#允許或者禁止壓縮基於請求和響應的響應流
gzip_min_length 1000;
#設定對資料啟用壓縮的最少位元組數
gzip_comp_level 6;
#設定資料的壓縮等級
快取配置
open_file_cache
#指定快取最大數目以及快取的時間
open_file_cache_valid
#在open_file_cache中指定檢測正確資訊的間隔時間
open_file_cache_min_uses
#定義了open_file_cache中指令引數不活動時間期間裡最小的檔案數
open_file_cache_errors
#指定了當搜尋一個檔案時是否快取錯誤資訊
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
#指定快取檔案的型別
{
expires 3650d;
#指定快取時間
}
location ~ .*\.(js|css)?$
{
expires 3d;
}
SSL 證書配及跳轉HTTPS配置
server {
listen 192.168.1.250:443 ssl;
server_tokens off;
server_name mingonggex.com www.mingonggex.com;
root /var/www/mingonggex.com/public_html;
ssl_certificate /etc/nginx/sites-enabled/certs/mingongge.crt;
ssl_certificate_key /etc/nginx/sites-enabled/certs/mingongge.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
# Permanent Redirect for HTTP to HTTPS
server
{
listen 80;
server_name mingongge.com;
https://$server_name$request_uri;
}
流量映象功能
location / {
mirror /mirror;
proxy_pass http://backend;
}
location = /mirror {
internal;
proxy_pass http://test_backend$request_uri;
}
限流功能
流量限制配置兩個主要的指令,limit_req_zone
和limit_req
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location /login/ {
limit_req zone=mylimit;
proxy_pass http://my_upstream;
}
}
Nginx常用的內建變數
安全配置
禁用server_tokens項
server_tokens在開啟的情況下會使404頁面顯示Nginx的當前版本號。這樣做顯然不安全,因為黑客會利用此資訊嘗試相應Nginx版本的漏洞。只需要在nginx.conf中http模組設定server_tokens off即可,例如:
server {
listen 192.168.1.250:80;
Server_tokens off;
server_name mingongge.com www.mingongge.com;
access_log /var/www/logs/mingongge.access.log;
error_log /var/www/logs/mingonggex.error.log error;
root /var/www/mingongge.com/public_html;
index index.html index.htm;
}
#重啟Nginx後生效:
禁止非法的HTTP User Agents
User Agent是HTTP協議中對瀏覽器的一種標識,禁止非法的User Agent可以阻止爬蟲和掃描器的一些請求,防止這些請求大量消耗Nginx伺服器資源。
為了更好的維護,最好建立一個檔案,包含不期望的user agent列表例如/etc/nginx/blockuseragents.rules包含如下內容:
map $http_user_agent $blockedagent {
default 0;
~*malicious 1;
~*bot 1;
~*backdoor 1;
~*crawler 1;
~*bandit 1;
}
然後將如下語句放入配置檔案的server模組內
include /etc/nginx/blockuseragents.rules;並加入if語句設定阻止後進入的頁面:
阻止圖片外鏈
location /img/ {
valid_referers none blocked 192.168.1.250;
if ($invalid_referer) {
return 403;
}
}
封殺惡意訪問
禁掉不需要的 HTTP 方法
一些web站點和應用,可以只支援GET、POST和HEAD方法。在配置檔案中的 serve r模組加入如下方法可以阻止一些欺騙攻擊
if ($request_method !~ ^(GET|HEAD|POST)$) { return 444;}
禁止 SSL 並且只打開 TLS
儘量避免使用SSL,要用TLS替代,以下配置可以放在Server模組內
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
通過這一系列的配置之後,相信你的Nginx伺服器足夠應付實際生產需求了。