Ubuntu nginx 反向代理
1. nginx 反向代理單臺服務器
root@youyou:/apps/nginx/conf.d# cat test.conf
server{
server_name www.xiapi.com;
listen 80;
access_log /apps/nginx/logs/xiapi_access.log;
error_log /apps/nginx/logs/xiapi_error.log;
error_page 404 /no.html;
server_tokens off;
location /no.html {
root /data/html;
}
location / {
proxy_pass http://192.168.19.33;
}
}
root@youyou:/apps/nginx/conf.d#
root@youyou:/apps/nginx/conf.d# nginx -s reload
root@youyou:/apps/nginx/conf.d# curl 192.168.19.30
192.168.19.33 nginx
2. nginx 反向代理部分目錄
root@youyou:/apps/nginx/conf.d# cat test.conf
server{
server_name www.xiapi.com;
listen 80;
access_log /apps/nginx/logs/xiapi_access.log;
error_log /apps/nginx/logs/xiapi_error.log;
error_page 404 /no.html;
server_tokens off;
location /no.html {
root /data/html;
}
location / {
proxy_pass http://192.168.19.33;
}
location /web {
proxy_pass http://192.168.19.32/;
}
}
root@youyou:/apps/nginx/conf.d#
root@youyou:/apps/nginx/conf.d# nginx -s reload
root@youyou:/apps/nginx/conf.d# curl 192.168.19.30/web/
192.168.19.32 apache
root@youyou:/apps/nginx/conf.d# curl 192.168.19.30
192.168.19.33 nginx
root@youyou:/apps/nginx/conf.d#
# 後端服務器必須要有相應的web路徑
root@youyou:/var/www/html# mkdir web
root@youyou:/var/www/html# cp index.html web/.
3. nginx 緩存功能
在http代碼塊中,定義緩存信息,注意這是一行
proxy_cache_path /data/nginx/proxy_cache #定義緩存保存路徑,proxy_cache會自動創建
levels=1:2:2 #定義緩存目錄結構層次,1:2:2可以生成2^4x2^8x2^8=1048576個目錄
keys_zone=proxycache:20m #指內存中緩存的大小,主要用於存放key和metadata(如:使用次數)
inactive=120s; #緩存有效時間
max_size=1g; #最大磁盤佔用空間,磁盤存入文件內容的緩存空間最大值
# 注意目錄需要創建到/var/cache/nginx 這一層
在location 中調用
root@youyou:/apps/nginx/conf.d# vi test.conf
location /web {
proxy_pass http://192.168.19.32;
proxy_set_header clientip $remote_addr;
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
}
root@youyou:/apps/nginx/conf.d# ll /data/nginx/
total 12
drwxr-xr-x 3 root root 4096 Jan 8 12:25 ./
drwxr-xr-x 5 root root 4096 Jan 8 12:25 ../
drwx------ 3 nobody root 4096 Jan 8 12:25 proxycache/
root@youyou:/apps/nginx/conf.d# ll /data/nginx/proxycache/
total 12
drwx------ 3 nobody root 4096 Jan 8 12:25 ./
drwxr-xr-x 3 root root 4096 Jan 8 12:25 ../
drwx------ 3 nobody nogroup 4096 Jan 8 12:25 4/
root@youyou:/apps/nginx/conf.d#
4. nginx 反向代理添加頭部信息
nginx基於模塊ngx_http_headers_module可以實現對頭部報文添加指定的key與值
location /web {
proxy_pass http://192.168.19.32;
proxy_set_header clientip $remote_addr;
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 1h;
proxy_cache_valid any 1m;
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name;
}
root@youyou:/apps/nginx/conf.d# curl -I 192.168.19.30/web/index.html
HTTP/1.1 200 OK
Server: xiapi
Date: Wed, 08 Jan 2020 12:31:42 GMT
Content-Type: text/html
Content-Length: 22
Connection: keep-alive
Last-Modified: Wed, 08 Jan 2020 12:18:43 GMT
ETag: "16-59b9fe4baf8d7"
X-Via: 192.168.19.30
X-Cache: HIT
# 緩存是否命中,如果是miss 就是未命中
X-Accel: www.xiapi.com
Accept-Ranges: bytes
root@youyou:/apps/nginx/conf.d#
5. nginx 反向代理多臺web服務器
在上一個章節中Nginx可以將客戶端的請求轉發至單臺後端服務器但是無法轉發至特定的一組的服務器,而且不能對後端服務器提供相應的服務器狀態監測,但是Nginx可以基於ngx_http_upstream_module模塊提供服務器分組轉發、權重分配、狀態監測、調度算法等高級功能,官方文檔: https://nginx.org/en/docs/http/ngx_http_upstream_module.html
調度算法
hash KEY consistent;
#基於指定key做hash計算,使用consistent參數,將使用ketama一致性hash算法,適用於後端是Cache服務器
(如varnish)時使用,consistent定義使用一致性hash運算,一致性hash基於取模運算。
hash $request_uri consistent;
#基於用戶請求的uri做hash
ip_hash;
#源地址hash調度方法,基於的客戶端的remote_addr(源地址)做hash計算,以實現會話保持,
least_conn;
#最少連接調度算法,優先將客戶端請求調度到當前連接最少的後端服務器
服務器選項
server address [parameters];
#配置一個後端web服務器,配置在upstream內,至少要有一個server服務器配置。
#server支持的parameters如下:
weight=number #設置權重,默認爲1。
max_conns=number #給當前server設置最大活動鏈接數,默認爲0表示沒有限制。
max_fails=number #對後端服務器連續監測失敗多少次就標記爲不可用。
fail_timeout=time #對後端服務器的單次監測超時時間,默認爲10秒。
backup #設置爲備份服務器,當所有服務器不可用時將重新啓用次服務器。
down #標記爲down狀態。
resolve #當server定義的是主機名的時候,當A記錄發生變化會自動應用新IP而不用重啓Nginx。
範例:注意我得主機名都一樣,其實是在不同的服務器上
root@youyou:/apps/nginx/conf.d# cat test.conf
upstream webserver {
least_conn;
server 192.168.19.32:80 weight=1 fail_timeout=5s max_fails=3;
server 192.168.19.33:80 weight=1 fail_timeout=5s max_fails=3;
}
server{
server_name www.xiapi.com;
listen 80;
access_log /apps/nginx/logs/xiapi_access.log;
error_log /apps/nginx/logs/xiapi_error.log;
error_page 404 /no.html;
server_tokens off;
location /no.html {
root /data/html;
}
location / {
proxy_pass http://webserver/;
index index.html;
}
}
root@youyou:/apps/nginx/conf.d#
root@youyou:/apps/nginx/conf.d# nginx -s reload
# 測試
root@youyou:~# curl 192.168.19.30
192.168.19.32 apache
root@youyou:~# curl 192.168.19.30
192.168.19.33 nginx
root@youyou:~# curl 192.168.19.30
192.168.19.32 apache
root@youyou:~# curl 192.168.19.30
192.168.19.33 nginx
# 關掉Apache的進行測試
root@youyou:~# systemctl stop apache2.service
root@youyou:~#
root@youyou:~# curl 192.168.19.30
192.168.19.33 nginx
root@youyou:~# curl 192.168.19.30
192.168.19.33 nginx
root@youyou:~# curl 192.168.19.30
192.168.19.33 nginx
root@youyou:~# curl 192.168.19.30
192.168.19.33 nginx
root@youyou:~#
6. nginx 反向代理客戶端ip透傳
- nginx 添加頭部信息,傳輸到後端服務器
location / {
proxy_pass http://webserver/;
proxy_set_header youyou $proxy_add_x_forwarded_for;
index index.html;
}
- 後端服務器日誌 修改日誌添加這個youyou字段
LogFormat "\"%{youyou}i\" %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
- 查看效果
root@youyou:~# tail -5 /var/log/apache2/access.log
192.168.19.30 - - [09/Jan/2020:02:49:30 +0000] "GET / HTTP/1.0" 200 268 "-" "curl/7.58.0"
192.168.19.30 - - [09/Jan/2020:02:53:04 +0000] "GET / HTTP/1.0" 200 268 "-" "curl/7.58.0"
192.168.19.30 - - [09/Jan/2020:02:53:05 +0000] "GET / HTTP/1.0" 200 268 "-" "curl/7.58.0"
"192.168.19.31" 192.168.19.30 - - [09/Jan/2020:02:55:10 +0000] "GET / HTTP/1.0" 200 268 "-" "curl/7.58.0"
"192.168.19.31" 192.168.19.30 - - [09/Jan/2020:02:55:10 +0000] "GET / HTTP/1.0" 200 268 "-" "curl/7.58.0"
root@youyou:~#
7. nginx 四層代理
注意包含文件需要和http同級別
root@youyou:/apps/nginx# vi conf/nginx.conf
events {
worker_connections 1024;
}
include /apps/nginx/test2.conf;
http {
root@youyou:/apps/nginx# cat test2.conf
stream {
upstream mysql {
least_conn;
server 192.168.19.31:3306 max_fails=3 fail_timeout=30s;
}
server {
listen 192.168.19.30:3306;
proxy_connect_timeout 6s;
proxy_timeout 15s;
proxy_pass mysql;
}
}
root@youyou:/apps/nginx#
root@youyou:/apps/nginx# mysql -h192.168.19.30 -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 56
Server version: 10.1.43-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> exit
Bye