nginx的基礎應用
一、簡介
今天我們將介紹一些nginx的簡單應用,啟動、停止nginx,重載nginx的配置,nginx配置文件的格式,如何配置nginx服務靜態資源,如何配置nginx作為反向代理服務器。
nginx有一個主進程和幾個工作進程。主進程主要是讀取和解析配置文件,以及保持工作進程工作;工作進程處理實際的請求。nginx利用基于事件的模型和運行的操作系統在工作進程之間有效地分配請求。工作進程的個數在配置文件中定義,推薦設置為CPU的核數。
nginx配置文件中的配置決定了nginx如何工作,配置文件的名字一般叫做nginx.conf,它的目錄是/usr/local/nginx/conf,/etc/nginx或者/usr/local/etc/nginx。
二、nginx的啟動、停止、和重載配置
想要運行nginx,運行可執行文件即可。
/usr/sbin/nginx
nginx一旦運行起來,它就可以使用-s參數控制,語法格式如下:
nginx -s signal
signal的列表如下:
- stop 快速關閉
- quit 優雅的關閉
- reload 重載配置文件
- reopen 重新打開log文件
例如,等nginx進程處理完當前的所有請求后,停止nginx進程,命令如下:
nginx -s quit
如果修改了nginx配置文件,并且想要配置文件生效,應當執行如下命令:
nginx -s reload
當主進程接收到reload命令時,它會檢查新配置文件的語法并嘗試應用新的配置文件,如果成功了,主進程會啟動新的工作進程并且發送消息停止舊的工作進程;如果配置文件有錯誤,主進程將回滾并繼續使用舊的配置文件工作。舊的工作進程收到關閉命令后,停止接受新的請求,并且直到當前的所有請求被處理完后,舊的工作進程關閉。
-s參數也可以通過unix命令發送給nginx進程。這種情況下,-s參數通過給定的nginx進程id發送給nginx進程。nginx進程id一般寫在nginx.pid文件中,目錄通常在/usr/local/nginx/logs 或者 /var/run。例如:如果nginx的主進程id是1628,想要優雅的關閉nginx,可執行以下命令:`
kill -s QUIT 1628
獲取當前正在運行的nginx進程,可執行如下命令:
ps -ax | grep nginx
三、配置文件的結構
nginx的配置文件由多個指令集組成,指令集分為簡單指令和模塊指令。簡單的指令由名字和參數組成,由空格和分號(;)隔開。塊指令和簡單指令有著相同的結構,但是“;”被“{}”取代,如果塊指令中還有其他的塊指令,它被稱作上下文(context)。例如:events,http,server,location。
#后面的文件是注釋。
四、服務靜態內容
nginx的一個重要的功能就是服務靜態文件(例如:圖片和靜態html)。在這里,我們舉一個例子,根據不同的請求,提供不同的文件服務,本地的目錄為/data/www,該目錄存放html文件,/data/image存放圖片文件。我們需要修改配置文件,在http塊中增加一個server塊,在server塊中增加連個location塊。
首先,我們在/data/www目錄下創建一個html文件,在文件中隨意寫一些內容,并且在/data/image目錄下隨機放一些圖片。
接下來,我們打開配置文件,文件中默認寫了一些server的例子,我們將其全部注釋掉。從現在開始,我們新加一個server塊,如下:
http {
server {
}
}
通常情況下,配置文件中,包含多個server塊,它們通過監聽不同的端口和服務名稱區分。一旦nginx決定哪個server處理請求,它就會監測請求頭中的URI,和server塊中的location指令中的參數是否一致。
向server塊中添加location塊,如下:
location / {
root /data/www;
}
location塊中指定“/”為前綴和請求中的URI進行比較,匹配的請求,URI將會被加入到root指令集中指定的路徑,“/data/www”,生成一個訪問本地文件系統的文件請求路徑。上面的location提供了一個最小的前綴,當其他的location塊都不匹配時,這個location將被使用。
下面,我們加入第二個塊,如下:
location /images/ {
root /data;
}
它將匹配所有以“/images/”開頭的請求,location / 也匹配這樣的請求,但是只是最小的匹配。
配置的最終結果如下:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
這是一個可以工作的配置,它監聽80端口,并且可以通過本機的http://localhost/ 訪問。以/images/開頭的請求,服務將從/data/images目錄發送文件。例如:請求http://localhost/images/example.png, 將會以/data/images/example.png文件作為響應。如果這個文件不存在,將會返回404錯誤。請求的URI不是以/images/開頭的,將會映射到/data/www目錄中,例如:http://locahost/some/example.html將會映射到/data/www/some/example.html。
要使配置生效,直接啟動nginx(沒有啟動)或重載配置文件
nginx -s reload
如果nginx沒有向配置的那樣工作,你可以在access.log和error.log中找到原因,日志的目錄 /usr/local/nginx/logs 或者 /var/log/nginx。
五、設置一個簡單的代理服務器
nginx作為代理服務器使用是比較頻繁的,它接受請求,分發它們到被代理的服務器,取回響應,并把它們發送給客戶端。
我們將配置一個基本的代理,它從本地目錄服務圖片請求,發送其他的請求到被代理的服務器,在本例中,兩個server將在一個nginx實例中配置。
首先,通過新加一個server塊定義被代理的服務,如下:
server {
listen 8080;
root /data/up1;
location / {
}
}
這是一個簡單的服務,它監聽8080端口(上一個server中,listen并沒有指定,它監聽默認的端口80),它映射所有的請求到本地文件系統/data/up1目錄。創建這個目錄并新建
index.html文件。值得注意的是,在server上下文中配置root,當請求選中的location塊中,沒有root指令時,將會使用server中配置的root。
接下來,我們修改先前的server塊,使他成為一個代理服務器配置。在第一個location塊中,我們添加proxy_pass指令,它的參數為http://localhost:8080,如下:
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
我們將修改第二個location塊,它現在映射以/images/開頭的請求到/data/images目錄。我們修改其為通過文件擴展名匹配的方式,匹配請求。如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
這個參數是一個正則表達式,它匹配所有以.gif,jpg,png結尾的請求,在正則表達式之前必須出現“~”。匹配的請求將映射到/data/images目錄。
當nginx為一個請求選擇服務塊時,它首先檢查指定前綴的location,并記住最長的前綴,然后檢查指定正則表達式的location,如果請求匹配了正則表達式,nginx將選擇這個location服務請求,否則,將選擇先前記住的最長的前綴location。
代理服務的server配置如下:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
這個服務將過濾以.gif,.jpg,.png結尾的請求,并將它們映射到/data/images目錄,其他的請求將被轉發到前面配置的被代理的服務。
要是配置生效,reload配置即可。
至此,nginx的基本配置介紹完了,如有問題,歡迎大家提問~~