nginx配置詳解

nginx是一個功能非常強大的web服務器加反向代理服務器,同時又是郵件服務器等等

在項目使用中,使用最多的三個核心功能是反向代理、負載均衡和靜態服務器

這三個不同的功能的使用,都跟nginx的配置密切相關,nginx服務器的配置信息主要集中在nginx.conf這個配置文件中,并且所有的可配置選項大致分為以下幾個部分

main                                # 全局配置
events {                            # nginx工作模式配置
}
http {                                # http設置
    ....
    server {                        # 服務器主機配置
        ....
        location {                    # 路由配置
            ....
        }
        location path {
            ....
        }
        location otherpath {
            ....
        }
    }
    server {
        ....

        location {
            ....
        }
    }
    upstream name {                    # 負載均衡配置
        ....
    }
}

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

如上述配置文件所示,主要由6個部分組成:

  1. main:用于進行nginx全局信息的配置
  2. events:用于nginx工作模式的配置
  3. http:用于進行http協議信息的一些配置
  4. server:用于進行服務器訪問信息的配置
  5. location:用于進行訪問路由的配置
  6. upstream:用于進行負載均衡的配置

main模塊

觀察下面的配置代碼

# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

上述配置都是存放在main全局配置模塊中的配置項(注釋掉的內容是缺省值)

  • user用來指定nginx worker進程運行用戶以及用戶組,默認nobody賬號運行
  • worker_processes指定nginx要開啟的子進程數量,運行過程中監控每個進程消耗內存(一般幾M~幾十M不等)根據實際情況進行調整,通常數量是CPU內核數量的整數倍
  • error_log定義錯誤日志文件的位置及輸出級別【debug / info / notice / warn / error / crit】
  • pid用來指定進程id的存儲文件的位置
  • worker_rlimit_nofile用于指定一個進程可以打開最多文件數量的描述

event 模塊(工作模式配置)

event {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

上述配置是針對nginx服務器的工作模式的一些操作配置

  • worker_connections 指定最大可以同時接收的連接數量,這里一定要注意,最大連接數量是和worker processes共同決定的。
  • multi_accept 配置指定nginx在收到一個新連接通知后盡可能多的接受更多的連接
  • use epoll 配置指定了線程輪詢的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac請使用Kqueue

http模塊

作為web服務器,http模塊是nginx最核心的一個模塊,配置項也是比較多的,項目中會設置到很多的實際業務場景,需要根據硬件信息進行適當的配置,常規情況下,使用默認配置即可!

http {
    ##
    # 基礎配置
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL證書配置
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # 日志配置
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip 壓縮配置
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript
 text/xml application/xml application/xml+rss text/javascript;

    ##
    # 虛擬主機配置
    ##

    include /etc/nginx/conf.d/*.conf;#引入依.conf為后綴的配置文件
    include /etc/nginx/sites-enabled/*;#引入文件夾下的所有文件

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

配置說明
  1. 基礎配置

sendfile on: 配置on讓sendfile發揮作用,將文件的回寫過程交給數據緩沖去去完成,而不是放在應用中完成,這樣的話在性能提升有有好處
tc_nopush on: 讓nginx在一個數據包中發送所有的頭文件,而不是一個一個單獨發
tcp_nodelay on: 讓nginx不要緩存數據,而是一段一段發送,如果數據的傳輸有實時性的要求的話可以配置它,發送完一小段數據就立刻能得到返回值,但是不要濫用哦

keepalive_timeout 10: 給客戶端分配連接超時時間,服務器會在這個時間過后關閉連接。一般設置時間較短,可以讓nginx工作持續性更好
client_header_timeout 10: 設置請求頭的超時時間
client_body_timeout 10: 設置請求體的超時時間
send_timeout 10: 指定客戶端響應超時時間,如果客戶端兩次操作間隔超過這個時間,服務器就會關閉這個鏈接

limit_conn_zone $binary_remote_addr zone=addr:5m : 設置用于保存各種key的共享內存的參數,
limit_conn addr 100: 給定的key設置最大連接數

server_tokens: 雖然不會讓nginx執行速度更快,但是可以在錯誤頁面關閉nginx版本提示,對于網站安全性的提升有好處哦
include /etc/nginx/mime.types: 指定在當前文件中包含另一個文件的指令
default_type application/octet-stream: 指定默認處理的文件類型可以是二進制
type_hash_max_size 2048: 混淆數據,影響三列沖突率,值越大消耗內存越多,散列key沖突率會降低,檢索速度更快;值越小key,占用內存較少,沖突率越高,檢索速度變慢

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

  1. 日志配置

access_log logs/access.log: 設置存儲訪問記錄的日志
error_log logs/error.log: 設置存儲記錄錯誤發生的日志

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

  1. SSL證書加密

ssl_protocols: 指令用于啟動特定的加密協議,nginx在1.1.13和1.0.12版本后默認是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 現在還有很多地方在用但有不少被攻擊的漏洞。
ssl prefer server ciphers: 設置協商加密算法時,優先使用我們服務端的加密套件,而不是客戶端瀏覽器的加密套件

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

  1. 壓縮配置

gzip on: 采用gzip壓縮的形式發送數據。這將會減少我們發送的數據量。
gzip_disable 為指定的客戶端禁用gzip功能。我們設置成IE6或者更低版本以使我們的方案能夠廣泛兼容。
gzip_static 告訴nginx在壓縮資源之前,先查找是否有預先gzip處理過的資源。這要求你預先壓縮你的文件(在這個例子中被注釋掉了),從而允許你使用最高壓縮比,這樣nginx就不用再壓縮這些文件了(想要更詳盡的gzip_static的信息,請點擊這里)。
gzip_proxied 允許或者禁止壓縮基于請求和響應的響應流。我們設置為any,意味著將會壓縮所有的請求。
gzip_min_length 設置對數據啟用壓縮的最少字節數。如果一個請求小于1000字節,我們最好不要壓縮它,因為壓縮這些小的數據會降低處理此請求的所有進程的速度。
gzip_comp_level 設置數據的壓縮等級。這個等級可以是1-9之間的任意數值,9是最慢但是壓縮比最大的。我們設置為4,這是一個比較折中的設置。
gzip_types 設置需要壓縮的數據格式。

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

  1. 文件緩存配置

open_file_cache 打開緩存的同時也指定了緩存最大數目,以及緩存的時間。我們可以設置一個相對高的最大時間,這樣我們可以在它們不活動超過20秒后清除掉。
open_file_cache_valid 在open_file_cache中指定檢測正確信息的間隔時間。
open_file_cache_min_uses 定義了open_file_cache中指令參數不活動時間期間里最小的文件數。
open_file_cache_errors 指定了當搜索一個文件時是否緩存錯誤信息,也包括再次給配置中添加文件。我們也包括了服務器模塊,這些是在不同文件中定義的。如果你的服務器模塊不在這些位置,你就得修改這一行來指定正確的位置。

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

server模塊

srever模塊配置是http模塊中的一個子模塊,用來定義一個虛擬訪問主機,也就是一個虛擬服務器的配置信息

server {
    listen        80;#加IP指定IP才能訪問該server
    server_name localhost    192.168.1.100;
    root        /nginx/www;
    index        index.php index.html index.html;
    charset        utf-8;
    access_log    logs/access.log;
    error_log    logs/error.log;
    ......
}

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

核心配置信息如下:

  • server:一個虛擬主機的配置,一個http中可以配置多個server
  • server_name: 指定ip地址或者域名,多個配置之間用空格分隔
  • root:表示整個server虛擬主機內的根目錄,所有當前主機中web項目的根目錄
  • index:用戶訪問web網站時的全局首頁
  • charset:用于設置www/路徑中配置的網頁的默認編碼格式
  • access_log:用于指定該虛擬主機服務器中的訪問記錄日志存放路徑
  • error_log:用于指定該虛擬主機服務器中訪問錯誤日志的存放路徑

location模塊

location模塊是nginx配置中出現最多的一個配置,主要用于配置路由訪問信息

在路由訪問信息配置中關聯到反向代理、負載均衡等等各項功能,所以location模塊也是一個非常重要的配置模塊,

location分為兩類:普通location和正則location。普通 location ”是以“ = ”或“ ^~ ”為前綴或者沒有任何前綴的 /uri/,包括“/”;“正則 location ”是以“ ~ ”或“ ~* ”為前綴的 /uri/ 。

基本配置

location /api {
    root  /nginx/www;
    index  index.php index.html index.htm;
}

語法規則: location [=||*|^~] /uri/ { … }

= 開頭表示精確匹配

^~ 開頭表示uri以某個常規字符串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。

~ 開頭表示區分大小寫的正則匹配

~* 開頭表示不區分大小寫的正則匹配

!和!*分別為區分大小寫不匹配及不區分大小寫不匹配 的正則

/ 通用匹配,任何請求都會匹配到。

多個location配置的情況下匹配順序為(參考資料而來,還未實際驗證,試試就知道了,不必拘泥,僅供參考):

首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最后是交給 / 通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求。

location /**:表示匹配訪問根目錄

root:用于指定訪問根目錄時,訪問虛擬主機的web目錄

index:在不指定訪問具體資源時,默認展示的資源文件列表

反向代理配置方式

通過反向代理代理服務器訪問模式,通過proxy_set配置讓客戶端訪問透明化

location / {
    proxy_pass http://localhost:8888;
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header Host $http_host;
}

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

uwsgi配置

wsgi模式下的服務器配置訪問方式

location / {
    include uwsgi_params;
    uwsgi_pass localhost:8888
}

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

反向代理配置:

 location /rainbow {
     rewrite  ^/rainbow/(.*)$ /$1 break;
     #設置請求頭
     proxy_set_header Host $host;
     proxy_set_header User-Agent $http_user_agent;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Fowarded-For $remote_addr;#獲取用戶真實IP
     proxy_set_header authorization $http_authorization;
     proxy_pass http://rainbow;#請求轉向myserver 定義的服務器列表
 }


其它配置:

proxy_connect_timeout 180: nginx跟后端服務器連接超時時間(代理連接超時)

proxy_send_timeout 180: 后端服務器數據回傳時間(代理發送超時)

proxy_read_timeout 180: 連接成功后,后端服務器響應時間(代理接收超時)

proxy_buffer_size 4k: 設置代理服務器(nginx)保存用戶頭信息的緩沖區大小

proxy_buffers 4 32k: proxy_buffers緩沖區,網頁平均在32k以下的話,這樣設置

proxy_busy_buffers_size 64k: 高負荷下緩沖大小(proxy_buffers*2)

proxy_temp_file_write_size 64k: 設定緩存文件夾大小,大于這個值,將從upstream服務器傳

詳情: https://blog.csdn.net/qq_33404395/article/details/80523850

upstream模塊

upstream模塊主要負責負載均衡的配置,通過默認的輪詢調度方式來分發請求到后端服務器

簡單的配置方式如下:

upstream name {
    ip_hash;
    server 192.168.1.100:8000;
    server 192.168.1.100:8001 down;
    server 192.168.1.100:8002 max_fails=3;
    server 192.168.1.100:8003 fail_timeout=20s;
    server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}

![點擊并拖拽以移動](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)

核心配置信息如下

ip_hash:指定請求調度算法,默認是weight權重輪詢調度,可以指定

server host:port:分發服務器的列表配置

-- down:表示該主機暫停服務

-- max_fails:表示失敗最大次數,超過失敗最大次數暫停服務

-- fail_timeout:表示如果請求受理失敗,暫停指定的時間之后重新發起請求

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • nginx概述 nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、PO...
    逝者如斯灬閱讀 3,445評論 0 16
  • 轉載:http://www.cnblogs.com/crazylqy/p/7149774.html 一、 Ngin...
    SkTj閱讀 506評論 0 0
  • Nginx是輕量級的高性能Web服務器,提供了諸如HTTP代理和反向代理、負載均衡、緩存等一系列重要特性,因而在實...
    linux服務器開發閱讀 1,319評論 0 1
  • 1 之前是要睡兩天,現在是要做的事情多了。 總之,周末永遠過得比平時快。 看完一本書,做完一套試題,整理知識點,看...
    柒諾閱讀 638評論 5 3
  • 過年 就是撲騰一年 圍在一起的年夜飯
    飄逸的云5812閱讀 248評論 2 12