負(fù)載均衡(Load Balance),其含義就是指將負(fù)載(工作任務(wù))進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行運(yùn)行,例如FTP服務(wù)器、Web服務(wù)器、企業(yè)核心應(yīng)用服務(wù)器和其它主要任務(wù)服務(wù)器等,從而協(xié)同完成工作任務(wù)。
例如,當(dāng)我們網(wǎng)站的訪問(wèn)量少的時(shí)候,單臺(tái)服務(wù)器足以處理客戶的請(qǐng)求。但隨著我們的客戶量,訪問(wèn)量越來(lái)越多時(shí),單臺(tái)服務(wù)器處理不過(guò)來(lái)就會(huì)造成響應(yīng)時(shí)長(zhǎng)過(guò)長(zhǎng),用戶體驗(yàn)差,甚至造成服務(wù)器宕機(jī),此時(shí)我們就需要配置服務(wù)器集群,多臺(tái)服務(wù)器共同為用戶提供服務(wù),減輕單臺(tái)服務(wù)器壓力;而且當(dāng)其中一臺(tái)服務(wù)器出現(xiàn)問(wèn)題宕機(jī)后,其他服務(wù)器依然可以正常接收處理用戶請(qǐng)求,提高了系統(tǒng)的穩(wěn)定性,用戶體驗(yàn)也更好。
本文介紹Nginx配置反向代理實(shí)現(xiàn)負(fù)載均衡的步驟
一、正向代理與反向代理
1. 正向代理
正向代理類(lèi)似一個(gè)跳板機(jī),代理訪問(wèn)外部資源
比如我們國(guó)內(nèi)訪問(wèn)谷歌,直接訪問(wèn)訪問(wèn)不到,我們可以通過(guò)一個(gè)正向代理服務(wù)器,請(qǐng)求發(fā)到代理服,代理服務(wù)器能夠訪問(wèn)谷歌,這樣由代理去谷歌取到返回?cái)?shù)據(jù),再返回給我們,這樣我們就能訪問(wèn)谷歌了
正向代理的用途:
- 訪問(wèn)原來(lái)無(wú)法訪問(wèn)的資源,如google
- 可以做緩存,加速訪問(wèn)資源
- 對(duì)客戶端訪問(wèn)授權(quán),上網(wǎng)進(jìn)行認(rèn)證
- 代理可以記錄用戶訪問(wèn)記錄(上網(wǎng)行為管理),對(duì)外隱藏用戶信息
2. 反向代理
反向代理(Reverse Proxy)實(shí)際運(yùn)行方式是指以代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)服務(wù)器
反向代理的作用:
- 保證內(nèi)網(wǎng)的安全,阻止web攻擊,大型網(wǎng)站,通常將反向代理作為公網(wǎng)訪問(wèn)地址,Web服務(wù)器是內(nèi)網(wǎng)
- 負(fù)載均衡,通過(guò)反向代理服務(wù)器來(lái)優(yōu)化網(wǎng)站的負(fù)載

二、負(fù)載均衡
現(xiàn)在我們搭建一個(gè)由兩臺(tái)服務(wù)器組成的集群為用戶提供服務(wù)。
第一臺(tái)服務(wù)器是:192.168.204.133
第二臺(tái)服務(wù)器是:192.168.204.134
那么我們可以這樣配置:所有的用戶通過(guò)域名解析訪問(wèn)到第一臺(tái)服務(wù)器:192.168.204.133的80端口,80端口由Nginx監(jiān)聽(tīng),接收到用戶請(qǐng)求后,按照一定的策略(平均,權(quán)重,ip_hash等等)分發(fā)到真正處理請(qǐng)求的服務(wù)器中,我們?cè)O(shè)置真正處理請(qǐng)求的服務(wù)器是192.168.204.133的8080端口 和 192.168.204.134的80端口。這樣,假如我們有100個(gè)請(qǐng)求同時(shí)請(qǐng)求我們的網(wǎng)站,那么可以把50個(gè)請(qǐng)求轉(zhuǎn)發(fā)到192.168.204.133,另外50個(gè)請(qǐng)求轉(zhuǎn)發(fā)到192.168.204.134,從而達(dá)到負(fù)載均衡的效果,減輕單機(jī)處理所有請(qǐng)求的壓力。

