一、環境
Linux、Docker
二、安裝nginx
1、下載nginx鏡像
拉取nginx鏡像:docker pull nginx
查看nginx鏡像:docker images
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
進入nginx容器內部:docker exec -it
nginx_test bash比如我們更改了nginx配置文件,則可以先進入容器內部,測試配置文件更改是否正確:
docker exec -it nginx_test bash
nginx -t
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