一牵舵、引言
上次我們體驗(yàn)了Nginx反向代理的使用畸颅,配置是非常簡(jiǎn)單的涛癌,一句配置搞定种吸。這章我們來(lái)講講在Nginx如何使用反向代理+負(fù)載均衡。負(fù)載均衡估計(jì)程序員都聽(tīng)說(shuō)過(guò)恩闻,比如開(kāi)發(fā)一個(gè)電商、web端項(xiàng)目什么后期優(yōu)化需要做負(fù)載均衡侠草,不然同時(shí)10w用戶同時(shí)訪問(wèn)边涕,程序就容易相對(duì)應(yīng)的崩潰。
所謂負(fù)載均衡著隆,是由多臺(tái)服務(wù)器或服務(wù)共同完成一個(gè)功能點(diǎn)浦辨,從而達(dá)到負(fù)載均衡的效果蹬竖。打個(gè)比方:用戶請(qǐng)求發(fā)起一個(gè)請(qǐng)求,網(wǎng)站顯示的圖片量又比較大流酬,如果說(shuō)這個(gè)時(shí)候有N個(gè)用戶同時(shí)訪問(wèn)币厕,那么全部的工作量都放在了一臺(tái)服務(wù)器上,指不定什么時(shí)候就崩潰了康吵。如果說(shuō)有多臺(tái)服務(wù)器平分這個(gè)任務(wù)劈榨,那么這樣就很輕松了,效率也會(huì)有相對(duì)應(yīng)的提高晦嵌。
二同辣、實(shí)現(xiàn)
proxy_pass如何指向多臺(tái)服務(wù)器?
答:把多臺(tái)服務(wù)器用upstream綁定在一起并起一個(gè)組名,然后使用proxy_pass指向該組即可惭载。
小編為了做演示旱函,使用了tomcat發(fā)布了一個(gè)web頁(yè)面,頁(yè)面簡(jiǎn)簡(jiǎn)單單就一張圖片描滔,代碼如下:
<html>
<head>
????<title>welcome</title>
</head>
<body>
????<img src="/images/test.jpg"/>
</body>
</html>
實(shí)現(xiàn)效果:訪問(wèn)這個(gè)頁(yè)面時(shí)棒妨,由多個(gè)服務(wù)來(lái)提供圖片的顯示。
實(shí)現(xiàn)步驟:
1含长、先建立幾個(gè)虛擬主機(jī)券腔,有多少個(gè)服務(wù)提供就可以創(chuàng)建多少個(gè),小編在同一臺(tái)服務(wù)器進(jìn)行演示拘泞,就只創(chuàng)建兩個(gè)了纷纫。端口分別是81、82陪腌,也有分別的日志文件保存辱魁。
? server {
? ? ? ? listen 81;
? ? ? ? server_name localhost;
? ? ? ? location / {
? ? ? ? ? root /var/www;
? ? ? ? ? index index.html;
? ? ? ? }
? ? ? ? access_log logs/access_81.log main;
? }
? server {
? ? ? ? listen 82;
? ? ? ? server_name localhost;
? ? ? ? location / {
? ? ? ? ? root /var/www;
? ? ? ? }
? ? ? ? access_log logs/access_82.log main;
? }
2烟瞧、使用upstream綁定多個(gè)虛擬主機(jī),起名為imgserver染簇。綁定了如上兩個(gè)虛擬主機(jī)参滴,并設(shè)置一系列參數(shù)。
weight = 1 //表示權(quán)重锻弓,意思就是優(yōu)先誰(shuí)來(lái)處理這次請(qǐng)求砾赔,這里小編設(shè)置兩個(gè)都是一樣的。
max_fails = 2 //連接失敗次數(shù)弥咪,如果該地址連接失敗兩次过蹂,則表示該服務(wù)器已經(jīng)掛了,就不會(huì)在分配任務(wù)給它聚至。
fail_timeout = 3 //超時(shí)時(shí)長(zhǎng)酷勺,多久沒(méi)連接上則表示連接失敗
upstream imgserver {
? ? ? ? server 111.231.51.81:81 weight=1 max_fails=2 fail_timeout=3;
? ? ? ? server 111.231.51.81:82 weight=1 max_fails=2 fail_timeout=3;
}
3、proxy_pass 指向該組即可扳躬。
通過(guò)ip訪問(wèn)脆诉,默認(rèn)就是80端口,會(huì)轉(zhuǎn)發(fā)到tomcat發(fā)布的服務(wù)上贷币,如果有請(qǐng)求地址中包含images击胜,則會(huì)由upstream分配給不同的地址處理。 訪問(wèn)地址:http://111.231.51.81/?役纹,最后的效果可以查看不同的日志文件偶摔,則可以區(qū)分是哪一個(gè)處理的請(qǐng)求。
? ? server {
? ? ? ? listen 80;
? ? ? ? server_name 111.231.51.81;
? ? ? ? location /{
? ? ? ? ? ? proxy_pass http://111.231.51.81:8086/;
? ? ? ? }
? ? ? ? location ~* images {
? ? ? ? ? ? proxy_pass http://imgserver;
? ? ? ? }
? ? }
三促脉、整個(gè)配置文件展示辰斋,如果還有不清楚的小伙伴,可以參考一下瘸味,最好自己動(dòng)動(dòng)小手實(shí)戰(zhàn)一遍喲宫仗。以前文章中的實(shí)戰(zhàn)演示也包含在其中了。
#user? nobody;
worker_processes? 1;
#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"';
? ? #tcp_nopush? ? on;
? ? #keepalive_timeout? 0;
? ? keepalive_timeout? 65;
? ? #gzip? on;
? upstream imgserver {
server 111.231.51.81:81 weight=1 max_fails=2 fail_timeout=3;
server 111.231.51.81:82 weight=1 max_fails=2 fail_timeout=3;
? }
? server {
listen 81;
server_name localhost;
location / {
? root /var/www;
}
access_log logs/access_81.log main;
? }
? server {
listen 82;
server_name localhost;
location / {
? root /var/www;
}
access_log logs/access_82.log main;
? }
? server {
listen 80;
server_name www.suyouge.com;
location /{
? proxy_pass http://www.suyouge.com/;
}
? ? }
? ? server {
listen 80;
server_name 111.231.51.81;
location /{
? ? proxy_pass http://111.231.51.81:8086/;
}
location ~* images {
? ? proxy_pass http://imgserver;
}? ?
? ? }
? ? server {
? ? ? ? listen? ? ? 8088;
? ? ? ? server_name? localhost;
? ? ? ? #charset koi8-r;
? ? ? ? #access_log? logs/host.access.log? main;
location / {
? # if ($remote_addr = 116.238.62.103) {
? # return 404;
? #? } ?
? if ($http_user_agent ~ Firefox) {
set $isfox? 1;
? }
? if ($fastcgi_script_name ~ firefox.html){
set $isfox? 0;
? }
? if ($isfox = 1){
rewrite ^.*$ /404.html;break;
? } ?
? ? root /usr/local/nginx/html;
? index index.html index.htm;
}
? ? ? ? # redirect server error pages to the static page /50x.html
? ? ? ? #
? ? ? ? error_page? 500 502 503 504? /50x.html;
? ? ? ? location = /50x.html {
? ? ? ? ? ? root? html;
? ? ? ? }
? ? ? ? # proxy the PHP scripts to Apache listening on 127.0.0.1:80
? ? ? ? #
? ? ? ? #location ~ \.php$ {
? ? ? ? #? ? proxy_pass? http://127.0.0.1;
? ? ? ? #}
? ? ? ? # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
? ? ? ? #
? ? ? ? #location ~ \.php$ {
? ? ? ? #? ? root? ? ? ? ? html;
? ? ? ? #? ? fastcgi_pass? 127.0.0.1:9000;
? ? ? ? #? ? fastcgi_index? t
? ? ? ? #? ? index.php;
? ? ? ? #? ? fastcgi_param? SCRIPT_FILENAME? /scripts$fastcgi_script_name;
? ? ? ? #? ? include? ? ? ? fastcgi_params;
? ? ? ? #}
? ? ? ? # deny access to .htaccess files, if Apache's document root
? ? ? ? # concurs with nginx's one
? ? ? ? #
? ? ? ? #location ~ /\.ht {
? ? ? ? #? ? deny? all;
? ? ? ? #}
? ? }
? ? # another virtual host using mix of IP-, name-, and port-based configuration
? ? #
? ? #server {
? ? #? ? listen? ? ? 8000;
? ? #? ? listen? ? ? somename:8080;
? ? #? ? server_name? somename? alias? another.alias;
? ? #? ? location / {
? ? #? ? ? ? root? html;
? ? #? ? ? ? index? index.html index.htm;
? ? #? ? }
? ? #}
? ? # HTTPS server
? ? #
? ? server {
? ? ? ? listen? ? ? 443;
? ? ? ? server_name? localhost;
? ? ? ? ssl? ? ? ? ? ? ? ? ? on;
? ? ? ? ssl_certificate? ? ? 1_www.suyouge.com_bundle.crt;
? ? ? ? ssl_certificate_key? 2_www.suyouge.com.key;
? ? ? ? ssl_session_timeout? 5m;
? ? ? ? ssl_protocols? SSLv2 SSLv3 TLSv1;
? ? ? ? ssl_ciphers? HIGH:!aNULL:!MD5;
? ? ? ? ssl_prefer_server_ciphers? on;
location / {
? ? ? ? ? ? root? /var/www/html;
? ? ? ? ? ? index? index.html index.htm;
? ? ? ? }
? ? }
}