學習Express之nginx配置負載均衡

AvaMAS 9年前發布 | 29K 次閱讀 Web服務器

來自: http://my.oschina.net/songzhu/blog/610376


關于 express-demo

關于 部署 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


 本文由用戶 AvaMAS 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!