1. 程式人生 > 其它 >代理伺服器與負載均衡

代理伺服器與負載均衡

內容概要

  • 代理
  • 負載均衡

內容詳細

一、代理

將流量平均分配

1、什麼是代理伺服器

客戶機在傳送請求時,不會直接傳送給目的主機,而是先發送給代理伺服器,接受客戶機請求之後,再向主機發出,並接收目的主機響應回來的資料,資料存放在代理伺服器的硬碟中,再發送給客戶機。

2、為什麼要用代理伺服器

1、提高訪問速度

由於目標主機返回的資料會存放在代理伺服器的硬碟中,因此下一次客戶再訪問相同的站點資料時,會直接從代理伺服器的硬碟中讀取,起到了快取的作用,尤其對於熱門站點能明顯提高請求速度。

2、防火牆作用

由於所有的客戶機請求都必須通過代理伺服器訪問遠端站點,因此可在代理伺服器上設限,過濾某些不安全資訊。

3、通過代理伺服器訪問不能訪問的目標站點( VPN 的作用)

網際網路上有許多開發的代理伺服器,客戶機在訪問受限時,可通過不受限的代理伺服器訪問目標站點,通俗說,我們使用的FQ瀏覽器就是利用了代理伺服器,雖然不能出國,但也可直接訪問外網。

3、正向代理 & 反向代理

正向代理

客戶機必須指定代理伺服器

正向代理,架設在客戶機與目標主機之間,只用於代理內部網路對Internet的連線請求,客戶機必須指定代理伺服器,並將本來要直接傳送到Web伺服器上的http請求傳送到代理伺服器中。

反向代理

緩衝經常被請求的頁面來緩解伺服器的工作量

反向代理伺服器架設在伺服器端,通過緩衝經常被請求的頁面來緩解伺服器的工作量,將客戶機請求轉發給內部網路上的目標伺服器;並將從伺服器上得到的結果返回給Internet上請求連線的客戶端,此時代理伺服器與目標主機一起對外表現為一個伺服器。

Nginx作為近年來較火的反向代理伺服器,安裝在目的主機端,主要用於轉發客戶機請求,後臺有多個http伺服器提供服務,nginx的功能就是把請求轉發給後面的伺服器,決定哪臺目標主機來處理當前請求。

4、Nginx 代理服務支援的協議

ngx_http_uwsgi_module		: Python		< --
ngx_http_fastcgi_module		: PHP 
ngx_http_scgi_module		: Java
ngx_http_v2_module			: Golang
ngx_http_proxy_module		: HTTP			< --

二、Nginx 代理實踐

lb01  --->  web01

1、部署 web01 的 Nginx 服務

[root@web01 conf.d]# cat game5.conf 
server {
    listen 80;
    server_name 192.168.15.7;
    location / {
        root /opt/Super_Marie;
	index index.html;
    }
    location ~ /images {
        root /opt/image;
    }
}

2、部署 lb01 的 Nginx 服務

首先需要編譯安裝 Nginx 軟體,因為在 lb01 中需要做負載均衡,yum 安裝的 nginx 不支援負載均衡,只能使用編譯安裝

編譯安裝 Nginx

# 下載Nginx原始碼包
[root@lb01 ~]# wget https://nginx.org/download/nginx-1.20.2.tar.gz

# 解壓
[root@lb01 ~]# tar -xf nginx-1.20.2.tar.gz

# 進入原始碼目錄
[root@lb01 ~]# cd nginx-1.20.2

# 安裝依賴包
[root@lb01 nginx-1.20.2]# yum install openssl openssl-devel zlib zlib-devel -y

# 設定編譯引數(啟用相應的模組:壓縮、TCP服務、ssl加密證書)
[root@lb01 nginx-1.20.2]# ./configure  --with-http_gzip_static_module    --with-stream     --with-http_ssl_module

# 編譯
[root@lb01 nginx-1.20.2]# make 

# 安裝
[root@lb01 nginx-1.20.2]# make install 

# 編譯安裝後,為了方便使用 nginx 命令,在環境變數中新增 nginx 執行檔案的路徑
/usr/local/nginx/sbin

環境變數檔案:
	vim /root/.bash_profile
	
	PATH=$PATH:$HOME/bin:$HOME/usr/local/nginx/sbin

為了讓編譯安裝的 Nginx 使用起來與 yum 安裝的配置目錄一致,可以修改目錄,優化目錄

優化

# 模擬 yum 安裝
[root@lb01 nginx]# mkdir /etc/nginx
[root@lb01 nginx]# mv /usr/local/nginx/conf/* /etc/nginx/
[root@lb01 nginx]# mkdir /etc/nginx/conf.d
# 清空原有 nginx配置檔案,並抄襲一份yum安裝的配置
[root@lb01 nginx]# >nginx.conf

[root@lb01 nginx]# groupadd www -g 666
[root@lb01 nginx]# useradd www -u 666 -g 666 -M -r -s /sbin/nologin

# 在 yum 安裝中 /usr/lib/systemd/system/ 目錄下應該有 nginx.service 檔案
[root@lb01 nginx]# vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"

[Install]
WantedBy=multi-user.target

[root@lb01 sbin]# ln -s /etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf
[root@lb01 sbin]# mv /usr/local/nginx/sbin/nginx /usr/sbin/ (把nginx啟動檔案轉移一份到sbin目錄下,確保nginx.service執行成功)
[root@lb01 sbin]# mkdir /var/log/nginx
[root@lb01 sbin]# systemctl start nginx 

