在項目中,同時有java項目和PHP項目,在伺服器中安裝有tomcat和apache兩種web服務軟體,這樣的話,如果兩個服務同時啟動的話,就會造成80端口隻能一個項目來使用,但是有時必須兩個項目都需要80端口,比如微信開發時,經常需要項目的URL不能帶端口号,是以必須有一個中間軟體來做代理,來協調兩個軟體的通路需求,nginx就是做代理的一個非常好的工具
下面是配置的
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
# 添加内容如下 upstream是nginx的内置子產品,負責網絡資料的轉發處理,upstream後面的名稱是自定義的名稱,裡面的内容是負責轉發的位址,可以本地(localhost)也可以是網絡的
upstream phpProject {
#ip_hash是負載均衡政策,按通路IP配置設定,weight為權重,越大表示伺服器可能配置設定使用者越多
ip_hash;
server 6.6.6.6:800 weight=1;
server 7.7.7.7:800 weight=1;
}
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
在conf.d檔案夾下,建立*.conf檔案,用來指向項目路徑,nginx就像路由器一樣,根據你通路的URL位址指向伺服器中的不同路徑,在該項目中,tomcat服務端口号是8080,apache服務端口号是800
示例代碼如下:
server {
listen 80;
server_name www.aaa.com;
location /{
proxy_pass http://javaProject;
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 1;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
}
location /{
proxy_pass http://phpProject;
proxy_redirect off ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 1;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
}
}
配置完成後,重新開機nginx服務,不論通路java項目還是apache項目,都不再帶端口号了
|
http{
upstream myserver {
server 10.10.10.1 weight=3 max_fails=3 fail_timeout=20s;
server 10.10.10.2 weight=3 max_fails=3 fail_timeout=20s;
#定義後端伺服器,權重3,失敗3次後暫停服務20s
}
server {
listen 80;
server_name www.domain.com;
index index.html;
root /date/web
location / { # 配置健康檢查
proxy_pass http://myserver;
proxy_next_upstream http_500 http_502 error timeout
invalid_header;
# 當出現以上狀态碼時,轉發給下一台伺服器
}
}
}
健康檢查
指定在何種情況下一個失敗的請求應該被發送到下一台後端伺服器:
error # 和後端伺服器建立連接配接時,或者向後端伺服器發送請求時,或者從後端伺服器接收響應頭時,出現錯誤
timeout # 和後端伺服器建立連接配接時,或者向後端伺服器發送請求時,或者從後端伺服器接收響應頭時,出現逾時
invalid_header # 後端伺服器傳回空響應或者非法響應頭
http_500 # 後端伺服器傳回的響應狀态碼為500
http_502 # 後端伺服器傳回的響應狀态碼為502
http_503 # 後端伺服器傳回的響應狀态碼為503
http_504 # 後端伺服器傳回的響應狀态碼為504
http_404 # 後端伺服器傳回的響應狀态碼為404
off # 停止将請求發送給下一台後端伺服器
需要注意一點的是,隻有在沒有向用戶端發送任何資料以前, proxy_next_upstream将請求轉給下一台後端伺服器才是可行的。也就是說,如果在傳輸響應到用戶端時出現錯誤或者逾時,這類錯誤是不可能恢複的 proxy_next_upstream
嚴格來說,nginx自帶是沒有針對負載均衡後端節點的健康檢查的,但是可以通過預設自帶的ngx_http_proxy_module子產品和ngx_http_upstream_module子產品中的相關指令來完成當後端節點出現故障時,自動切換到健康節點來提供通路。
ngx_http_proxy_module 子產品
裡面的proxy_connect_timeout 指令、proxy_read_timeout指令和proxy_next_upstream指令
1、設定與後端伺服器建立連接配接的逾時時間。應該注意這個逾時一般不可能大于75秒。
文法: proxy_connect_timeout time;
預設值:proxy_connect_timeout 60s;
上下文:http, server, location
1
2
3
4
2、定義從後端伺服器讀取響應的逾時。此逾時是指相鄰兩次讀操作之間的最長時間間隔,而不是整個響應傳輸完成的最長時間。如果後端伺服器在逾時時間段内沒有傳輸任何資料,連接配接将被關閉。
文法: proxy_read_timeout time;
預設值:proxy_read_timeout 60s;
上下文:http, server, location
1
2
3
4
3、指定在何種情況下一個失敗的請求應該被發送到下一台後端伺服器:
error # 和後端伺服器建立連接配接時,或者向後端伺服器發送請求時,或者從後端伺服器接收響應頭時,出現錯誤
timeout # 和後端伺服器建立連接配接時,或者向後端伺服器發送請求時,或者從後端伺服器接收響應頭時,出現逾時
invalid_header # 後端伺服器傳回空響應或者非法響應頭
http_500 # 後端伺服器傳回的響應狀态碼為500
http_502 # 後端伺服器傳回的響應狀态碼為502
http_503 # 後端伺服器傳回的響應狀态碼為503
http_504 # 後端伺服器傳回的響應狀态碼為504
http_404 # 後端伺服器傳回的響應狀态碼為404
off # 停止将請求發送給下一台後端伺服器
文法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off ...;
預設值: proxy_next_upstream error timeout;
上下文: http, server, location
1
2
3
4
5
6
7
8
9
10
11
12
13
14
4、proxy内部參數說明
參數 解釋
proxy_set_header 設定由後端伺服器擷取使用者的主機名或者真實IP位址,以及代理者的真實IP位址
client_body_buffer_size 指定用戶端請求主體緩沖區大小
proxy_connect_timeout 表示與後端伺服器連接配接的逾時時間,即發起握手等待響應的逾時時間
proxy_send_timeout 表示後端伺服器的資料回傳時間,即在規定時間内後端伺服器必須傳完所有的資料,否則nginx将斷開這個連接配接
proxy_read_timeout 設定nginx從代理的後端伺服器擷取資訊的時間,表示連接配接建立成功後,nginx等待後端伺服器的響應時間,其實是nginx已經進入後端的排隊之中等候處理的時間
proxy_buffer_size 設定緩沖區大小,預設,該緩沖區大小等于指令proxy_buffers設定的大小
proxy_buffers 設定緩沖區數量和大小。nginx從代理的後端伺服器擷取的響應資訊,會放到緩沖區
proxy_busy_buffers_size 用于設定系統很忙時可以使用的proxy_buffers大小,官方推薦的大小為 proxy_buffers*2
proxy_temp_file_write_size 指定proxy緩存臨時檔案的大小
備注
隻有在沒有向用戶端發送任何資料以前,将請求轉給下一台後端伺服器才是可行的。也就是說,如果在傳輸響應到用戶端時出現錯誤或者逾時,這類錯誤是不可能恢複的。
範例如下:
http {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_connect_timeout 90; ;
proxy_send_timeout 90; ;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ngx_http_upstream_module子產品
1、server指令
upstream web_server {
server 192.168.88.133:80;
server 192.168.88.134:80;
check interval=3000 rise=2 fall=5 timeout=1000;
}
1
2
3
4
5
備注
①interval檢測間隔時間,機關為毫秒,rise請求2次正常的話,标記此realserver的狀态為up,fall表示請求5次都失敗的情況下,标記此realserver的狀态為down,timeout為逾時時間,機關為毫秒。
location /nstatus {
check_status;
access_log off;
#allow SOME.IP.ADDRESS;
#deny all;
}