(大部分內容是基於作者本人的理解和在網絡上搜索到的資料整合而成)由於本人理解能力有限,若有不足或錯誤之處還請各位看官多多指點!
關於Nginx的主配置文件(/etc/nginx/nginx.conf)
Nginx 的配置文件主要分爲4部分:
main (全局設置) -> 此部分設置的指令將影響其它所有設置
server (主機設置) -> 主要用於指定 "主機" 和 "端口"
upstream (負載均衡設置) -> 用於負載均衡location (URL 匹配特定位置的設置)
location (URL 匹配特定位置的設置) -> 匹配網頁文件的類型和位置
# vi /etc/nginx/nginx.conf (內容如下,有一部分爲在原有基礎之上添加上去的)
- #user nobody; 指定以哪個用戶的身份運行服務
- worker_processes 1; -->啓動幾個工作進程(最好等於CPU的核數,或二倍))
- #error_log logs/error.log; 定義錯誤日誌的存放位置
- #error_log logs/error.log notice; 定義什麼級別的錯誤纔會記錄到日誌中(日誌的輸出級別有:debug、info、notice、warning、error、crit等)
- #error_log logs/error.log info;
- #pid logs/nginx.pid; nginx的PID文件存放位置
- events { 在這裏還可以添加 "use epoll;" 來指定Nignx的工作模式,(Nginx支持的工作模式有 select、poll、epoll、kqueue、rtsig等)
- # use epoll; select 和 poll 都是標準的工作模式,epoll 和 kqueue 是高效的工作模式(epoll 用於linux上,kqueue 用於BSD上)
- worker_connections 1024; --> 每一個工作進程能接受的連接個數(請求) 該值受系統進程最大打開文件數限制,需要使用命令"ulimit -n 50000"設置 (/etc/sysctl.conf中添加fs.file-max=是無效的,可添加至rc.local開機設定)
- }
關於http的相關設定,若想要使用mail的功能,在編譯的時候就需要指定 --with-mail --with-mail_ssl_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module 這幾個選項
- http {
- include mime.types; 實現對配置文件所包含的文件類型的設定,mine.types內定義了各文件類型映像
- default_type application/octet-stream; 默認的數據類型,當類型未定義時使用二進制流的方式,比如未安裝PHP時,是不予解析,用瀏覽器訪問則出現下載窗口
- #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 定義日誌的輸出格式,默認是使用與apache相兼容的日誌格式(common)
- # '$status $body_bytes_sent "$http_referer" '
- # '"$http_user_agent" "$http_x_forwarded_for"';
- # log_format download '$remote_add - $remote_user [$time_local] "$reuest"'
- # '$status $body_bytes_sent "$http_referer" '
- # '"$http_user_agent" "$http_range"'
- # '"$sent_http_content_range"';
- #access_log logs/access.log main; nginx的日誌存放位置 ( main 是日誌輸出格式的名稱,引用上面定義的日誌格式)
- # client_max_body_size 20m; 設置允許客戶端請求的最大單個文件的字節數,超出此值,報413 Request Entity Too Large
- # client_header_buffer_size 32k; 用於指定來自客戶端請求頭的headerbuffer 大小,對於大多數請求,1KB 的緩衝區大小已經足夠,如果自定義了消息頭可以增加緩衝區的大小
- # large_client_header_buffers 4 32k; "4" 爲個數,"128k" 爲大小,默認是4k。申請4個128k。當http 的URI太長或者request header過大時會報414 Request URI too large或400 bad request,這是很有可能是cookie中寫入的值太大造成的,因爲header中的其他參數的size一般比較固定,只有cookie可能被寫入較大的數據,這時可以調大上述兩個值,相應的瀏覽器中cookie的字節數上限會增大。
- sendfile on; 打開系統函數sendfile()的功能,將tcp_nopush和tcp_nodely兩個指令設置爲on 用於防止網絡阻塞
- #tcp_nopush on; 打開linux(僅linux下)下TCP_CORK,sendfile打開時纔有效,用來發送系統HTTP response headers,設置該選項的目的是告訴TCP協議不要僅僅爲了清空發送緩存而發送報文段。通常應該設置TCPNOPUSH插口選項。這樣,當請求長度超過報文段最大長度時,協議就會儘可能發出滿長度的報文段。這樣可以減少報文段的數量,減少的程度取決於每次發送的數據量
- #tcp_nodelay on;
- #keepalive_timeout 0;
- keepalive_timeout 65; 保持連接超時時間
上述四項可以有效提高文件傳輸性能,用sendfile()函數來轉移大量數據,協議會需預先解析數據包報頭部分信息,正常情況下報頭很小,而且套接字上設置了TCP_NODELAY。有報頭的包將被立即傳輸,在某些情況下,因爲這個包成功地被對方收到後需要請求對方確認。這樣,大量數據的傳輸就會被延遲而且產生大量不必要的網絡流量交換。
而如果我們在socket上設置了 TCP_CORK,就像個管道塞住塞子,則帶有報頭的包會填滿數據,所有數據根據大小填充,自動通過數據包發送出去,但在數據完成傳輸時,需要打開塞子。
如果你能一次發送HTTP響應的頭和正文等數據集合,那這樣就能使這些數據不存在延遲
- # gzip on; 是否啓用壓縮功能,實時壓縮輸出數據流
- # gzip_min_length 1k; 允許壓縮的頁面的最小字節數,建議設置成大於 1K 的字節數 ( 頁面字節數從header 頭的Content-Length 中獲取的,默認值爲 0 ,不管頁面多大都進行壓縮)
- # gzip_buffers 4 16k; 申請4 個單位爲 16K 的內存作爲壓縮數結果的緩存。(默認是申請與原始數據大小相同的內存空間來存儲gzip的壓縮結果)
- # gzip_http_version 1.1; 設置識別HTTP協議的版本,默認是1.1,大部分瀏覽器已經支持gzip解壓
- # gzip_comp_level 2; 設置壓縮比(1 壓縮比最小,9 壓縮比最大)
- # gzip_types text/plain application/x-javascript text/css application/xml; 指定壓縮的類型(無論是否指定, "text/html" 類型一定是會被壓縮的)
- # gzip_vary on; 可以讓前端緩存服務器緩存經過 gzip 壓縮的頁面,如:Squid
- # gzip_proxied expired no-cache no-store private no_last_modified no_etag auth any 該選項在做反向代理時設定壓縮,後面參數爲驗證的header頭信息,再做相應的壓縮處理,關閉爲off
- # limit_zone connlimit $binary_remote_addr 10m; 定義名爲connlimit的併發連接數限制空間,存儲10M的帶有二進制IP的會話信息,每個會話信息是32bytes,10M應該可以記錄320000個會話。配合limit_conn 使用。
- server { --> 關於虛擬主機的相關設定
- listen 80; 監聽的端口
- server_name localhost; 指定IP地址或域名(主機名,多域名用空格隔開)
- #limit_conn connlimit 20; 限制一個IP只能最多隻能發起20個連接,超過報 503 Service unavailable
- #charset koi8-r; 設置網頁的默認編碼格式
- #access_log logs/host.access.log main; 可以自定義虛擬主機的日誌存放位置,main 用於指定輸出格式
- location / { 定義路徑(和apache下的DocumentRoot 和 Directory 類似)URL的根,網站的根目錄
- root html; 通過 URL的根所能訪問到的每一個網頁文件位於當前操作系統的哪個位置(相對於軟件的安裝目錄,也可以指定絕對路徑)
- index index.html index.htm; 設定默認訪問的首頁地址
- }
- #location /downloads/ {
- # limit_rate 20k; 爲某個特定路徑限速
- # root /web/downloads/;
- #}
- #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;
- }
- # proxy the PHP scripts to Apache listening on 127.0.0.1:80 --> 反向代理
- #
- #location ~ \.php$ { php與nginx 結合使用時就需要啓用
- # proxy_pass http://127.0.0.1; 把用戶請求的php頁面的所有內容轉交給本地服務器的哪個端口來處理
- #}
- # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 通過FastCGI的方式與PHP程序溝通
- #
- #location ~ \.php$ {
- # root html;
- # fastcgi_pass unix:/tmp/php-cgi.sock; SOCKET方式轉交fastcgi處理
- # fastcgi_pass 127.0.0.1:9000; 9000端口方式fastcgi ,把用戶請求的php頁面的所有內容提交給本地服務器的9000端口來處理
- # fastcgi_index index.php;
- # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
- # include fastcgi_params;
- #}
- # deny access to .htaccess files, if Apache's document root 用戶授權訪問控制
- # concurs with nginx's one
- #
- #location ~ /\.ht {
- # deny all; 拒絕所有用戶訪問以 ".ht" 開頭的文件
- #}
- }
- # another virtual host using mix of IP-, name-, and port-based configuration --> 定義其它的虛擬主機,默認只有一個虛擬主機
- #
- #server {
- # listen 8000;
- # listen somename:8080;
- # server_name somename alias another.alias;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- # HTTPS server 基於SSL的相關設定
- #
- #server {
- # listen 443; 監聽的端口
- # server_name localhost;
- # ssl on;
- # ssl_certificate cert.pem;
- # ssl_certificate_key cert.key;
- # ssl_session_timeout 5m;
- # ssl_protocols SSLv2 SSLv3 TLSv1;
- # ssl_ciphers HIGH:!aNULL:!MD5;
- # ssl_prefer_server_ciphers on;
- # location / {
- # root html;
- # index index.html index.htm;
- # }
- #}
- }