三、負(fù)載均衡配置
注意點(diǎn):
1,新裝的Linux可能只允許訪問(wèn)80端口,其他端口不允許訪問(wèn),此時(shí)需要配置防火墻
2,nginx+php環(huán)境訪問(wèn)顯示access denied 解決辦法:將php.ini中cgi.fix_pathinfo從0改為1。
3,fastcgi_pass有兩種配置,unix:/tmp/php-cgi.sock 和 127.0.0.1:9000; 默認(rèn)是前者
1,第一臺(tái)服務(wù)器192.168.204.133的Nginx配置:
其中192.168.204.133:80提供代理服務(wù),負(fù)責(zé)分發(fā)用戶發(fā)送的請(qǐng)求到集群節(jié)點(diǎn),192.168.204.133:8080提供真實(shí)服務(wù),為一個(gè)集群節(jié)點(diǎn)
#nginx進(jìn)程數(shù),建議設(shè)置為等于CPU總核心數(shù)。該配置的數(shù)值越大,Nginx的并發(fā)能力就越強(qiáng)
worker_processes auto;
worker_cpu_affinity auto;
#全局錯(cuò)誤日志定義類(lèi)型,[ debug | info | notice | warn | error | crit ]
error_log /home/wwwlogs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid; #進(jìn)程pid文件
worker_rlimit_nofile 51200; #指定進(jìn)程可以打開(kāi)的最大描述符:數(shù)目
events
{
use epoll;
worker_connections 51200;#數(shù)值越大,并發(fā)能力越強(qiáng)
multi_accept off;
accept_mutex off;
}
http
{
include mime.types; #引入一個(gè)外部文件: ./mine.types 該文件放著大量的媒體類(lèi)型
default_type application/octet-stream;
# 負(fù)載服務(wù)器節(jié)點(diǎn)
upstream my-server
{
server 192.168.204.133:8080;
server 192.168.204.134:80;
}
# 代理服務(wù)器配置:
server
{
listen 80; #監(jiān)聽(tīng)的端口
server_name _; #訪問(wèn)域名
location /
{
proxy_pass http://my-server/; #配置想要分發(fā)到的節(jié)點(diǎn)
}
}
# 服務(wù)器節(jié)點(diǎn)192.168.204.133:8080 配置:
server
{
listen 8080; #監(jiān)聽(tīng)的端口
server_name _; #訪問(wèn)域名
index index.html index.php; #默認(rèn)訪問(wèn)的文件
root /home/wwwroot/default/balance; #網(wǎng)站根目錄
location /
{
index index.html index.php;
}
#命中php文件,交由php-cgi處理,非PHP應(yīng)用忽略以下配置
location ~ \.php(.*)$
{
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
}
2,第二臺(tái)服務(wù)器192.168.204.134的Nginx配置:
worker_processes auto;
worker_cpu_affinity auto;
error_log /home/wwwlogs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept off;
accept_mutex off;
}
http
{
include mime.types;
default_type application/octet-stream;
# 服務(wù)器節(jié)點(diǎn)192.168.204.134 配置:
server
{
listen 80; #監(jiān)聽(tīng)的端口
server_name _; #訪問(wèn)域名
index index.html index.php; #默認(rèn)訪問(wèn)的文件
root /home/wwwroot/default; #網(wǎng)站根目錄
location /
{
index index.html index.php;
}
#命中php文件,交由php-cgi處理,非PHP應(yīng)用忽略以下配置
location ~ \.php(.*)$
{
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
#include vhost/*.conf;
}
然后我們打開(kāi)兩個(gè)瀏覽器窗口模擬兩個(gè)請(qǐng)求,共同訪問(wèn) 192.168.204.133 ,可以看,一個(gè)請(qǐng)求分發(fā)到了192.168.204.133:8080,一個(gè)請(qǐng)求分發(fā)到了192.168.204.134:80,此時(shí),負(fù)載均衡配置完成。
