Nginx 配置初步(下)
前面的學習,知道 Nginx 的配置規(guī)則如下:
- 一行代表一個指令;
- 每個指令有其上下文環(huán)境,比如 listen 指令只能在 http 指令塊中出現(xiàn),不能單獨出現(xiàn)。
下面我們將學習 Http 服務的初步配置和靜態(tài)服務資源配置:
1. Http 服務配置初步
1.1 常用指令
在官方文檔地址中有關于 Nginx 的所有模塊,打開模塊我們就能看到模塊中支持的指令。最常用的指令,如 http、server、listen 等都在 ngx_http_core_modul 模塊中,這個是 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)聽上層端口,將對應端口發(fā)來的請求進行攔截并處理。官方給了許多 listen 的使用示例:
# 這些寫法要考慮特定的環(huán)境和場景
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
# 比較特殊的用法,針對unix系統(tǒng)
listen unix:/var/run/nginx.sock;
1.3 http 指令
Syntax: http { ... }
Default: —
Context: main
可以看到 http 指令是指令塊形式,屬于主環(huán)境 main,它里面的指令是用于設置 http 相關參數(shù)的。比如設置 server 配置等,配置連接超時時間等。
...
# 主位置,最左邊
http {
#指令或者指令塊
...
}
...
1.4 server 指令
Syntax: server { ... }
Default: —
Context: http
這里 server 的上下文環(huán)境是 http,這說明 server 指令塊只能出現(xiàn)在http指令塊中,否則會出錯。server 指令塊中也是許多指令的集合,比如listen指令,表示監(jiān)聽 http 請求的端口,還有 server_name、root、index 等指令。
...
http {
server {
# 監(jiān)聽端口
listen 8089;
server_name localhost;
# 今天資源根路徑
root /data/yum_source;
# 打開目錄瀏覽功能
autoindex on;
# 指定網站初始頁,找index.html或者index.htm頁面
index index.html index.htm;
}
...
}
...
下面我們初步了解下 Nginx 的在一些場景下的配置,使用到的都是一些簡單的配置指令。
2. 靜態(tài)服務資源配置
配置靜態(tài)資源服務器是非常簡單的一件事情。實現(xiàn)靜態(tài)資源訪問的關鍵指令有 root 和 alias,我們會做一個案例來演示其用法和二者的區(qū)別。
2.1 案例1
準備好靜態(tài)資源文件,我們就在 /root/test/ 下新建一個 index.html,并新建目錄 web,同時繼續(xù)在 web 目錄下分別新建 web1.html 和 web2.html 文件,具體的目錄結構如下所示:
[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;
# 指定網站初始頁,找index.html或者index.htm頁面
index index.html index.htm;
}
server {
listen 8081;
location /web {
root /root/test/;
}
}
server {
listen 8082;
location /web {
alias /root/test/;
}
}
}
測試結果
對于監(jiān)聽的 8080 端口,我們直接使用 root 指令,指定資源的根路徑。這樣子,當我們在瀏覽器上直接訪問 http:// 服務器的 ip:8080/web/web1.html 或者 http://服務器ip:8080/web/web2.html 時,就能訪問對應的 web1.html 和 web2.html 頁面;若沒有指定靜態(tài)資源地址(即/路徑),默認會找由 index 指令指定的文件,即 index.html 或者 index.htm 文件;
訪問 8080 的/地址
訪問web1.html文件
訪問web2.html文件
對于監(jiān)聽的 8081 端口,我們直接使用 root 指令,指定資源的根路徑。當請求 http://服務器ip:8081/web/xxxx 地址時,等價于訪問服務器上的靜態(tài)資源文件 /root/test/[匹配到的web]/xxxx,也即/root/test/web/xxxx,訪問 web2.html 類似;
通過 8081 端口訪問 web1.html 資源
通過 8081 端口訪問靜態(tài)資源 web2.html
對于監(jiān)聽的 8082 端口,我們使用的是 alias 指令,指定資源路徑的別名,它與 root 指令略有不同。當請求 http://服務器ip:8082/web/xxxx 地址時,等價于訪問服務器上的靜態(tài)資源文件 /root/test/xxxx,并不會將匹配到的web添加到靜態(tài)資源的路徑上,所有為了能訪問到 web1.html,我們需要使用如下的url:http://服務器ip:8082/web/web/web1.html, 訪問 web2.html 類似。結果如下:
通過alias指令訪問web1.html
通過alias指令訪問web2.html
3. 反向代理配置初步
反向代理是將客戶機請求轉發(fā)給內部網絡上的目標服務器;并將從服務器上得到的結果返回給 Internet 上請求連接的客戶端,此時代理服務器與目標主機一起對外表現(xiàn)為一個服務器。
這樣做的好處是可以隱藏內部服務部署情況,通過統(tǒng)一入口控制網絡流量。另外,我們還可以在總入口處設置負載均衡,將用戶請求分配給多個服務器。反向代理實現(xiàn)的指令是 proxy_pass ,我們簡單使用下這個指令進行測試,了解其作用。
案例
在上面配置文件的基礎上,我們增加一個 server 指令塊,監(jiān)聽 9000 端口,匹配 url 請求,轉發(fā)到 web1.html 和 web2.html 頁面,具體配置如下:
...
server {
listen 9000;
location /web1 {
proxy_pass http://localhost:8081/web/web1.html;
}
location /web2 {
proxy_pass http://localhost:8081/web/web2.html;
}
}
...
這樣,當我們訪問 url 地址 http://服務器ip:9000/web1 時,會將請求轉發(fā)到 http://localhost:8081/web/web1.html ,而這個如果是在服務器上執(zhí)行會根據前面的配置訪問靜態(tài)資源web1.html。 同樣,對于訪問 web2.html 頁面,我們只需要請求 http://服務器ip:9000/web2 即可。
測試結果
通過方向代理訪問 web1.html
通過方向代理訪問 web2.html
4. tcp/udp 配置初步
Nginx 從 1.9.0 版本開始,新增加了一個 stream 模塊,用來實現(xiàn)四層協(xié)議的轉發(fā)、代理或者負載均衡等。這個模塊使用和 http 指令塊類似。我們同樣在之前的配置準備一個 nginx.conf 文件,里面只有一個 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';
}
}
上述指令塊只有一個 stream 塊,監(jiān)聽了 3000 端口。對于 tcp 連接,可以使用 proxy_pass 轉發(fā) tcp/udp 協(xié)議。也可以直接使用 return 指令返回,這里只是簡單返回相應字符串。
測試結果
在 Windows 下,打開命令窗口,然后輸入telnet 180.76.152.113 3000
命令,正常應該會有相應的字符串響應。如果出現(xiàn)下面的錯誤,需要在Window 中打開 telnet 客戶端,具體操作見下圖。
解決找不到 telnet 命令方法 1
在這里選擇勾上 Telnet 客戶端即可。
最后 telent 命令返回結果:
5. 小結
這節(jié)內容,我們繼續(xù)學習并實戰(zhàn)了 Nginx 的相關配置,涵蓋了靜態(tài)資源配置、反向代理以及 tcp 層處理等,為后續(xù)進一步深入學習 Nginx 做好相關鋪墊。