Nginx
nginx的使用場景
靜態資源服務
-
通過本地文件系統提供服務
反向代理服務
-
nginx的強大性能
-
緩存
-
負載均衡
API服務
-
OpenResty
nginx優點
-
高並發、高性能
-
可擴展性好
-
高可靠性
-
熱部署
-
BSD許可證
nginx的安裝
詳見官方文檔
nginx的啟動,停止和重載
nginx有一個主進程和一些工作進程,主進程的目的是讀取執行配置和維持工作進程。nginx的默認配置文件在/usr/local/nginx/conf或/etc/nginx中
nginx的啟動
# 執行nginx可執行文件
$ nginx
同時也可以通過參數 -s 進行控制
nginx -s signal
允許的信號量
-
stop —— 快速停止
-
quit —— 優雅的停止
-
reload —— 重新載入配置文件
-
reopen —— 重新打開日志文件
例如,等待工作進程完成當前請求后去停止nginx進程,這個命令可以被執行
nginx -s quit
這個命令應該被用在已經開啟nginx的用戶上
改變配置文件不提交,直到重載配置的命令發送給nginx或已經重啟。去重新載入配置,執行
nginx -s reload
主進程接收到去重載的配置信號后,它會檢查新的配置文件的語法是否合法並嘗試去應用所提供的配置,若應用成功,主進程將開啟新的工作進程並發送信息給舊工作進程,請求它去關閉。否則,主進程就會回滾這個改變並繼續用舊配置工作。舊工作進程接收到一個關閉命令后,停止接收新連接並繼續去服務當前請求直到所有請求已經服務完畢。之后,舊進程退出。
一個信號量也可能被發送給nginx進程通過unix工具的幫助,比如kill。在這種情況下,信號被定向發送給一個進程通過所給的進程號。nginx主進程的進程號被寫入,默認nginx.pid在/usr/local/nginx/logs
or /var/run
目錄下。比如,如果主進程id是1628,發送QUIT信號導致nginx 優雅關閉,執行:
kill -s QUIT 1628
獲取所有nginx運行的進程,可以用ps命令,用這種方式
ps -ax |grep nginx
獲取更多nginx信號量的信息,去nginx的控制
配置文件的結構
nginx 是由被配置文件提供的指令控制的模塊組成的。這些指令分為簡單指令和塊指令。簡單指令由名字和用空格分離的參數和用於結束的;組成的。塊指令和簡單指令結構相同,但取代分號用於結束的方式的是一個額外的用{}圍繞的結構。如果塊指令有其他指令在{}里面,它被稱為上下文。(例如:events,http,server和location)
指令放置在配置文件所有被認為是主要上下文的上下文外部。events和http指令處於main上下文中,server在http中,location在server中。
一行中# 后面的內容被認為是評論
# nginx.conf
events {}
http {
server {
location {
}
}
}
服務的靜態內容
一個重要的web服務任務就是提供文件(例如:圖片或靜態html頁面)。你將執行一個例子,依賴於請求,文件將被提供從不同的本地目錄中:/data/www(這個可能包含html文件)和/data/images(包含圖片)。這些將要求編輯配置文件並啟動一個在http塊內的server塊,里面包含兩個location塊。
首先,創建/data/www目錄和放入一個有文本內容的Index.html文件,並且創建一個/data/images目錄並放入一些圖片文件在里面。
接下來,打開配置文件。默認的配置文件已經包含幾個server塊的例子,和大部分注釋。現在注釋掉所有的這些塊,開始一個新的server塊:
http {
server {
}
}
通常,配置文件可能包含幾個server塊,通過它們listen的端口和server names。一旦nginx決定哪個server進程處理請求,它測試請求頭指定的uri,根據在server塊中location指令定義的參數。
將以下location塊添加到server塊:
location / {
root /data/www;
}
這個location塊指定與請求中uri進行對比的 “/” 前端。 用於匹配請求,這uri將添加在root指令中指定的路徑,即/data/www,以形成本地文件系統上所請求文件的路徑。如果多個匹配到location塊,nginx選擇一個最長的前綴。location塊以上提供最短的前綴,長度一個,只有所有其他location塊失敗后,這個塊才會被使用。
接下來,添加第二個location塊:
location /images/ {:
root /data;
}
它將匹配一個以/images/開始的請求(location / 也匹配這個請求,但有短的前綴)
這導致server塊的配置應該像這樣:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
這是一個已經工作的服務配置,它監聽標准端口80,並且可以通過http://localhost/.訪問本地。響應以/images/開頭的請求,這個服務將發送文件從/data/images目錄。例如響應以http://localhost/images/example.png
的請求,nginx將發送/data/images/example.png文件。如果這文件不存在,nginx將返回一個帶404錯誤的響應。不以/images/開始的請求將映射到/data/www目錄。例如,響應以http://localhost/some/example.html的請求,nginx將發送/data/www/some/example.html文件
要應用新配置,請啟動nginx(如果尚未啟動)或通過執行以下命令將重新加載信號發送到nginx的主進程:
nginx -s reload
以防一些事情不能像所期待的工作,你可以嘗試在access.log和error.log中找原因,在/usr/local/nginx/logs
or /var/log/nginx
.中
設置簡單的代理服務器
nginx的一個常見用途是將其設置為代理服務器,這意味着服務器接收請求,將它們傳遞給代理服務器,從中檢索響應,然后將它們發送給客戶
我們將配置一個基本代理服務器,它使用來自本地目錄的文件處理圖像請求,並將所有其他請求發送到代理服務器。在此示例中,將在單個nginx實例上定義兩個服務器。
首先,通過向nginx的配置文件添加一個服務器塊來定義代理服務器,其中包含以下內容:
server {
listen 8080;
root /data/up1;
location / {
}
}
這將是一個偵聽端口8080的簡單服務器(之前,自使用標准端口80以來尚未指定listen指令)並將所有請求映射到本地文件系統上的/ data / up1目錄。創建此目錄並將index.html文件放入其中。請注意,root指令放在服務器上下文中。當選擇用於提供請求的位置塊不包括自己的根指令時,使用這樣的根指令。
nginx實現負載均衡
# conf/nginx.conf
upstream tomcat_server{
server 192.168.1.2:8080 weight=1;
server 192.168.1.3:8080 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat_server;
}
}