學習Express之nginx配置負載均衡
來自: http://my.oschina.net/songzhu/blog/610376
關于 express-demo
雖然 PM2 已有負載均衡的功能,但是他只對多進程之間進行處理,如果是多個服務器之間,就無法辦到了,這里我們選用nginx。
服務器準備
s0:CentOS,172.16.70.175,nginx 服務器
s1:CentOS,172.16.70.174,web 服務器
s2:CentOS,172.16.70.173,web 服務器
1、配置 s1,s2
由于之前已有說明,這不再細說。參考:http://my.oschina.net/songzhu/blog/610337
修改 s1 服務器的 config.js 內容為:
var config = { server:"172.16.70.174" }; module.exports = config;
重啟 web
pm2 restart pm2-start.json
修改 s2 服務器的 config.js 內容為:
var config = { server:"172.16.70.173" }; module.exports = config;
重啟 web
pm2 restart pm2-start.json
2、配置 s0
安裝 nginx
$ rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.8.0-1.el7.ngx.x86_64.rpm
啟動 nginx
$ service nginx start
驗證
$ curl http://localhost/
配置負載均衡,編輯 /etc/nginx/nginx.conf,在 http 節點里面增加以下內容:
upstream web-server { server 172.16.70.173:3000; server 172.16.70.174:3000; } server { listen 80; server_name my.server.com; location / { proxy_pass http://web-server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
完整的 /etc/nginx/nginx.conf 內容如下:
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/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"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; upstream web-server { server 172.16.70.173:3000; server 172.16.70.174:3000; } server { listen 80; server_name my.server.com; location / { proxy_pass http://web-server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
編輯完成之后,重啟 nginx
$ service nginx restart
修改本地hosts文件,增加:172.16.70.175 my.server.com
在本地執行:
$ curl http://my.server.com/ <!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express on 172.16.70.173</p></body></html> $ curl http://my.server.com/ <!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express on 172.16.70.174</p></body></html> $ curl http://my.server.com/ <!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express on 172.16.70.173</p></body></html> $ curl http://my.server.com/ <!DOCTYPE html><html><head><title>Express</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Express</h1><p>Welcome to Express on 172.16.70.174</p></body></html>
結果和預期一樣,nginx 成功將請求平均分配到兩臺服務器上了。
3、遇到的問題
502 bag getway.
通過查看錯誤日志:
$ cat /var/log/nginx/error.log
發現具體的錯誤是:connect() to 172.16.70.174:3000 failed (13: Permission denied) while connecting to upstream, client: 172.16.70.9, server: my.server.com, request: "GET / HTTP/1.1", upstream: "http://172.16.70.174:3000/", host: "my.server.com:80"
解決辦法是,執行以下命令
$ sudo setsebool -P httpd_can_network_connect 1 $ service nginx restart
解決錯誤參考網址:http://blog.frag-gustav.de/2013/07/21/nginx-selinux-me-mad/
項目代碼:https://git.oschina.net/cavintang/express-demo.git