不論是本地開發,還是遠端到 Server 開發,還是給提供 demo 給人看效果,我們時常需要對 Nginx 做配置,Nginx 的配置項相當多,如果考慮效能配置起來會比較麻煩。不過,我們往往只是需要一個靜態 Server,或者一個反向代理 Server,這對 Nginx 來說小菜一碟。
本文將給大家介紹 Nginx 配置的基本知識,不想細看的同學可以直接跳到最後一個例子。
簡介
Nginx 的安裝就不解釋了,方便起見,建議在各平臺可以直接執行對應安裝命令:
1 2 3 4 5 6 |
# CentOS yum install nginx; # Ubuntu sudo apt-get install nginx; # Mac brew install nginx; |
一般可以在 /etc/nginx/nginx.conf
中配置,啟動引數為:
1 2 3 4 5 6 7 8 |
# 啟動 nginx -s start; # 重新啟動,熱啟動,修改配置重啟不影響線上 nginx -s reload; # 關閉 nginx -s stop; # 修改配置後,可以通過下面的命令測試是否有語法錯誤 nginx -t; |
-s
,signal,意思就是向 nginx 傳送 start|reload|stop
命令,還是很好理解的。先看一個最簡單的 nginx.conf
配置:
1 2 3 4 5 6 7 8 9 10 11 |
events { # 需要保留這一個段落,可以為空 } http { server { listen 127.0.0.1:8888; location / { root /home/barret/test/; } } } |
啟動後,訪問 htttp://127.0.0.1:8888 ,如果 /home/barret/test/
下有 index.html
檔案就會展示 index.html
的內容,否則返回 404
。
Nginx 配置一個 Web 伺服器
以下對配置 Web 伺服器的引數做簡單說明,包括如何配置埠、域名,如何處理請求,如何響應請求。
1、 虛擬主機和請求的分發
域名和埠的配置
1 2 3 4 5 6 7 8 |
listen 127.0.0.1:8000; listen *:8000; listen localhost:8000; # IPV6 listen [::]:8000; # other params listen 443 default_serer ssl; listen 127.0.0.1 default_server accept_filter=dataready backlog=1024 |
主機名配置
1 2 3 |
server_name www.barretlee.com barretlee.com server_name *.barretlee.com server_name ~^.barret.com$ |
URI 匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 |
location = / { # 完全匹配 = # 大小寫敏感 ~ # 忽略大小寫 ~* } location ^~ /images/ { # 前半部分匹配 ^~ # 可以使用正則,如: # location ~* \.(gif|jpg|png)$ { } } location / { # 如果以上都未匹配,會進入這裡 } |
2、 檔案路徑的定義
根目錄設定
1 2 3 |
location / { root /home/barret/test/; } |
別名設定
1 2 3 4 5 6 7 8 |
location /blog { alias /home/barret/www/blog/; } location ~ ^/blog/(\d+)/([\w-]+)$ { # /blog/20141202/article-name # -> /blog/20141202-article-name.md alias /home/barret/www/blog/$1-$2.md; } |
首頁設定
1 |
index /html/index.html /php/index.php; |
重定向頁面設定
1 2 3 4 5 6 7 8 9 10 |
error_page 404 /404.html; error_page 502 503 /50x.html; error_page 404 =200 /1x1.gif; location / { error_page 404 @fallback; } location @fallback { # 將請求反向代理到上游伺服器處理 proxy_pass http://localhost:9000; } |
try_files 設定
1 2 3 4 5 6 7 8 9 |
try_files $uri $uri.html $uri/index.html @other; location <a href="http://www.jobbole.com/members/baojiang9145">@other</a> { # 嘗試尋找匹配 uri 的檔案,失敗了就會轉到上游處理 proxy_pass http://localhost:9000; } location / { # 嘗試尋找匹配 uri 的檔案,沒找到直接返回 502 try_files $uri $uri.html =502; } |
Nginx 配置反向代理伺服器
反向代理(reserve proxy)方式是指用代理伺服器來接受 Internet 上的連線請求,然後將請求轉發給內部網路中的上游伺服器,並將上游伺服器上得到的結果返回給 Internet 上請求連線的客戶端,此時代理伺服器對外的表現就是一個 Web 伺服器。
Nginx 具備超強的高併發高負載能力,一般會作為前端的伺服器直接向客戶端提供靜態檔案服務;而業務一般還包含一些業務邏輯需要 Apache、Tomcat 等伺服器來處理,故通常 Nginx 對外表現即為靜態 Web 伺服器也是反向代理伺服器。
缺點是增加了一次請求的處理時間,優點是降低了上游伺服器的負載,儘量將壓力放在 Nginx 伺服器上。
1、負載均衡配置
upstream,定義一個上游伺服器叢集
1 2 3 4 5 6 7 8 9 10 |
upstream backend { # ip_hash; server s1.barretlee.com; server s2.barretlee.com; } server { location / { proxy_pass http://backend; } } |
2、反向代理
proxy_pass 將請求轉發到有處理能力的端上,預設不會轉發請求中的 Host 頭部
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
location /blog { prox_pass http://localhost:9000; ### 下面都是次要關注項 proxy_set_header Host $host; proxy_method POST; # 指定不轉發的頭部欄位 proxy_hide_header Cache-Control; proxy_hide_header Other-Header; # 指定轉發的頭部欄位 proxy_pass_header Server-IP; proxy_pass_header Server-Name; # 是否轉發包體 proxy_pass_request_body on | off; # 是否轉發頭部 proxy_pass_request_headers on | off; # 顯形/隱形 URI,上游發生重定向時,Nginx 是否同步更改 uri proxy_redirect on | off; } |
一個簡單的例子,Node.js
一個十分常見的需求:處理請求,如果是靜態檔案,Nginx 直接返回,否則交給 Node 伺服器處理。首先建立了一個 Node 伺服器:
1 2 3 4 |
const http = require('http'); http.createServer((req, res) => { res.end('hello world'); }).listen(9000); |
任何請求過來都返回 hello world
,簡版的 Nginx 配置如下,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
events { # 這裡可不寫東西 use epoll; } http { server { listen 127.0.0.1:8888; # 如果請求路徑跟檔案路徑按照如下方式匹配找到了,直接返回 try_files $uri $uri/index.html; location ~* ^/(js|css|image|font)/$ { # 靜態資源都在 static 資料夾下 root /home/barret/www/static/; } location /app { # Node.js 在 9000 開了一個監聽埠 proxy_pass http://127.0.0.1:9000; } # 上面處理出錯或者未找到的,返回對應狀態碼檔案 error_page 404 /404.html; error_page 502 503 504 /50x.html; } } |
首先 try_files,嘗試直接匹配檔案;沒找到就匹配靜態資源;還沒找到就交給 Node 處理;否則就返回 4xx/5xx 的狀態碼。
小結
本文內容為閱讀《深入理解 Nginx 模組開發和架構解析》時做的一點筆記,以前配置 Nginx 伺服器總是得上網找答案,現在把這些項都理解並記到腦子裡了,還是擔心忘記,部落格稍作記錄。
十分建議讀者邊閱讀邊動手嘗試,利用 nginx -t
測試語法,遇到問題就 Google 搜尋下,上手會很快。後續有空會詳細介紹 Nginx 運維知識。