做服務的負載均衡,你也可以(docker 中部署 nginx)

一、環境

Linux、Docker

二、安裝nginx

1、下載nginx鏡像

拉取nginx鏡像:docker pull nginx

做服務的負載均衡,你也可以(docker 中部署 nginx)

拉取docker鏡像(圖1)

查看nginx鏡像:docker images


做服務的負載均衡,你也可以(docker 中部署 nginx)

docker鏡像(圖2)

2、創建目錄及配置

a、創建目錄

mkdir /home/nginx/{conf,conf.d,logs,cert}

b、配置文件

進入配置目錄:cd /home/nginx

vi conf/nginx.conf,把下面內容拷貝到到nginx.conf文件裡,按esc,輸入 :wq 保存

nginx.conf 配置(位置:conf/nginx.conf)

user nginx; #運行用戶

worker_processes 4; #啟動進程,通常設置成和cpu的數量相等或2倍

#錯誤日誌的存放目錄,日誌級別有dubug,info,notice,warn,error,crit

error_log /var/log/nginx/error.log warn;

pid /var/run/nginx.pid;#指定pid存放路徑

#文件描述符數量,如果不設的話上限就是系統的ulimit –n的數字,一般設置woker_connections的3-4倍 worker_rlimit_nofile 51200;

events {

#使用的網絡I/O模型,Linux系統推薦採用epoll模型,FreeBSD系統推薦採用kqueue模型

use epoll;

multi_accept on;

#允許的連接數

worker_connections 65535;

}

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; #日誌,關閉:access_log off;

sendfile on;

proxy_connect_timeout 3; #默認連接超時時間

proxy_read_timeout 3; #默認讀取超時時間

proxy_send_timeout 3; #默認發送超時時間

client_header_buffer_size 16k;

large_client_header_buffers 4 64k;

client_max_body_size 8m;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 120;

include /etc/nginx/conf.d/*.conf;#包含conf.d目錄下的所有 .conf 文件

}

創建負載均衡默認配置(位置:conf.d/default.conf),可以創建多個,比如一個域名一個配置文件,如api.xxx.com.conf,多個監聽端口,可以配置多個【upstream】和【server】,一個conf文件可以包含多個upstream和server(upstream和server一一對應)

vi conf.d/default.conf ,拷貝以下內容,其中ip地址改成自己的服務器地址,按esc,輸入 :wq 保存

#做負載的服務地址:weight權重 max_fails允許失敗次數 fail_timeout多長時間內

upstream webserver { #webserver:名字自定義

server 172.19.111.151:8007 weight=3 max_fails=3 fail_timeout=30;

server 172.19.111.151:8008 weight=1 max_fails=3 fail_timeout=30;

server 172.19.11.151:8009 backup weight=1 max_fails=3 fail_timeout=30;

}

server {

#監聽端口,可以多個

listen 8000; #監聽8000端口

listen 80; #監聽80端口

#https支持 開始

listen 443 ssl http2; #監聽443端口

#docker中路徑只能在系統路徑中,如/etc/...,否則無法識別,其中“api.test.com”換成自己的證書名稱,同時把證書文件(api.test.com.crt、api.test.com.key)拷貝到 /home/nginx/cert(證書路徑映射位置) 中

ssl_certificate /etc/nginx/cert/api.test.com.crt;

ssl_certificate_key /etc/nginx/cert/api.test.com.key;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_session_timeout 10m;

ssl_session_cache builtin:1000 shared:SSL:10m;

ssl_buffer_size 1400;

add_header Strict-Transport-Security max-age=15768000;

ssl_stapling on;

ssl_stapling_verify on;

#https支持 結束

server_name 172.19.111.150 api.test.com

;#服務器地址或域名,多個用空格隔開,這裡的IP地址一定是主機的ip地址,非容器內部地址

location / {

proxy_pass http://webserver; #上面upstream自定義的名字

proxy_store off;

proxy_redirect off;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_connect_timeout 15; #連接超時(秒)

proxy_send_timeout 300; #發送超時(秒)

proxy_read_timeout 300; #讀取超時(秒)

}

}

3、運行nginx容器

docker run -d -p 80:80 -p 443:443 -p 8000:8000 -p 8003:8003 \

--privileged=true -v /home/nginx/cert:/etc/nginx/cert \ #證書路徑映射

--privileged=true -v /home/nginx/conf.d:/etc/nginx/conf.d \ #配置文件路徑映射

--privileged=true -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ #nginx.conf 文件路徑映射

--privileged=true -v /home/nginx/logs:/var/log/nginx \ #logs文件夾路徑映射

--restart always --name nginx_test nginx[:latest]

run命令說明:

-d:指定容器運行於前臺還是後臺,默認為false

--restart:指定容器停止後的重啟策略:

  • no:容器退出時不重啟
  • on-failure:容器故障退出(返回值非零)時重啟
  • always:容器退出時總是重啟

-p:指定端口映射,格式為:主機(宿主)端口:容器端口,多個端口,可以重複

--name:指定容器名稱

-v: 綁定一個卷,把容器內的路徑映射到主機(宿主)的路徑上

--privileged=true:賦予容器內的root擁有真正的root權限

nginx[:latest]:容器鏡像名稱,latest代表的tag,如果是latest,可以省略

其他命令:

啟用容器:docker start 容器名/容器ID,如:docker start nginx_test

停止容器:docker stop 容器名/容器ID,如:docker stop nginx_test

重啟容器:docker restart 容器名/容器ID,如:docker restart nginx_test

查看容器運行狀態:docker ps -a


做服務的負載均衡,你也可以(docker 中部署 nginx)

容器運行情況(圖3)

進入nginx容器內部:docker exec -it

nginx_test bash

比如我們更改了nginx配置文件,則可以先進入容器內部,測試配置文件更改是否正確:

docker exec -it nginx_test bash

nginx -t


做服務的負載均衡,你也可以(docker 中部署 nginx)

測試nginx配置準確性(圖4)


4、至此服務負載均衡部署完成,通過以下形式能夠訪問你的服務:

http://172.19.111.150/xxx

http://api.test.com/xxx

https://api.test.com/xxx

5、其他

a、主機(宿主)與容器網絡

主機宿主:是指docker所運行的服務器,操作系統可以linuex,也可以是window,它的IP地址是我們能夠直接訪問的

容器網絡:是docker中的網絡,如果沒有映射出來,在容器外訪問不到。

查看docker網絡情況:docker network ls


做服務的負載均衡,你也可以(docker 中部署 nginx)

docker網絡(圖5)


分享到:


相關文章: