手工创建一个带sticky模块的nginx镜像 并且实现容器化负载均衡的方法

最近想进行容器化运行的nginx反向代理负载均衡服务. 找了一下 dockerhub上面的 nginx 发现里面不包含 sticky模块. 会报错为:

nginx: [emerg] unknown directive "sticky" in /etc/nginx/nginx.conf:39

没办法 想了下docker search stricky 发现还是有一个容器的 然后 docker pull 下来. 

docker pull runnable/sticky-nginx

但是发现不太好用, 没办法改用自己之前编译好的二进制进行处理. 

编译nginx的过程 就暂时按下不表, 注意就是 configure 时候需要添加 module 避免无法支持sticky

注意一下我之前是放到了 /nginx 目录下面, 为了简单和防止 日志文件提示异常. 

文件如下:

 需要注意的一点是 dockerfile 里面的内容

FROM centos
WORKDIR /usr/local/nginx
COPY usr /usr
CMD ["sh","startnginx"]

注意 我在当前目录的 usr/local/nginx/ 目录下面添加了一个 startnginx的启动脚本

启动脚本的内容为:

/usr/local/nginx/nginx  -g "daemon off;"

注意 容器化运行 nginx的时候必须增加 

 -g "daemon off;"
官网的解释内容为:
If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!

这里面 我比较省事 直接使用了 一个 usr/local/nginx/nginx.conf

这里面一个比较简单的方向代理的模板为:

worker_processes  auto;
events {
    worker_connections  1024;
}
http {
    client_header_timeout 600;
    client_body_timeout 600;
    client_max_body_size 20m;
    proxy_send_timeout 600;
    proxy_read_timeout 600;
    proxy_http_version 1.1;
    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;   
    server_tokens off; 
    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"'
                      '$upstream_addr $upstream_response_time $request_time ';
    
    sendfile        on;
    keepalive_timeout  65;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 8;
    gzip_types text/plain application/javascript text/css application/json text/javascript image/svg+xml image/png;
    gzip_vary off;

    upstream nginxserver{
        sticky;
        server 10.110.82.184:5200 weight=8 max_fails=1000 fail_timeout=10s;
        server 10.110.82.184:5201 weight=8 max_fails=1000 fail_timeout=10s;
         } 
      
    server {
        listen 8888;
        server_name stickynginx;

        location / {
            proxy_pass  http://nginxserver;
            proxy_http_version 1.1;
            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_set_header X-Forwarded-Proto $scheme;  
           #add_headerCache-Control no-store;            
        }
        
        #wf taskCount
        location ^~ /api/runtime/task/v1.0/tasks/count {
            proxy_pass  http://gscloud/api/runtime/task/v1.0/tasks/count;
            proxy_http_version 1.1;
            proxy_read_timeout 3600s;
            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_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }        
    }
}

然后执行 docker build 以及 docker run 命令就可以 使用了

docker build . -t nginxsticky
docker run -d --net=host --name=nginx --restart=always nginxsticky

手工创建的nginx 比 docker hub 上面的大 但是比 search 出来的带sticky的要小很多

enjoy it!

原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/14256445.html