1. 程式人生 > 其它 >Nginx 常用配置彙總

Nginx 常用配置彙總

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 的書寫順序關係不大)

  1. 精確匹配

    =字首的指令嚴格匹配這個查詢。

    如果找到,停止搜尋。

  2. 普通字元匹配

    所有剩下的常規字串,最長的匹配。

    如果這個匹配使用^〜字首,搜尋停止。

  3. 正則匹配

    正則表示式,在配置檔案中定義的順序,匹配到一個結果,搜尋停止;

  4. 預設匹配

    如果第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寫法,以下的匹配示例成立:

  1. / -> config A:

    精確完全匹配,即使/index.html也匹配不了

  2. /downloads/download.html -> config B:

    匹配B以後,往下沒有任何匹配,採用B

  3. /images/1.gif -> configuration D:

    匹配到F,往下匹配到D,停止往下

  4. /images/abc/def -> config D:

    最長匹配到G,往下匹配D,停止往下你可以看到 任何以/images/開頭的都會匹配到D並停止,FG寫在這裡是沒有任何意義的,H是永遠輪不到的,這裡只是為了說明匹配順序

  5. /documents/document.html -> config C:

    匹配到C,往下沒有任何匹配,採用C

  6. /documents/1.jpg -> configuration E:

    匹配到C,往下正則匹配到E

  7. /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_zonelimit_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伺服器足夠應付實際生產需求了。