以下講記述的,是為nginx入門級(jí)新人和打算學(xué)習(xí)nginx的人而準(zhǔn)備的。
首先,nginx(讀作:engine x)是一個(gè)反向代理服務(wù)器。這里順便闡述一下相關(guān)的概念,來幫助概念不清楚的朋友來獲得最佳的學(xué)習(xí)體驗(yàn)。
服務(wù)器可以按照不同標(biāo)準(zhǔn)劃分為很多種,那么這里討論的就是其中的一種,代理服務(wù)器。代理服務(wù)器可以再次細(xì)分,分為正向代理服務(wù)器和反向代理服務(wù)器,這兩者是相對(duì)于目標(biāo)服務(wù)器而言的。當(dāng)我們(O)希望訪問某一臺(tái)服務(wù)器(T,是具體的服務(wù)器),但是由于種種原因,我們不能去直接的訪問T,但是我們可以直接訪問另一臺(tái)服務(wù)器(P),而P卻可以訪問T,那么正好,我們拜托P去訪問T,將獲得的信息返回給我們,這個(gè)過程中,我們始終知道要訪問的那一臺(tái)服務(wù)器,所以,這個(gè)代理過程稱為正向代理;那么與之相對(duì),如果我們知道要訪問的站點(diǎn),但是該站點(diǎn)可能同時(shí)部署在多個(gè)服務(wù)器上,不過最終我們獲得了目標(biāo)站點(diǎn)的內(nèi)容,這個(gè)過程中,我們不知道具體訪問過哪一臺(tái)服務(wù)器,所以,這個(gè)代理過程稱為反向代理。
那么nginx就是近些年來使用率不斷攀升的代理服務(wù)器,你可以查看一下中間件的使用情況,這里給出一個(gè)調(diào)查,
點(diǎn)我查看好了,我們開始吧。我不管你什么系統(tǒng),但是我假定你已經(jīng)安裝好了nginx,排除那些系統(tǒng)上操作的差異,我們來感受一下最基本的操作。
nginx的啟動(dòng),停止,重新加載配置文件
在控制臺(tái)中定位到nginx所在的目錄,使用nginx -s signal操作nginx,signal可以是以下參數(shù)
- stop — 立刻停止(不會(huì)等待當(dāng)前工作結(jié)束)
- quit — 延遲停止(會(huì)等待當(dāng)前工作結(jié)束)
- reload — 重新加載配置文件(會(huì)優(yōu)先檢查新配置文件的格式,通過校驗(yàn)則啟用新配置,不通過則沿用舊配置)
- reopen — 重新打開日志文件
好了,知道了基本操作之后,我們就看一下配置文件,看懂了配置文件,我們就能讓nginx按照我們的需要來運(yùn)作。打開nginx.cnf文件
#user nobody;
#我左邊有個(gè)“#”號(hào),這說明這一行都是注釋
#下面的這個(gè),看起來像一對(duì)鍵值對(duì),這么理解也可以,官方給出的解釋是“簡單指令”
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#與簡單指令相對(duì),下面的event以及一對(duì)花括號(hào),稱作“塊指令”;含有其他指令的“塊指令”,我們稱作“上下文”
#同時(shí),我們把不被包含在任何其他上下文中的上下文稱作主上下文
#所以,“events”和“http”就是主上下文,“server”和“location”就不是主上下文
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#好了,我們需要配置一個(gè)服務(wù)器最基本的功能,給出請(qǐng)求相應(yīng)結(jié)果
#看到下面這個(gè)server上下文,它看上去但是也的確是用來配制服務(wù)器的
server {
#這個(gè)server上下文監(jiān)聽的端口以及域名
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#這里就是路由規(guī)則了,location加空格再加匹配項(xiàng),這里的匹配項(xiàng)是“/”,也就是說所有以“/”開頭的請(qǐng)求都符合這個(gè)路由規(guī)則
#但是需要注意一點(diǎn),nginx在匹配路由的時(shí)候有一個(gè)最長前綴匹配規(guī)則,看到下一個(gè)路由規(guī)則
location / {
#這里的root指的是響應(yīng)資源所在的目錄,這是指明,資源在nginx目錄下的index目錄里
root html;
#index指令會(huì)響應(yīng)指定的頁面,按次序進(jìn)行查找,找到了就返回
index index.html index.htm;
}
#這location的匹配項(xiàng)是“/demo”,那么當(dāng)一個(gè)請(qǐng)求是“/demo/get”的時(shí)候,這個(gè)請(qǐng)求會(huì)匹配之前的“/”和這里的“/demo”,但是
#nginx會(huì)選擇前綴較長的匹配項(xiàng)來匹配,所以nginx會(huì)使用/demo路由的相應(yīng)內(nèi)容
location /demo {
#這里又重新設(shè)定了root的值,表示用nginx目錄demo目錄下的資源響應(yīng)
#如果root在主上下文之外設(shè)定,那么相當(dāng)于一個(gè)全局的設(shè)定,在其他上下文中沒有被覆蓋的話,則使用全局設(shè)定
root demo;
}
#截止到為目前的配置,nginx都是用來響應(yīng)靜態(tài)的資源,比如我們?cè)L問localhost/demo/show.html,那么nginx會(huì)返回nginx目錄下
#demo目錄下show.html的內(nèi)容,所以,我們經(jīng)常會(huì)把nginx當(dāng)做一個(gè)靜態(tài)內(nèi)容緩存來使用,來緩解后續(xù)服務(wù)器的響應(yīng)壓力
#對(duì)于location來說,常用的還有正則匹配
#靜態(tài)資源配置,當(dāng)然也可以來響應(yīng)動(dòng)態(tài)請(qǐng)求,不過這里有一點(diǎn)需要注意,當(dāng)使用正則匹配時(shí),如果請(qǐng)求匹配了當(dāng)前的路由規(guī)則,那么
#會(huì)以正則的匹配內(nèi)容為主并返回,不會(huì)使用非正則的匹配項(xiàng)內(nèi)容返回,以“~”開頭,就表示匹配項(xiàng)是一個(gè)正則表達(dá)式,當(dāng)然,還有其
#他不同規(guī)則的前綴都表示正則,后續(xù)再展開
location ~ .*\.(css|js)(.*) {
proxy_set_header Host $host;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
expires 7d;
}
#對(duì)于代理服務(wù)器來說,最基本的功能代理是必不可少的,而且配置也非常簡單
#端口轉(zhuǎn)發(fā)配置,做出如下配置之后,符合匹配項(xiàng)的請(qǐng)求會(huì)原封不動(dòng)的轉(zhuǎn)發(fā)到otherhost域名下
location /proxy{
proxy_pass http://otherhost;
}
#下面的配置顯而易見,是錯(cuò)誤頁面的配置
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
有了這套最基本的配置,就可以試著開啟nginx,感受一下它的功能