nginx快速入門之配置篇
nginx.conf 配置結構
... #全局塊nevents { #events塊n...n}nnhttp #http塊n{n ... #http全局塊nn server #server塊n { n ... #server全局塊n location [PATTERN] #location塊n {n ...n }n location [PATTERN] n {n ...n }n }nn servern {n ...n }nn ... #http全局塊n}n
- 1、main全局塊:配置影響nginx全局的指令。一般有運行nginx伺服器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,允許生成worker process數等。
- 2、events塊:配置影響nginx伺服器或與用戶的網路連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網路連接序列化等。
- 3、http塊:可以嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。
- 4、server塊:配置虛擬主機的相關參數,一個http中可以有多個server。
- 5、location塊:配置請求的路由,以及各種頁面的處理情況。
不同模塊指令關係:server繼承main;location繼承server;upstream既不會繼承指令也不會被繼承,它有自己的特殊指令,不需要在其他地方的應用
nginx.conf 基本配置模板
每個指令必須有分號結束
########### 每個指令必須有分號結束。#################nn#配置用戶或者組,默認為nobody nobody。n#user administrator administrators; n#允許生成的進程數,默認為1n#worker_processes 2; n#指定nginx進程運行文件存放地址n#pid /nginx/pid/nginx.pid; n#制定錯誤日誌路徑,級別。這個設置可以放入全局塊,http塊,server塊,級別依次為:debug|info|notice|warn|error|crit|alert|emergnerror_log log/error.log debug; nn#工作模式及連接數上限nevents {n#設置網路連接序列化,防止驚群現象發生,默認為onn accept_mutex on; n#設置一個進程是否同時接受多個網路連接,默認為offn multi_accept on; n#事件驅動模型,select|poll|kqueue|epoll|resig|/dev/poll|eventportn#use epoll; n#單個work進程允許的最大連接數,默認為512n worker_connections 1024; n}nn#http伺服器nhttp {n#文件擴展名與文件類型映射表。設定mime類型(郵件支持類型),類型由mime.types文件定義n#include /usr/local/etc/nginx/conf/mime.types;n include mime.types; n#默認文件類型,默認為text/plainn default_type application/octet-stream; nn#取消服務訪問日誌n#access_log off; n#自定義日誌格式n log_format myFormat $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; n#設置訪問日誌路徑和格式。"log/"該路徑為nginx日誌的相對路徑,mac下是/usr/local/var/log/。combined為日誌格式的默認值n access_log log/access.log myFormat; n rewrite_log on;nn#允許sendfile方式傳輸文件,默認為off,可以在http塊,server塊,location塊。(sendfile系統調用不需要將數據拷貝或者映射到應用程序地址空間中去)n sendfile on; n#每個進程每次調用傳輸數量不能大於設定的值,默認為0,即不設上限。n sendfile_max_chunk 100k; nn#連接超時時間,默認為75s,可以在http,server,location塊。n keepalive_timeout 65; nn#gzip壓縮開關n#gzip on;nn tcp_nodelay on;nn#設定實際的伺服器列表n upstream mysvr1 { n server 127.0.0.1:7878;n server 192.168.10.121:3333 backup; #熱備(其它所有的非backup機器down或者忙的時候,請求backup機器))n }n upstream mysvr2 {n#weigth參數表示權值,權值越高被分配到的幾率越大n server 192.168.1.11:80 weight=5;n server 192.168.1.12:80 weight=1;n server 192.168.1.13:80 weight=6;n }n upstream https-svr {n#每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題n ip_hash;n server 192.168.1.11:90;n server 192.168.1.12:90;n }nn#error_page 404 https://www.baidu.com; #錯誤頁nn#HTTP伺服器nn# 靜態資源一般放在nginx所在主機n server {n listen 80; #監聽HTTP埠n server_name 127.0.0.1; #監聽地址 n keepalive_requests 120; #單連接請求上限次數n set $doc_root_dir "/Users/doing/IdeaProjects/edu-front-2.0"; #設置server里全局變數n #index index.html; #定義首頁索引文件的名稱n location ~*^.+$ { #請求的url過濾,正則匹配,~為區分大小寫,~*為不區分大小寫。n root $doc_root_dir; #靜態資源根目錄n proxy_pass http://mysvr1; #請求轉向「mysvr1」定義的伺服器列表n #deny 127.0.0.1; #拒絕的ipn #allow 172.18.5.54; #允許的ip n } n }nn#httpn server {n listen 80;n server_name www.helloworld.com; #監聽基於域名的虛擬主機。可有多個,可以使用正則表達式和通配符n charset utf-8; #編碼格式n set $static_root_dir "/Users/doing/static";n location /app1 { #反向代理的路徑(和upstream綁定),location後面設置映射的路徑 n proxy_pass http://zp_server1;n } n location /app2 { n proxy_pass http://zp_server2;n } n location ~ ^/(images|javascript|js|css|flash|media|static)/ { #靜態文件,nginx自己處理n root $static_root_dir;n expires 30d; #靜態資源過時間30天n }n location ~ /.ht { #禁止訪問 .htxxx 文件n deny all;n }n location = /do_not_delete.html { #直接簡單粗暴的返回狀態碼及內容文本n return 200 "hello.";n }nn# 指定某些路徑使用https訪問(使用正則表達式匹配路徑+重寫uri路徑)n location ~* /http* { #路徑匹配規則:如localhost/http、localhost/httpsss等等n#rewrite只能對域名後邊的除去傳遞的參數外的字元串起作用,例如www.c.com/proxy/html/api/msg?method=1&para=2隻能對/proxy/html/api/msg重寫。n#rewrite 規則 定向路徑 重寫類型;n#rewrite後面的參數是一個簡單的正則。$1代表正則中的第一個()。n#$host是nginx內置全局變數,代表請求的主機名n#重寫規則permanent表示返回301永久重定向n rewrite ^/(.*)$ https://$host/$1 permanent;n }nn#錯誤處理頁面(可選擇性配置)n#error_page 404 /404.html;n#error_page 500 502 503 504 /50x.html;nn#以下是一些反向代理的配置(可選擇性配置)n#proxy_redirect off;n#proxy_set_header Host $host; #proxy_set_header用於設置發送到後端伺服器的request的請求頭n#proxy_set_header X-Real-IP $remote_addr;n#proxy_set_header X-Forwarded-For $remote_addr; #後端的Web伺服器可以通過X-Forwarded-For獲取用戶真實IPn#proxy_connect_timeout 90; #nginx跟後端伺服器連接超時時間(代理連接超時)n#proxy_send_timeout 90; #後端伺服器數據回傳時間(代理髮送超時)n#proxy_read_timeout 90; #連接成功後,後端伺服器響應時間(代理接收超時)n#proxy_buffer_size 4k; #設置代理伺服器(nginx)保存用戶頭信息的緩衝區大小n#proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設置n#proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)n#proxy_temp_file_write_size 64k; #設定緩存文件夾大小,大於這個值,將從upstream伺服器傳nn#client_max_body_size 10m; #允許客戶端請求的最大單文件位元組數n#client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大位元組數nnn }nn#httpsn#(1)HTTPS的固定埠號是443,不同於HTTP的80埠;n#(2)SSL標準需要引入安全證書,所以在 nginx.conf 中你需要指定證書和它對應的 keyn server {n listen 443;n server_name www.hellohttps1.com www.hellohttps2.com;n set $geek_web_root "/Users/doing/IdeaProjects/backend-geek-web";n ssl_certificate /usr/local/etc/nginx/ssl-key/ssl.crt; #ssl證書文件位置(常見證書文件格式為:crt/pem)n ssl_certificate_key /usr/local/etc/nginx/ssl-key/ssl.key; #ssl證書key位置n location /passport {n send_timeout 90;n proxy_connect_timeout 50;n proxy_send_timeout 90;n proxy_read_timeout 90;n proxy_pass http://https-svr;n }n location ~ ^/(res|lib)/ {n root $geek_web_root; n expires 7d;n#add_header用於為後端伺服器返回的response添加請求頭,這裡通過add_header實現CROS跨域請求伺服器n add_header Access-Control-Allow-Origin *; n }n#ssl配置參數(選擇性配置)n ssl_session_cache shared:SSL:1m;n ssl_session_timeout 5m;n }nn#配置訪問控制:每個IP一秒鐘只處理一個請求,超出的請求會被delayedn#語法:limit_req_zone $session_variable zone=name:size rate=rate (為session會話狀態分配一個大小為size的內存存儲區,限制了每秒(分、小時)只接受rate個IP的頻率)n limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s nodelay;n location /pay {n proxy_set_header Host $http_host;n proxy_set_header X-Real_IP $remote_addr;n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;n#訪問控制:limit_req zone=name [burst=number] [nodelay];n limit_req zone=req_one burst=5; #burst=5表示超出的請求(被delayed)如果超過5個,那些請求會被終止(默認返回503)n proxy_pass http://mysvr1;n }nn#可以把子配置文件放到/usr/local/etc/nginx/servers/路徑下,通過include引入n include /usr/local/etc/nginx/servers/*.conf;nn} n
內置全局變數:
$args :這個變數等於請求行中的參數,同$query_stringn$content_length : 請求頭中的Content-length欄位。n$content_type : 請求頭中的Content-Type欄位。n$document_root : 當前請求在root指令中指定的值。n$host : 請求主機頭欄位,否則為伺服器名稱。n$http_user_agent : 客戶端agent信息n$http_cookie : 客戶端cookie信息n$limit_rate : 這個變數可以限制連接速率。n$request_method : 客戶端請求的動作,通常為GET或POST。n$remote_addr : 客戶端的IP地址。n$remote_port : 客戶端的埠。n$remote_user : 已經經過Auth Basic Module驗證的用戶名。n$request_filename : 當前請求的文件路徑,由root或alias指令與URI請求生成。n$scheme : HTTP方法(如http,https)。n$server_protocol : 請求使用的協議,通常是HTTP/1.0或HTTP/1.1。n$server_addr : 伺服器地址,在完成一次系統調用後可以確定這個值。n$server_name : 伺服器名稱。n$server_port : 請求到達伺服器的埠號。n$request_uri : 包含請求參數的原始URI,不包含主機名,如:」/foo/bar.php?arg=baz」。n$uri : 不帶請求參數的當前URI,$uri不包含主機名,如」/foo/bar.html」。n$document_uri : 與$uri相同。n
如何驗證效果
如何確定就是本地 nginx 提供的服務呢?有 2 個方法:
- 方法一:PING
ping ip,看看是否解析到設置的url,比如http://baidu.com等
- 方法二:觀察訪問日誌
查看nginx 伺服器的訪問日誌,看nginx 伺服器是否能夠正常提供服務。
參考來源:
nginx簡易教程:http://www.cnblogs.com/jingmoxukong/p/5945200.html
Nginx配置詳解:http://www.cnblogs.com/knowledgesea/p/5175711.html
Nginx 配置總結:http://blog.p2hp.com/archives/4493
(本文首發於公眾號:EnjoyMoving)
推薦閱讀:
※varnish / squid / nginx cache 有什麼不同?
※假如有一張100W左右數據的表,根據查詢條件進行分頁。如何分頁?
※如何解讀Nginx源碼?
※為什麼要執行多個進程,把所有功能都放到一個進程裡面執行會影響性能嗎?
※Nginx基本配置備忘