三、Nginx 代理常用引數

1、添加發往後端伺服器的請求頭資訊

Syntax:    proxy_set_header field value;
Default:    proxy_set_header Host $http_host;
            proxy_set_header Connection close;
Context:    http, server, location
 
# 使用者請求的時候HOST的值是linux.proxy.com, 那麼代理服務會像後端傳遞請求的還是linux.proxy.com
proxy_set_header Host $http_host;
# 將$remote_addr的值放進變數X-Real-IP中,$remote_addr的值為客戶端的ip
proxy_set_header X-Real-IP $remote_addr;
# 客戶端通過代理服務訪問後端服務, 後端服務通過該變數會記錄真實客戶端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

2、代理到後端的TCP連線、響應、返回等超時時間

#nginx代理與後端伺服器連線超時時間(代理連線超時)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
 
#nginx代理等待後端伺服器的響應時間
Syntax:    proxy_read_timeout time;
Default:    proxy_read_timeout 60s;
Context:    http, server, location
 
#後端伺服器資料回傳給nginx代理超時時間
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;

3、proxy_buffer 代理緩衝區

#nignx會把後端返回的內容先放到緩衝區當中,然後再返回給客戶端,邊收邊傳, 不是全部接收完再傳給客戶端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
 
#設定nginx代理儲存使用者頭資訊的緩衝區大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
 
#proxy_buffers 緩衝區
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

4、配置代理優化檔案

[root@lb01 ~]# vim /etc/nginx/proxy_params 
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 10s;
proxy_read_timeout 10s;
proxy_send_timeout 10s;
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;

[root@lb01 conf.d]# cat game.conf 
server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://172.16.1.7:80;
        include /etc/nginx/proxy_params;
    }
}

四、負載均衡

當一臺伺服器的效能達到極限時,我們可以使用伺服器叢集來提高網站的整體效能。那麼,在伺服器叢集中,需要有一臺伺服器充當排程者的角色,使用者的所有請求都會首先由它接收,排程者再根據每臺伺服器的負載情況將請求分配給某一臺後端伺服器去處理。

    那麼在這個過程中,排程者如何合理分配任務,保證所有後端伺服器都將效能充分發揮,從而保持伺服器叢集的整體效能最優,這就是負載均衡問題。

通過代理將流量按照一定的比例,轉發到後端。

1、負載均衡的實現

1、反向代理

# 把指定的伺服器地址改成連線池
server {
   	listen 80;
   	server_name _;
   	location / {
        proxy_pass http://[連線池];
   	}
}

2、IP 連線池

# 盛放所有的web伺服器

upstream [連線池名稱] {
    server [ip]:[port];
    server [ip]:[port];
    server [ip]:[port];
}

3、在負載均衡伺服器 lb01 上部署(例項)

[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 supermaro {
	server 172.16.1.7:80;
	server 172.16.1.8:80;
	server 172.16.1.9:80;
}

2、權重

# Nginx 中權重0-100,數字越大,權重越高。
upstream supermaro {
	server 172.16.1.7:80 weight=9;
	server 172.16.1.8:80 weight=10;
	server 172.16.1.9:80 weight=11;
}

3、ip_hash

# 每一個IP固定訪問某一個後端
upstream supermaro {
	server 172.16.1.7:80;
	server 172.16.1.8:80;
	server 172.16.1.9:80;
	ip_hash;
}

3、負載均衡後端狀態

狀態 概述
down 當前的server暫時不參與負載均衡
backup 預留的備份伺服器
max_fails 允許請求失敗的次數
fail_timeout 經過max_fails失敗後, 服務暫停時間

1、down

# 暫時不分配流量

upstream supermaro {
    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://supermaro;
        include /etc/nginx/proxy_params;
    }
}

2、backup

# 只有當所有的伺服器全部宕機,才能啟動

upstream supermaro {
    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://supermaro;
        include /etc/nginx/proxy_params;
    }
}

3、max_fails、fail_timeout

# proxy_next_upstream 後端錯誤標識

upstream supermaro {
    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://supermaro;
        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、部署後端服務(三個web伺服器)

1、部署python

1、建立使用者
[root@web02 opt]# groupadd django -g 888
[root@web01 opt]# useradd django -u 888 -g 888 -r -M -s /bin/sh

2、安裝依賴軟體
[root@web02 opt]# yum install python3 libxml* python-devel gcc* pcre-devel openssl-devel python3-devel -y

2、部署Django和uwsgi

3、安裝Django和uwsgi
[root@web01 opt]# pip3 install django==1.11
[root@web01 opt]# pip3 install uwsgi
[root@web01 opt]# pip3 install pymysql

4、建立專案
[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

3、配置並啟動

5、編輯專案配置檔案
[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

6、啟動uwsgi
[root@web01 linux]# uwsgi -d --ini myweb_uwsgi.ini --uid 666

-d 	  : 以守護程序方式執行
--ini : 指定配置檔案路徑
--uid : 指定uid

TCP 服務

7、編輯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;
    }
}

8、重啟Nginx配置
systemctl restart nginx

2、部署負載均衡

[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;
    }
}

附錄

一.什麼是openssl

1.1    OpenSSL是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的金鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程式供測試或其它目的使用。在OpenSSL被曝出現嚴重安全漏洞後,發現多數通過SSL協議加密的網站使用名為OpenSSL的開源軟體包。由於這是網際網路應用最廣泛的安全傳輸方法,被網銀、線上支付、電商網站、入口網站、電子郵件等重要網站廣泛使用,所以該漏洞影響範圍廣大。