Nginx實戰入門教程
Nginx 簡介
Nginx是一個高效能的http和反向代理伺服器,它看起來好像不太符合英文單詞的拼寫習慣,因為Nginx是由名為 伊戈爾·賽索耶夫 的俄羅斯人開發的。Nginx主要特點為佔用記憶體小,處理併發能力強悍,在國內被廣泛採用。目前像阿里,京東,騰訊,百度,新浪,網頁等國內的網際網路巨頭公司都在使用。
下面我們來介紹Nginx的簡單使用,筆者認為學會一個工具最快的方式為先使用,然後明白為什麼。就像小時候你先學會騎自行車,然後在知道自行車如果壞了怎麼去修理它。
Nginx的下載和安裝
Nginx的下載和安裝非常簡單,直接在http://nginx.org/en/download.html
nginx/Windows-1.14.0
。Nginx的壓縮包非常小,只有約1.5M,而且無需翻牆,數秒即可下載完成。 下載完成之後直接將壓縮包解壓即可,筆者將其解壓到D盤的根目錄下,此時檔案目錄內容如下:
啟動,停止,和重新載入配置檔案命令
Nginx解壓完畢之後,直接雙擊nginx.exe
即可啟動,當Nginx啟動之後,通過nginx -s
命令可以實現停止nginx和重新載入配置檔案。
nginx -s stop # 立即停止
nginx -s quit # 停止,在Nginx停止前會等待當前正在進行的任務
nginx -s reload # 重新載入配置檔案
Nginx作為普通HttpServer
簡單來說,任何可以通過Http請求的方式訪問IO資源(檔案是對磁碟IO的一種抽象)服務都可以稱為HttpServer。你可以自己寫一個程式監聽一個埠,當使用瀏覽器輸入ip:port/path
訪問,程式獲取瀏覽器獲取到Http請求報文,然後對URI部分(也就是path部分)進行解析,在本地檔案系統或者其他IO資源中找到對應的資源,通過封裝一個Http響應報文,將資源內容放入響應體中寫回給瀏覽器,瀏覽器就會對其進行解析並展示(或者下載),這就完成了最簡單的Http伺服器。但我們平時應用的Http伺服器需要處理的細節是很多的,如IO複用,安全性等,在此不再贅述。
首先複製conf/nginx.conf
為conf/nginx_bak.conf
備份原有的配置檔案檔案,在nginx的根目錄下建立www
目錄,並使用echo 01 > index.html
命令,在www目錄下建立index.html
,作為HttpServer的靜態資源。
刪除nginx.conf
的內容並寫入如下配置:
worker_processes 1;
events {
worker_connections 1024;
}
error_log D:/nginx-1.14.0/error.log;
http {
access_log D:/nginx-1.14.0/access.log;
server {
location / {
root D:/nginx-1.14.0/www;
}
}
}
開啟瀏覽器輸入http://localhost/
結果如下圖:
至此, 配置Nginx最基本的功能已經成功執行
注意:這裡有個細節, Windows下的路徑
D:/nginx-1.14.0/www
在Nginx的配置檔案中要寫為正斜線/
事實上從Windows資源管理器中直接複製路徑為D:\nginx-1.14.0\www
,分隔符為反斜線在某些情況下也是可以的,但是這裡出現的\n
連在一次會被nginx認為是一個換行符,從而請求會出現伺服器500錯誤,所以這裡推薦所有的分隔符都使用正斜線/
,在Linux上由於路徑分隔符本身就是/
,因此不存在此問題
Nginx配置檔案
前面我們已經對Nginx進行了簡單配置併成功的訪問,這裡對Nginx的配置檔案進行簡單介紹,nginx的配置檔案中配置項有兩種結構
- 簡單指令(simple directive),形如
key value;
- 塊指令(block directive), 形如
key {simple_key simple_value;}
塊指令中包含有簡單指令。
沒錯,像是json,但又不是json
worker_processes 1;
events {
worker_connections 1024;
}
worker_processes
為工作程序的數量,這裡如果不填的話預設為CPU核心數,事實上數量為CPU核心數也是最優配置,因為此時,理論上作業系統發生程序切換的的代價最小。
events.worker_connections
每個工作程序的最大連線數,events有很多複雜的配置,詳情點選這裡
error_log
為發生錯誤時的日誌輸出路徑
http {
access_log D:/nginx-1.14.0/access.log;
server {
location / {
root D:/nginx-1.14.0/www;
}
}
}
這一部分算是對映的主體了,整體包含在一個塊級指令http {}
中,access_log
指定該http的日誌路徑(此項也可以配置在server{}
內),放到http{}
內,其中所有的server訪問日誌都會輸出到此。server{}
內有location / {}
項,nginx會根據location後面的路徑和ip:port/path
中的path做匹配,如果匹配到,則從裡面配置的D:/nginx-1.14.0/www
本地目錄下尋找請求的資源。
注意:一個server{}
下也可以有多個location配置,而且location配置也可以跟正則表示式,如下:
server {
location / {
root D:/nginx-1.14.0/www;
}
location /static/ {
root D:/nginx-1.14.0/static;
}
location ~ \.(gif|jpg|png)$ {
root D:/nginx-1.14.0/images;
}
}
nginx的匹配優先順序為,正則,長路徑,短路徑。關於正則的配置必須以~
開頭,後面跟要匹配的檔名正則表示式,這裡以localhost/01.png
為例,nginx會找到符合檔名的第三項配置,然後會從D:/nginx-1.14.0/images
中找01.png
檔案,這裡沒有任何問題。
如果路徑為/static/file.suffix
,匹配到location /
之後,還會往更深的location /static/
配置的root目錄下匹配資源,此時會在本地找到D:/nginx-1.14.0/static/file.suffix
檔案。此時如果刪除location /static/
的配置,就會從location /
的root目錄下尋找配置檔案,即此時的匹配路徑為D:/nginx-1.14.0/www/static/file.suffix
。這點符合nginx優先匹配深層次的location配置這一特性。
有意思的是當路徑為/static/01.png
時,此時符合location ~ \.(gif|jpg|png)$
和location /static/
兩項配置,但由於正則優先,會尋找本地檔案系統中D:/nginx-1.14.0/images/static/01.png
檔案
Nginx作為代理伺服器
Nginx經常作為代理伺服器,作為代理的訪問邏輯如下圖:
這裡將上面配置好的靜態檔案伺服器作為目標WebServer,首先將配置檔案的http{}
塊中追加以下內容
server {
listen 8080;
location / {
proxy_pass http://localhost:80;
}
}
然後使用nginx -s reload
重新載入配置檔案,在瀏覽器中輸入localhost:8080/index.html
可以看到瀏覽器輸出如下:
這裡對上面的配置進行簡單解釋:
server{listen 8080;}
表明啟動一個http-server監聽在8080埠(注:此項不填預設為80埠,但前面的靜態伺服器已經佔用了80埠,此處就為其他埠)。
location / {proxy_pass http://localhost:80;}
location的匹配規則前文已經講過,這裡當匹配上location /
之後,就會從請求proxy_pass
的URL,然後在將結果返回給瀏覽器。此時的localhost:8080/index.html
請求相當於在請求localhost:80/index.html