前面的學(xué)習(xí),知道 Nginx 的配置規(guī)則如下:
- 一行代表一個(gè)指令;
- 每個(gè)指令有其上下文環(huán)境是嗜,比如 listen 指令只能在 http 指令塊中出現(xiàn),不能單獨(dú)出現(xiàn)挺尾。
下面我們將學(xué)習(xí) Http 服務(wù)的初步配置和靜態(tài)服務(wù)資源配置:
1. Http 服務(wù)配置初步
1.1 常用指令
在官方文檔地址中有關(guān)于 Nginx 的所有模塊鹅搪,打開模塊我們就能看到模塊中支持的指令。最常用的指令遭铺,如 http丽柿、server、listen 等都在 ngx_http_core_modul 模塊中魂挂,這個(gè)是 Nginx 的核心模塊甫题。
1.2 listen 指令
Syntax: listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Default:
listen *:80 | *:8000;
Context: server
listen 指令的上下文環(huán)境是 server 指令,所以 listen 指令只能出現(xiàn)在 server 指令塊中涂召。此外坠非,listen 指令的作用就是監(jiān)聽上層端口,將對(duì)應(yīng)端口發(fā)來(lái)的請(qǐng)求進(jìn)行攔截并處理果正。官方給了許多 listen 的使用示例:
# 這些寫法要考慮特定的環(huán)境和場(chǎng)景
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
# 比較特殊的用法炎码,針對(duì)unix系統(tǒng)
listen unix:/var/run/nginx.sock;
1.3 http 指令
Syntax: http { ... }
Default: —
Context: main
可以看到 http 指令是指令塊形式,屬于主環(huán)境 main秋泳,它里面的指令是用于設(shè)置 http 相關(guān)參數(shù)的潦闲。比如設(shè)置 server 配置等,配置連接超時(shí)時(shí)間等迫皱。
...
# 主位置歉闰,最左邊
http {
#指令或者指令塊
...
}
...
1.4 server 指令
Syntax: server { ... }
Default: —
Context: http
這里 server 的上下文環(huán)境是 http,這說(shuō)明 server 指令塊只能出現(xiàn)在http指令塊中,否則會(huì)出錯(cuò)和敬。server 指令塊中也是許多指令的集合凹炸,比如listen指令,表示監(jiān)聽 http 請(qǐng)求的端口概龄,還有 server_name还惠、root、index 等指令私杜。
...
http {
server {
# 監(jiān)聽端口
listen 8089;
server_name localhost;
# 今天資源根路徑
root /data/yum_source;
# 打開目錄瀏覽功能
autoindex on;
# 指定網(wǎng)站初始頁(yè),找index.html或者index.htm頁(yè)面
index index.html index.htm;
}
...
}
...
下面我們初步了解下 Nginx 的在一些場(chǎng)景下的配置救欧,使用到的都是一些簡(jiǎn)單的配置指令衰粹。
2. 靜態(tài)服務(wù)資源配置
配置靜態(tài)資源服務(wù)器是非常簡(jiǎn)單的一件事情。實(shí)現(xiàn)靜態(tài)資源訪問(wèn)的關(guān)鍵指令有 root 和 alias笆怠,我們會(huì)做一個(gè)案例來(lái)演示其用法和二者的區(qū)別铝耻。
2.1 案例1
準(zhǔn)備好靜態(tài)資源文件,我們就在 /root/test/ 下新建一個(gè) index.html蹬刷,并新建目錄 web瓢捉,同時(shí)繼續(xù)在 web 目錄下分別新建 web1.html 和 web2.html 文件,具體的目錄結(jié)構(gòu)如下所示:
[root@server ~]# cd /root/test
[root@server test]# tree .
.
├── index.html
└── web
├── web1.html
└── web2.html
1 directory, 3 files
Nginx 的配置如下:
user root;
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
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;
server {
listen 8080;
# 靜態(tài)資源根理解
root /root/test;
# 打開目錄瀏覽功能
autoindex on;
# 指定網(wǎng)站初始頁(yè)办成,找index.html或者index.htm頁(yè)面
index index.html index.htm;
}
server {
listen 8081;
location /web {
root /root/test/;
}
}
server {
listen 8082;
location /web {
alias /root/test/;
}
}
}
測(cè)試結(jié)果
對(duì)于監(jiān)聽的 8080 端口泡态,我們直接使用 root 指令,指定資源的根路徑迂卢。這樣子某弦,當(dāng)我們?cè)跒g覽器上直接訪問(wèn) http:// 服務(wù)器的 ip:8080/web/web1.html 或者 http://服務(wù)器ip:8080/web/web2.html 時(shí),就能訪問(wèn)對(duì)應(yīng)的 web1.html 和 web2.html 頁(yè)面而克;若沒有指定靜態(tài)資源地址(即/路徑)靶壮,默認(rèn)會(huì)找由 index 指令指定的文件,即 index.html 或者 index.htm 文件员萍;
訪問(wèn) 8080 的/地址
訪問(wèn)web1.html文件
訪問(wèn)web2.html文件
[圖片上傳失敗...(image-d8dd3f-1643126896663)]
對(duì)于監(jiān)聽的 8081 端口腾降,我們直接使用 root 指令,指定資源的根路徑碎绎。當(dāng)請(qǐng)求 http://服務(wù)器ip:8081/web/xxxx 地址時(shí)螃壤,等價(jià)于訪問(wèn)服務(wù)器上的靜態(tài)資源文件 /root/test/[匹配到的web]/xxxx,也即/root/test/web/xxxx混卵,訪問(wèn) web2.html 類似映穗;
通過(guò) 8081 端口訪問(wèn) web1.html 資源
通過(guò) 8081 端口訪問(wèn)靜態(tài)資源 web2.html
對(duì)于監(jiān)聽的 8082 端口,我們使用的是 alias 指令幕随,指定資源路徑的別名蚁滋,它與 root 指令略有不同。當(dāng)請(qǐng)求 http://服務(wù)器ip:8082/web/xxxx 地址時(shí),等價(jià)于訪問(wèn)服務(wù)器上的靜態(tài)資源文件 /root/test/xxxx辕录,并不會(huì)將匹配到的web添加到靜態(tài)資源的路徑上睦霎,所有為了能訪問(wèn)到 web1.html,我們需要使用如下的url:http://服務(wù)器ip:8082/web/web/web1.html走诞, 訪問(wèn) web2.html 類似副女。結(jié)果如下:
通過(guò)alias指令訪問(wèn)web1.html
通過(guò)alias指令訪問(wèn)web2.html
3. 反向代理配置初步
反向代理是將客戶機(jī)請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的目標(biāo)服務(wù)器;并將從服務(wù)器上得到的結(jié)果返回給 Internet 上請(qǐng)求連接的客戶端蚣旱,此時(shí)代理服務(wù)器與目標(biāo)主機(jī)一起對(duì)外表現(xiàn)為一個(gè)服務(wù)器碑幅。
這樣做的好處是可以隱藏內(nèi)部服務(wù)部署情況,通過(guò)統(tǒng)一入口控制網(wǎng)絡(luò)流量塞绿。另外沟涨,我們還可以在總?cè)肟谔幵O(shè)置負(fù)載均衡,將用戶請(qǐng)求分配給多個(gè)服務(wù)器异吻。反向代理實(shí)現(xiàn)的指令是 proxy_pass 裹赴,我們簡(jiǎn)單使用下這個(gè)指令進(jìn)行測(cè)試,了解其作用诀浪。
案例
在上面配置文件的基礎(chǔ)上棋返,我們?cè)黾右粋€(gè) server 指令塊,監(jiān)聽 9000 端口雷猪,匹配 url 請(qǐng)求睛竣,轉(zhuǎn)發(fā)到 web1.html 和 web2.html 頁(yè)面,具體配置如下:
...
server {
listen 9000;
location /web1 {
proxy_pass http://localhost:8081/web/web1.html;
}
location /web2 {
proxy_pass http://localhost:8081/web/web2.html;
}
}
...
這樣春宣,當(dāng)我們?cè)L問(wèn) url 地址 http://服務(wù)器ip:9000/web1 時(shí)酵颁,會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到 http://localhost:8081/web/web1.html ,而這個(gè)如果是在服務(wù)器上執(zhí)行會(huì)根據(jù)前面的配置訪問(wèn)靜態(tài)資源web1.html月帝。 同樣躏惋,對(duì)于訪問(wèn) web2.html 頁(yè)面,我們只需要請(qǐng)求 http://服務(wù)器ip:9000/web2 即可嚷辅。
測(cè)試結(jié)果
通過(guò)方向代理訪問(wèn) web1.html
通過(guò)方向代理訪問(wèn) web2.html
4. tcp/udp 配置初步
Nginx 從 1.9.0 版本開始簿姨,新增加了一個(gè) stream 模塊,用來(lái)實(shí)現(xiàn)四層協(xié)議的轉(zhuǎn)發(fā)簸搞、代理或者負(fù)載均衡等扁位。這個(gè)模塊使用和 http 指令塊類似。我們同樣在之前的配置準(zhǔn)備一個(gè) nginx.conf 文件趁俊,里面只有一個(gè) stream 的指令塊域仇,如下:
user root;
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
stream {
server {
listen 3000;
return '3000 server get ip: $remote_addr!\n';
}
}
上述指令塊只有一個(gè) stream 塊,監(jiān)聽了 3000 端口寺擂。對(duì)于 tcp 連接暇务,可以使用 proxy_pass 轉(zhuǎn)發(fā) tcp/udp 協(xié)議泼掠。也可以直接使用 return 指令返回,這里只是簡(jiǎn)單返回相應(yīng)字符串垦细。
測(cè)試結(jié)果
在 Windows 下择镇,打開命令窗口,然后輸入telnet 180.76.152.113 3000
命令括改,正常應(yīng)該會(huì)有相應(yīng)的字符串響應(yīng)腻豌。如果出現(xiàn)下面的錯(cuò)誤,需要在Window 中打開 telnet 客戶端嘱能,具體操作見下圖吝梅。
解決找不到 telnet 命令方法 1
在這里選擇勾上 Telnet 客戶端即可。
最后 telent 命令返回結(jié)果:
5. 小結(jié)
這節(jié)內(nèi)容焰檩,我們繼續(xù)學(xué)習(xí)并實(shí)戰(zhàn)了 Nginx 的相關(guān)配置憔涉,涵蓋了靜態(tài)資源配置、反向代理以及 tcp 層處理等析苫,為后續(xù)進(jìn)一步深入學(xué)習(xí) Nginx 做好相關(guān)鋪墊。