Nginx編譯安裝+配置websocket負載均衡


Nginx編譯安裝+配置websocket負載均衡

目錄

 

  • 一. 安裝nginx

  • 二. 啟動nginx

  • 三. 配置websocket負載均衡

 

一. 安裝nginx

 

1.1 准備一台Ubuntu主機

我選擇了通過microsoft store安裝的Ubuntu 18.04 LTS

1.2 安裝依賴

依次執行下面的5條命令, 安裝所有的依賴

sudo apt-get install build-essential

sudo apt-get install libtool  

sudo apt-get install libpcre3 libpcre3-dev

sudo apt-get install zlib1g-dev

sudo apt-get install openssl libssl-dev

1.3 下載nginx

  • 進入opt目錄
cd /opt
  • 下載nginx, 將最后的版本號1.18.0, 替換為你需要的版本號即可
sudo wget http://nginx.org/download/nginx-1.18.0.tar.gz

注: 通過wget下載可能需要FQ, 如果下載失敗, 可以直接登錄http://nginx.org/下載對應的版本源碼, 通過ftp等方法拷貝至/opt目錄, 並修改其權限

  • 解壓縮, 記得替換為你的版本號
sudo tar -xzvf nginx-1.18.0.tar.gz
  • 改名字, 記得替換為你的版本號
sudo mv nginx-1.18.0 nginx

1.4 安裝nginx

  • 進入nginx目錄
cd /opt/nginx
  • 配置nginx configure

注意:

執行本命令前需要仔細檢查粘貼后的結果, 所有空格都為英文的空格, prefix和兩個with之前, 都是兩個英文的橫杠, 即--

執行完畢后, 需要仔細檢查命令行輸出, 確保沒有任何警告或錯誤

--prefix指定了安裝目錄, 即/usr/local/nginx

sudo ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
  • 安裝nginx

注意: makemake install前都需要加上sudo, 否則會因為內部執行mkdir時權限錯誤, 導致安裝失敗

sudo make && sudo make install

此時nginx已經被安裝到了/usr/local/nginx目錄中

 

二.啟動nginx

 

  • 進入nginx啟動目錄
cd /usr/local/nginx/sbin
  • 啟動nginx
sudo ./nginx

啟動nginx

  • 檢查nginx是否已經啟動
sudo ps -ef | grep nginx

啟動成功:
nginx啟動成功

  • 瀏覽器訪問nginx

nginx默認監聽80端口

通過瀏覽器訪問localhost:80, 即可看到如下頁面:

localhost:80頁面

 

三.配置websocket負載均衡

 

3.1 找到nginx的配置文件

sudo /usr/local/nginx/sbin/nginx -t

這條命令的主要作用是檢查nginx的配置文件格式是否正確, 在這里, 我們利用控制台打印的信息, 獲取了nginx的配置文件路徑:

/usr/local/nginx/conf/nginx.conf

注意: 配置文件的路徑並不是/opt/nginx/conf/nging.conf, 那個是源碼里的默認配置文件, 修改它是沒有用的

配置文件路徑

  • 備份配置文件

進入配置文件路徑

cd /usr/local/nginx/conf

備份配置文件 (修改文件前先備份是好習慣, 使用mv而不是rm也是一個好習慣)

sudo cp nginx.conf nginx.conf_backup
  • 打開配置文件
sudo vim nginx.conf

默認配置文件

3.2 修改配置文件, 實現websocket負載均衡

需要修改的內容如下, 完整的配置文件在本文最后

upstream websocket {
        server localhost:10215;
        server localhost:10222;
    }
location / {
    #root   html;
    #index  index.html index.htm;

    # 名字和upstream的名字保持一致即可
    proxy_pass http://websocket;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}
  • 配置文件解讀:

nginx繼續監聽80端口(你也可以修改為別的端口)

對80端口的訪問, 都會應用名為websocket的代理配置

websocket中, 配置了兩個地址, 即localhost:10215localhost:10222

根據websocket的默認配置, 將采用輪循的方式實現負載均衡

每個請求按時間順序輪流轉發至不同的服務器, 如果應用服務器宕機, 自動剔除, 剩下的繼續輪詢.

你也可以通過配置websocket, 以權重ip-哈希算法的方式來實現負載均衡.

新配置文件

3.3 重新加載nginx配置文件

  • 檢查配置文件, 確保格式正確
sudo /usr/local/nginx/sbin/nginx -t
  • 重新加載配置文件

注: 執行命令后, 沒有消息就是好消息

sudo ./nginx -s reload

此時, websocket負載均衡配置完畢並且已經啟動了服務.

所有對localhost:80的訪問, 都會被轉發至localhost:10215localhost:10222

附1 關閉nginx的方法

sudo ./nginx -s stop

另一種方法是直接殺死nginx進程, 進程pid通過sudo ps -ef | grep nginx查詢

sudo kill nginx的pid

附2 nginx.conf

#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"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    # 名字和proxy_pass保持一致即可
    # websocket server地址
    upstream websocket {
        server localhost:10215;
        server localhost:10222;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            #root   html;
            #index  index.html index.htm;

            # 名字和upstream的名字保持一致即可
            proxy_pass http://websocket;

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }

        #error_page  404              /404.html;

        # 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  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 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM