前言
今天在專題收錄一篇關(guān)于ngixn與apache2實(shí)現(xiàn)負(fù)載均衡的文章,仔細(xì)看了一遍,有些地方存在錯(cuò)誤,記得之前搭建過這樣的環(huán)境,今天呢,好好記錄分享一下。
nginx & apache
簡單說說它倆的優(yōu)點(diǎn)
- nginx的并發(fā)量高、占用資源少,適用于前端或靜態(tài)服務(wù)
- apache服務(wù)超級穩(wěn)定,適用于后端或動(dòng)態(tài)服務(wù)
nginx & apache協(xié)作流程
一般而言,我們可以使用nginx以及apache實(shí)現(xiàn)集群服務(wù)器負(fù)載均衡,具體如何實(shí)現(xiàn)的呢?它們的工作流程又是如何的呢?
- 第一步:客戶端訪問服務(wù)器的時(shí)候?qū)?huì)先訪問nginx服務(wù)器
- 第二步:nginx接受客戶端請求后將會(huì)將請求轉(zhuǎn)發(fā)到apache
- 第三步:apache接收nginx的轉(zhuǎn)發(fā)請求將會(huì)處理請求
- 第四步:apache將處理后的請求返回客戶端,完成一次訪問

Nginx的upstream分發(fā)機(jī)制
upstream按照輪詢(默認(rèn))方式進(jìn)行負(fù)載,每個(gè)請求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動(dòng)剔除。雖然這種方式簡便、成本低廉。但缺點(diǎn)是:可靠性低和負(fù)載分配不均衡。適用于圖片服務(wù)器集群和純靜態(tài)頁面服務(wù)器集群?;居腥缦聨追N:
- 輪詢( 默認(rèn) )
適用于圖片服務(wù)器集群和純靜態(tài)頁面服務(wù)器集群。
upstream balance{
server localhost:8080;
server localhost:8081;
server localhost:8082;
... ...
}
- 指定權(quán)重
權(quán)重weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況。
upstream balance{
server localhost:8080 weight=5;
server localhost:8081 weight=10;
server localhost:8082 weight=15;
... ...
}
- IP綁定 ip_hash
每個(gè)請求按訪問ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決session的問題
upstream balance {
ip_hash;
server localhost:8080;
server localhost:8081;
server localhost:8082;
... ...
}
- fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來分配請求,響應(yīng)時(shí)間短的優(yōu)先分配。
upstream balance {
fair;
server localhost:8080;
server localhost:8081;
server localhost:8082;
... ...
}
nginx & apache安裝
# 對于安裝不多說(基于debian/ubuntu)
sudo apt-get install apache2 nginx -y
重點(diǎn)將在如下
對于更多的負(fù)載均衡理論可以自行搜索,這里旨在實(shí)踐配置。
環(huán)境場景
為了方便配置,所有的服務(wù)都是安裝在同一臺(tái)機(jī)器上面。
Apache版本:Apache/2.4.7 (Ubuntu)
Nginx版本: nginx/1.4.6 (Ubuntu)
- nginx服務(wù)器只需要一臺(tái)服務(wù)器即可,它的http服務(wù)器的端口使用默認(rèn)的80,
- apache啟動(dòng)多個(gè)端口,模擬多臺(tái)服務(wù)器的80端口。端口分別為8001、8002、8003、8004。
- 我們將客戶端的請求通過nginx分別按照指定的分發(fā)機(jī)制轉(zhuǎn)發(fā)到apache的8001、8002、8003、8004端口。
- nginx采取權(quán)重的分發(fā)機(jī)制
配置Apache
前提:將默認(rèn)的80端口關(guān)閉,因?yàn)?0端口將為nginx所用。將默認(rèn)的000-default.conf.bak重命后綴名即可(非conf)。
(1) 開啟端口監(jiān)聽允許
在apache端口蔣婷配置文件/etc/apache2/ports.conf添加如下信息,記得關(guān)閉80端口監(jiān)聽。
Listen 8001
Listen 8002
Listen 8003
Listen 8004
(2) 配置虛擬目錄映射
個(gè)人習(xí)慣,將每一個(gè)虛擬目錄配置寫一個(gè)配置文件,在這里將新建四個(gè)conf文件,對應(yīng)的配置如下:
/etc/apache2/ites-enabled/8001.conf
<VirtualHost *:8001>
ServerAdmin localhost:8001
DocumentRoot /home/alic/www/proxy/8001
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
/etc/apache2/ites-enabled/8002.conf
<VirtualHost *:8002>
ServerAdmin localhost:8002
DocumentRoot /home/alic/www/proxy/8002
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
剩下的8003.conf、8004.conf就不多說了!
(3) 重啟Apache,沒有問題瀏覽器就可以直接打開各個(gè)端口的訪問了
sudo service nginx restart
配置Nginx
(1) upstream
定義一個(gè)upstream變量,即定義接收轉(zhuǎn)發(fā)的服務(wù)器
/etc/nginx/sites-enabled/default
#代理轉(zhuǎn)發(fā)地址
upstream balance{
server localhost:8001 weight=5;
server localhost:8002 weight=10;
server localhost:8003 weight=15;
server localhost:8004 weight=20;
}
(2) server
配置監(jiān)聽80端口的server,將請求轉(zhuǎn)發(fā)到upstream
/etc/nginx/sites-enabled/default
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name localhost;
location / {
try_files $uri $uri/ =404;
#修改proxy_pass這里即可
proxy_pass http://balance;
}
(3) 重啟nginx
sudo service nginx restart
至此,已經(jīng)配置完成了,我們可以檢驗(yàn)檢驗(yàn)?。?!
? ~ curl 127.0.0.1
I am proxy apache2 port 8003
? ~ curl 127.0.0.1
I am proxy apache2 port 8004
? ~ curl 127.0.0.1
I am proxy apache2 port 8004
? ~ curl 127.0.0.1
I am proxy apache2 port 8001
? ~ curl 127.0.0.1
I am proxy apache2 port 8001
? ~ curl 127.0.0.1
I am proxy apache2 port 8002
... ...
Alic say : ****價(jià)值源于技術(shù),貢獻(xiàn)源于分享****