Linux之負載均衡
阿新 • • 發佈:2022-01-06
負載均衡的實現
通過代理將流量按照一定的比例,轉發到後端
負載均衡的實現
1、實現
將後端服務打包成一個IP連線池。 1、反向代理 server { listen 80; server_name _; location / { proxy_pass http://[連線池]; } } 2、IP連線池 upstream [連線池名稱] { server [ip]:[port]; server [ip]:[port]; server [ip]:[port]; } [root@lb01 conf.d]#cat game.conf upstream supermarie { server 172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; } server { listen 80; server_name _; location / { proxy_pass http://supermarie; include /etc/nginx/proxy_params; } }
2、負載均衡的比例
1、輪詢
# 預設情況下,Nginx負載均衡的輪詢狀態。 upstream supermarie { server172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; }
2、權重
# Nginx中的權重0-100,數字越大,權重越高。 upstream supermarie { server 172.16.1.7:80 weight=9; server 172.16.1.8:80 weight=5; server 172.16.1.9:80 weight=1; }
3、ip_hash
# 每一個IP固定訪問某一個後端。 upstream supermarie { server 172.16.1.7:80; server 172.16.1.8:80; server 172.16.1.9:80; ip_hash; }
負載均衡後端狀態
1、down
# 暫時不分配流量 upstream supermarie { server 172.16.1.7:80 down; server 172.16.1.8:80; server 172.16.1.9:80; } server { listen 80; server_name _; location / { proxy_pass http://supermarie; include /etc/nginx/proxy_params; } }
2、backup
# 只有當所有的機器全部宕機,才能啟動。 upstream supermarie { server 172.16.1.7:80 backup; server 172.16.1.8:80; server 172.16.1.9:80; } server { listen 80; server_name _; location / { proxy_pass http://supermarie; include /etc/nginx/proxy_params; } }
3、max_fails、fail_timeout
# max_fails # proxy_next_upstream 後端錯誤標識 [root@lb01 ~]# cat /etc/nginx/conf.d/game.conf upstream supermarie { server 172.16.1.7:80 max_fails=3 fail_timeout=3s; server 172.16.1.8:80 max_fails=3 fail_timeout=3s; server 172.16.1.9:80 max_fails=3 fail_timeout=3s; } server { listen 80; server_name _; location / { proxy_pass http://supermarie; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404; include /etc/nginx/proxy_params; } }
注意:proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; error # 與伺服器建立連線,向其傳遞請求或讀取響應頭時發生錯誤; timeout # 在與伺服器建立連線,向其傳遞請求或讀取響應頭時發生超時; invalid_header # 伺服器返回空的或無效的響應; http_500 # 伺服器返回程式碼為500的響應; http_502 # 伺服器返回程式碼為502的響應; http_503 # 伺服器返回程式碼為503的響應; http_504 # 伺服器返回程式碼504的響應; http_403 # 伺服器返回程式碼為403的響應; http_404 # 伺服器返回程式碼為404的響應; http_429 # 伺服器返回程式碼為429的響應(1.11.13); non_idempotent # 通常,請求與 非冪等 方法(POST,LOCK,PATCH)不傳遞到請求是否已被髮送到上游伺服器(1.9.13)的下一個伺服器; 啟用此選項顯式允許重試此類請求; off # 禁用將請求傳遞給下一個伺服器。
負載均衡部署BBS
1、部署後端服務
部署python
建立使用者 [root@web01 opt]# groupadd django -g 888 [root@web01 opt]# useradd django -u 888 -g 888 -r -M -s /bin/sh 安裝依賴軟體 [root@web01 opt]# yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y
部署Django和uwsgi
安裝Django和uwsgi [root@web01 opt]# pip3 install django==1.11 [root@web01 opt]# pip3 install uwsgi [root@web01 opt]# pip3 install pymysql 建立專案 [root@web01 opt]# unzip bbs.zip [root@web03 bbs]# pwd /opt/bbs [root@web03 bbs]# vim bbs/settings.py ALLOWED_HOSTS = ['*'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'bbs', 'USER': 'root', 'PASSWORD': '123456', 'HOST': '172.16.1.61', 'PORT': 3306, 'CHARSET': 'utf8' } } # 啟動測試 [root@web01 bbs]# python3 manage.py runserver 0.0.0.0:8000
配置並啟動
編輯專案配置檔案 [root@localhost ~]# cat /opt/linux/myweb_uwsgi.ini [uwsgi] # 埠號 socket = :8000 # 指定專案的目錄 chdir = /opt/bbs # wsgi檔案路徑 wsgi-file = bbs/wsgi.py # 模組wsgi路徑 module = bbs.wsgi # 是否開啟master程序 master = true # 工作程序的最大數目 processes = 4 # 結束後是否清理檔案 vacuum = true 啟動uwsgi [root@web01 linux]# uwsgi -d --ini myweb_uwsgi.ini --uid 666 -d : 以守護程序方式執行 --ini : 指定配置檔案路徑 --uid : 指定uid TCP 服務 編輯Nginx配置檔案 [root@localhost ~]# cat /etc/nginx/conf.d/python.conf server { listen 80; server_name py.test.com; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; uwsgi_read_timeout 2; uwsgi_param UWSGI_SCRIPT bbs.wsgi; uwsgi_param UWSGI_CHDIR /opt/bbs; index index.html index.htm; client_max_body_size 35m; } } 重啟Nginx配置 systemctl restart nginx
部署負載均衡
[root@lb01 conf.d]# cat python.conf upstream bbs { server 172.16.1.7:80 max_fails=3 fail_timeout=3s; server 172.16.1.8:80 max_fails=3 fail_timeout=3s; server 172.16.1.9:80 max_fails=3 fail_timeout=3s; } server { listen 80; server_name py.test.com; location / { proxy_pass http://bbs; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404; include /etc/nginx/proxy_params; } }