Linux下玩轉nginx系列(二)——nginx配置檔案說明
nginx 檔案結構
... # main全域性塊 events { #events塊 ... } http #http塊 { ... #http全域性塊 server #server塊 { ... #server全域性塊 location [PATTERN] #location塊 { ... } location [PATTERN] { ... } } server { ... } ... #http全域性塊 }
· main全域性塊: 配置影響nginx全域性的指令。一般有執行nginx伺服器的使用者組,nginx程式pid存放路徑,日誌存放路徑,配置檔案引入,允許生成worker process數等。
· events塊 :配置影響nginx伺服器或與使用者的網路連線。有每個程式的最大連線數,選取哪種事件驅動模型處理連線請求,是否允許同時接受多個網路連線,開啟多個網路連線序列化等。
· http塊 :可以巢狀多個server,配置代理,快取,日誌定義等絕大多數功能和第三方模組的配置。如檔案引入,mime-type定義,日誌自定義,是否使用sendfile傳輸檔案,連線超時時間,單連線請求數等。
· server塊 :配置虛擬主機的相關引數,一個http中可以有多個server。
· location塊 :配置請求的路由,以及各種頁面的處理情況。
main全域性配置
nginx在執行時與具體業務功能(比如http服務或者email服務代理)無關的一些引數,比如工作程式數,執行的身份等。
user www www; worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; error_log /var/logs/nginx_error.log crit; pid /usr/local/nginx/nginx.pid; worker_rlimit_nofile 65535;
· user www www;: 指定nginx程式使用什麼使用者啟動
· worker_processes 4; : 指定啟動多少程式來處理請求,一般情況下設定成CPU的核數,如果開啟了ssl和gzip更應該設定成與邏輯CPU數量一樣甚至為2倍,可以減少I/O操作。使用grep ^processor /proc/cpuinfo | wc -l檢視CPU核數。
· worker_cpu_affinity 0001 0010 0100 1000;: 在高併發情況下,通過設定將CPU和具體的程式繫結來降低由於多核CPU切換造成的暫存器等現場重建帶來的效能損耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。
· error_log /var/logs/nginx_error.log crit;: error_log是個主模組指令,用來定義全域性錯誤日誌檔案。日誌輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日誌最為最詳細,而crit輸出日誌最少。
· pid /usr/local/nginx/nginx.pid;: 指定程式pid檔案的位置。
· worker_rlimit_nofile 65535;: 用於指定一個nginx程式可以開啟的最多檔案描述符數目,這裡是65535,需要使用命令“ulimit -n 65535”來設定。
events模組
events{ use epoll; worker_connections 65536; }
· use epoll; use是個事件模組指令,用來指定Nginx的工作模式。Nginx支援的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中。對於Linux系統,epoll工作模式是首選。在作業系統不支援這些高效模型時才使用select。
· worker_connections 65536;每一個worker程式能併發處理(發起)的最大連線數(包含與客戶端或後端被代理伺服器間等所有連線數)。nginx作為反向代理伺服器,計算公式 最大連線數 = worker_processes * worker_connections/4,所以這裡客戶端最大連線數是65536,這個可以增到到8192都沒關係,看情況而定,但不能超過後面的worker_rlimit_nofile。當nginx作為http伺服器時,計算公式裡面是除以2。程式的最大連線數受Linux系統程式的最大開啟檔案數限制,在執行作業系統命令ulimit -n 65536後worker_connections的設定才能生效。
http模組
http { include mime.types; default_type application/octet-stream; #charset gb2312; }
· include是個主模組指令,實現對配置檔案所包含的檔案的設定,可以減少主配置檔案的複雜度。類似於Apache中的include方法。
· default_type屬於HTTP核心模組指令,這裡設定預設型別為二進位制流,也就是當檔案型別未定義時使用這種方式,例如在沒有配置PHP環境時,Nginx是不予解析的,此時,用瀏覽器訪問PHP檔案就會出現下載視窗。
· charset gb2312; 指定客戶端編碼格式。
http引數之客戶端head快取
server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 128k; client_max_body_size 10m; client_body_buffer_size 128k; sendfile on ; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65 : client_body_timeout 60s; send_timeout 60s;
· server_names_hash_bucket_size 128;: 伺服器名字的hash表大小。
· client_header_buffer_size 32k;:用來指定來自客戶端請求頭的header buffer 大小。對於大多數請求,1K的快取已經足夠了,如果自定義了訊息頭或有更大的cookie,可以增大快取區大小。
· large_client_header_buffers 4 128k;:用來指定客戶端請求中較大的訊息頭的快取最大數量和大小,4為個數,128k為大小,最大快取為4個128KB。
· client_max_body_size 8m; : 客戶端請求的最大的單個檔案位元組數。
· client_max_body_size 10m; : 允許客戶端請求的最大單檔案位元組數。如果有上傳較大檔案,請設定它的限制值。
· client_body_buffer_size 128k;: 緩衝區代理緩衝使用者端請求的最大位元組數。
· sendfile on ; : 開啟高效檔案傳輸模式,sendfile指令指定nginx是否呼叫sendfile函式來輸出檔案,減少使用者空間到核心空間的上下文切換。對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。開啟 tcp_nopush on; 和tcp_nodelay on; 防止網路阻塞。
· keepalive_timeout 65 : : 長連線超時時間,單位是秒,這個引數很敏感,涉及瀏覽器的種類、後端伺服器的超時設定、作業系統的設定,可以另外起一片文章了。長連線請求大量小檔案的時候,可以減少重建連線的開銷,但假如有大檔案上傳,65s內沒上傳完成會導致失敗。如果設定時間過長,使用者又多,長時間保持連線會佔用大量資源。
· client_body_timeout 60s; : 用於設定客戶端請求主體讀取超時時間,預設是60s。如果超過這個時間,客戶端還沒有傳送任何資料,nginx將返回Request time out(408)錯誤。
· send_timeout : : 用於指定響應客戶端的超時時間。這個超時僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連線。
http引數之FastCGI引數
FastCGI相關引數是為了改善網站的效能:減少資源佔用,提高訪問速度。下面引數看字面意思都能理解。
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_cache TEST; fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m;
· fastcgi_connect_timeout 300; 指定連線到後端FastCGI的超時時間。
· fastcgi_send_timeout 300;指定向FastCGI傳送請求的超時時間,這個值是已經完成兩次握手後向FastCGI傳送請求的超時時間。
· fastcgi_read_timeout 300;指定接收FastCGI應答的超時時間,這個值是已經完成兩次握手後接收FastCGI應答的超時時間。
· fastcgi_buffer_size 64k; 用於指定讀取FastCGI應答第一部分需要多大的緩衝區,這個值表示將使用1個64KB的緩衝區讀取應答的第一部分(應答頭),可以設定為fastcgi_buffers選項指定的緩衝區大小。
· fastcgi_buffers 4 64k; 指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求。如果一個PHP指令碼所產生的頁面大小為256KB,那麼會為其分配4個64KB的緩衝區來快取;如果頁面大小大於256KB,那麼大於256KB的部分會快取到fastcgi_temp指定的路徑中,但是這並不是好方法,因為記憶體中的資料處理速度要快於硬碟。一般這個值應該為站點中PHP指令碼所產生的頁面大小的中間值,如果站點大部分指令碼所產生的頁面大小為256KB,那麼可以把這個值設定為“16 16k”、“4 64k”等。
· fastcgi_busy_buffers_size 128k; 預設值是fastcgi_buffers的兩倍。
· fastcgi_temp_file_write_size 128k; 表示在寫入快取檔案時使用多大的資料塊,預設值是fastcgi_buffers的兩倍。
· fastcgi_cache TEST; 表示開啟FastCGI快取併為其指定一個名稱。開啟快取非常有用,可以有效降低CPU的負載,並且防止502錯誤的發生。但是開啟快取也會引起很多問題,要視具體情況而定。
· fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; FastCGI快取指定一個檔案路徑、目錄結構等級、關鍵字區域儲存時間和非活動刪除時間。
· fastcgi_cache_valid 200 302 1h; 用來指定應答程式碼的快取時間。例項中的值表示將200和302應答快取一個小時,將301應答快取1天,其他應答均快取1分鐘。
ttp引數之gzip模組設定
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; gzip_vary on;
· gzip on;開啟gzip壓縮輸出
· gzip_min_length 1k; 最小壓縮檔案大小,頁面位元組數從header頭的Content-Length中獲取。預設值為0,不管多大頁面都壓縮,建議設定成大於1K的位元組數,小於1K可能會越壓越大。
· gzip_buffers 4 16k; 壓縮緩衝區,表示申請四個16K的記憶體作為壓縮結果流快取,預設是申請與原始資料大小相同的記憶體空間來儲存gzip壓縮結果。
· gzip_http_version 1.1; 用於設定識別HTTP協議版本,預設是1.1,目前主流瀏覽器都已成指出。(預設1.1,前端如果是squid2.5請使用1.0)
· gzip_comp_level 6; 壓縮等級,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,但是消耗CPU資源。
· gzip_types text/plain application/x-javascript text/css application/xml;壓縮型別,預設就已經包含text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。
· gzip_vary on; 和http頭有關係,會在響應頭加個 Vary: Accept-Encoding ,可以讓前端的快取伺服器快取經過gzip壓縮的頁面,例如,用Squid快取經過Nginx壓縮的資料。
· gzip_proxied any; Nginx作為反向代理的時候啟用,決定開啟或者關閉後端伺服器返回的結果是否壓縮,匹配的前提是後端伺服器必須要返回包含”Via”的 header頭。
· limit_zone crawler $binary_remote_addr 10m; 開啟限制IP連線數的時候需要使用
server模組
nginx 配置server模組
配置server模組流程
1. 複製一段完整的server標籤段,到結尾。注意:要放在http的結束大括號前,也就是server標籤段放入http標籤。
2. 更改server_name 及對應網頁的root根目錄。
3. 檢查配置檔案語法,平滑重啟服務。
4. 建立server_name 對應網頁的根目錄,並且建立測試檔案,如果沒有index首頁會出現403錯誤。
5. 對客戶端server_name 的主機做host 解析或DNS配置。並檢查(ping)。
6. 瀏覽器訪問,或者在Linux客戶端做host解析,用wget或curl 訪問。
http服務上支援若干虛擬主機(server模組)。每個虛擬主機一個對應的server配置項,配置項裡面包含該虛擬主機相關的配置。在提供mail服務的代理時,也可以建立若干server。每個server通過監聽地址或埠來區分。
server { listen 80 default; server_name _; index index.html index.htm index.php; root /data/anyrtc/www; #server_name_in_redirect off; location ~ .*\.(php|php5)?$ { #fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 1h; } }
· listen 80; 監聽埠,預設80,小於1024的要以root啟動。可以為listen *:80、listen 127.0.0.1:80等形式。
· server_name test.example.com; 伺服器名,如localhost、,可以通過正則匹配。
· root /var/www/html 定義伺服器的預設網站根目錄位置。如果locationURL匹配的是子目錄或檔案,root沒什麼作用,一般放在server指令裡面或/下。
· index index.jsp index.html index.htm 定義路徑下預設訪問的檔名,一般跟著root放。
sever模組下location模組的寫法
proxy_pass http:/backend
請求轉向backend定義的伺服器列表,即反向代理,對應upstream負載均衡器。也可以 proxy_pass 。
proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location的簡單設定方法可以暫且這樣設定,深入研究請期待小編接下來關於nginx的使用中的負載均衡的相關文章。
其它nginx引數
訪問控制 allow/deny
Nginx 的訪問控制模組預設就會安裝,而且寫法也非常簡單,可以分別有多個allow,deny,允許或禁止某個ip或ip段訪問,依次滿足任何一個規則就停止往下匹配。如:
location /nginx-status { stub_status on; access_log off; # auth_basic "NginxStatus"; # auth_basic_user_file /usr/local/nginx-1.21.6/htpasswd; allow 192.168.1.10; allow 172.16.8.0/24; deny all; }
我們也常用 httpd-devel 工具的 htpasswd 來為訪問的路徑設定登入密碼:
# htpasswd -c htpasswd admin New passwd: Re-type new password: Adding password for user admin # htpasswd htpasswd admin //修改admin密碼 # htpasswd htpasswd anyrtc //多新增一個認證使用者
這樣就生成了預設使用CRYPT加密的密碼檔案。開啟上面nginx-status的兩行註釋,重啟nginx生效。
列出目錄 autoindex
Nginx預設是不允許列出整個目錄的。如需此功能,開啟nginx.conf檔案,在location,server 或 http段中加入如下引數:
location /images { root /var/www/nginx-default/images; autoindex on; autoindex_exact_size off; autoindex_localtime on; }
· autoindex on;執行列出目錄內容。另外兩個引數最好也加上去。
· autoindex_exact_size off; 預設為on,顯示出檔案的確切大小,單位是bytes。改為off後,顯示出檔案的大概大小,單位是kB或者MB或者GB。
· autoindex_localtime on; 預設為off,顯示的檔案時間為GMT時間。改為on後,顯示的檔案時間為檔案的伺服器時間。
常見nginx配置注意事項
上面描述是nginx的基本配置,需要注意的有以下幾點:
1、常見配置項:
· 1.$remote_addr 與 $http_x_forwarded_for 用以記錄客戶端的ip地址;
· 2.$remote_user:用來記錄客戶端使用者名稱稱;
· 3.$time_local:用來記錄訪問時間與時區;
· 4.$request:用來記錄請求的url與http協議;
· 5.$status:用來記錄請求狀態;成功是200;
· 6.$body_bytes_sent:記錄傳送給客戶端檔案主體內容大小;
· 7.$http_referer:用來記錄從那個頁面連結訪問過來的;
· 8.$http_user_agent:記錄客戶端瀏覽器的相關資訊;
2、驚群現象:一個網路連線到來,多個睡眠的程式被同時叫醒,但只有一個程式能獲得連結,這樣會影響系統效能。
3、每個指令必須有分號結束。
完整可用的配置檔案
user www www; worker_processes 4; error_log logs/error.log; pid logs/nginx.pid; events { use epoll; worker_connections 2048; } http { include mime.types; default_type application/octet-stream; sendfile on; # tcp_nopush on; keepalive_timeout 65; # gzip壓縮功能設定 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; gzip_vary on; # http_proxy 設定 client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 75; proxy_send_timeout 75; proxy_read_timeout 75; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_temp_path /usr/local/nginx/proxy_temp 1 2; # 設定負載均衡後臺伺服器列表 upstream backend { #ip_hash; server 192.168.1.10:8089 max_fails=2 fail_timeout=30s ; server 192.168.1.11:8089 max_fails=2 fail_timeout=30s ; } # 很重要的虛擬主機配置 server { listen 80; server_name test.example.com; root /apps/anyrtc; #修改為伺服器中實際存在的目錄 charset utf-8; access_log logs/host.access.log main; #對 / 所有做負載均衡+反向代理 location / { root /anyrtc/website; #修改為伺服器中實際存在的目錄 index index.jsp index.html index.htm; proxy_pass proxy_redirect off; # 後端的Web伺服器可以通過X-Forwarded-For獲取使用者真實IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } #靜態檔案,nginx自己處理,不去backend請求後端的服務 location ~* /download/ { root /data/anyrtc/nginx/downloads; #修改為伺服器中實際存在的目錄 } location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /data/anyrtc/nginx/images; #修改為伺服器中實際存在的目錄 expires 7d; } location /nginx_status { stub_status on; access_log off; allow 192.168.10.0/24; deny all; } location ~ ^/(WEB-INF)/ { deny all; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } ## 其它虛擬主機,server 指令開始 }
參考資料
Nginx官方文件()
死磕nginx系列( https://www.cnblogs.com/biglittleant/p/8979063.html)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70013909/viewspace-2855738/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux下玩轉nginx系列(三)---nginx日誌配置檔案說明LinuxNginx
- Nginx的配置檔案說明Nginx
- nginx日誌配置檔案說明Nginx
- Linux下玩轉nginx系列(五)---nginx實現負載均衡LinuxNginx負載
- Linux下玩轉nginx系列(七)---nginx如何實現限流功能LinuxNginx
- Linux下玩轉nginx系列(六)---nginx實現cache(快取)服務LinuxNginx快取
- nginx配置檔案Nginx
- Nginx 配置檔案Nginx
- nginx 詳解 - 詳細配置說明Nginx
- Nginx的gzip配置引數說明Nginx
- nginx 詳解 – 詳細配置說明Nginx
- Nginx 配置檔案 nginx.conf 中文詳解Nginx
- Nginx學習系列三Nginx的啟動、停止、修改配置檔案後重啟Nginx
- 6、nginx+linux下jdk配置NginxLinuxJDK
- Nginx的配置檔案詳解Nginx
- Linux下玩轉nginx系列(八)---如何使用upsync模組實現動態負載均衡LinuxNginx負載
- Linux環境下nginx安裝配置LinuxNginx
- nginx配置轉發Nginx
- Nginx基礎02:配置檔案nginx.conf(Part1)Nginx
- nginx.conf 配置檔案詳解Nginx
- Gixy–分析Nginx配置檔案的工具Nginx
- Nginx 配置檔案引數詳解Nginx
- openresty/nginx配置多個conf檔案RESTNginx
- Nginx配置檔案的語法格式Nginx
- nginx 基本命令和檔案配置Nginx
- 二、Nginx 配置 httpsNginxHTTP
- nginx同一埠配置代理不同路徑下的檔案Nginx
- Nginx部署前後端分離服務以及配置說明Nginx後端
- nginx製作檢查配置bat檔案NginxBAT
- nginx 文件地址及配置檔案入門Nginx
- nginx配置二級域名Nginx
- 二級域名nginx 配置Nginx
- 從零手寫實現 nginx-13-nginx.conf 配置例子解釋 + nginx 配置檔案要如何解析?Nginx
- ServletOutputStream在nginx轉發下輸出檔案下載的一種方法ServletNginx
- 透過nginx配置檔案抵禦攻擊Nginx
- Nginx配置Https專案NginxHTTP
- Nginx知多少系列之(六)Linux下.NET Core專案負載均衡NginxLinux負載
- Linux下使用Nginx做CDN伺服器下的配置LinuxNginx伺服器