前景提要
之前的博客都是单机的,现在想在多台服务器上进行部署,一台是国外的,一台是国内的,那么能否国内的请求访问时走国内的服务器,而国外的请求走国外的服务器呢,这样既可以降低延迟,还可以降低压力。
答案是可以的。因为服务器是通过 nginx 进行负载均衡的,所以打算通过 nginx 的 fair 模块(第三方)来实现负载均衡,fair 采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、响应时间智能的进行负载均衡 。
由于 nginx 我也是通过 docker 进行部署的,所以对于之前的已经部署的 nginx 需要进行移除,重新 build 自定义的 nginx 带 fair 模块的
操作步骤
在停止之前的 nginx 之前,我们可以先进行 build 自定义的 nginx 镜像,到时候只需要停止之前那个,启动新的就完成替换,非常的简单。
构建自定义 nginx 镜像
在用户目录下,创建一个 nginx 专用的文件夹
mkdir nginx_ws
提前下载 fair 模块包,和 nginx 安装包
wget http://nginx.org/download/nginx-1.18.0.tar.gz
都放在刚刚创建的文件夹下
添加 Dockerfile
touch Dockerfile
对 Dockerfile 添加内容
FROM centos:7.8.2003
MAINTAINER runnable.run
# 添加本地文件
ADD nginx-1.18.0.tar.gz /usr/local/src
ADD nginx-upstream-fair-master.zip /usr/local/src
# 进入指定目录
WORKDIR /usr/local/src
# 安装unzip工具,并解压fair模块
RUN yum install -y unzip && unzip nginx-upstream-fair-master.zip
# 进入指定目录
WORKDIR /usr/local/src/nginx-1.18.0
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel \
&& yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel \
&& useradd -M -s /sbin/nologin nginx && BUILD_CONFIG="--prefix=/usr/local/nginx \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-stream \
--with-http_v2_module \
--with-threads \
--add-module=/usr/local/src/nginx-upstream-fair-master" && ./configure $BUILD_CONFIG \
&& mkdir -p /var/cache/nginx && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
这里对其中的命令进行解释
FROM:指定基础镜像,必须为第一个命令
MAINTAINER: 维护者信息
ADD:将本地文件添加到容器中,tar 类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似 wget
WORKDIR:工作目录,类似于 cd 命令
RUN:构建镜像时执行的命令
ENV:设置环境变量
EXPOSE:指定于外界交互的端口
ENTRYPOINT:配置容器,使其可执行化。配合 CMD 可省去"application",只使用参数。
CMD:构建容器后调用,也就是在容器启动时才进行调用。
进行构建
docker build -t centos7.8_nginx1.18:v1 .
执行成功信息
当出现以下信息时,表示成功
Successfully built f91ed12a53e7
先启动一个最简单的 nginx 进行复制配置文件
docker run --name nginx -p 8081:80 -d --rm docker run --name nginx -p 80:80 -d --rm nginx
复制容器中的配置文件到指定目录
docker cp nginx:/usr/local/nginx/conf/nginx.conf /root/nginx_ws/dockerData/nginx/conf/nginx.conf
删除刚刚创建的容器,因为在创建该容器的时候已经添加了 --rm
,所以只要停止就可以自动删除
docker stop nginx
修改配置文件
供参考配置文件
#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;
upstream blogServer {
fair;
#server ip1:8080;
server ip2:8080;
}
server {
listen 443;
server_name runnable.run;
ssl on;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
ssl_certificate /ssl/6349085_www.runnable.run.pem;
ssl_certificate_key /ssl/6349085_www.runnable.run.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://blogServer;
error_page 404 https://www.runnable.run;
}
error_page 404 https://www.runnable.run;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server{
listen 80;
server_name runnable.run;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
rewrite ^(.*) https://$host$1 permanent;
}
server {
listen 443;
server_name www.runnable.run;
ssl on;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
ssl_certificate /ssl/6349085_www.runnable.run.pem;
ssl_certificate_key /ssl/6349085_www.runnable.run.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://blogServer;
error_page 404 https://www.runnable.run;
}
error_page 404 https://www.runnable.run;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server{
listen 80;
server_name www.runnable.run;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
rewrite ^(.*) https://$host$1 permanent;
}
}
通过自定义镜像进行启动
docker run -d -p 80:80 -p 443:443 --name nginx \
-v /root/nginx_ws/dockerData/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf \
-v /root/nginx_ws/dockerData/nginx/ssl:/ssl/ \
-v /root/nginx_ws/dockerData/nginx/www:/usr/share/nginx/html \
centos7.8_nginx1.18:v1
参考内容
本文参考了以下文章
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于