原文發表於個人博客,轉載請註明出處javascript
一直據說Nginx的強大,它不只能夠做爲Web服務器,按照調度規則實現動態、靜態頁面的分離;還能夠做爲反向代理服務器,構建服務集羣,按輪詢、權重等多種方式對後端服務器作負載均衡。以及自動剔除因故障負載均衡列表中宕機的服務器。這兩天折騰了一下Nginx的安裝、配置,並經過Docker模擬出Nginx在多服務器提供服務的狀態下的負載均衡。html
操做系統 | Docker | Nginx |
---|---|---|
Ubuntu 16 | 1.12.1 | 1.8.0 |
使用Docker這種容器技術,能夠很方便地將所須要的環境打包和快速部署。因此我將Nginx的環境作成Docker鏡像,當須要多個Nginx服務時,只須要經過鏡像啓動多個容器。java
鏡像已經PUSH到Docker Hub上,若是須要,能夠直接在Docker拉取配置好nginx環境的鏡像docker pull raomengnan/ubuntu:nginx-1.8.0
python
raomengnan/ubuntu:nginx-1.8.0 包含的基礎環境: nginx,zsh,vim,ssh,pythonnginx
# Ubuntu with Nginx # Author raomengnan FROM raomengnan/ubuntu-base MAINTAINER raomengnan # 安裝升級gcc RUN rm -rf /var/lib/apt/lists/* RUN apt-get update # 添加相關的src RUN apt-get -y install build-essential RUN apt-get -y install supervisor RUN mkdir -p /usr/local/temp COPY supervisor.conf /etc/supervisor/conf.d/supervisord.conf RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz && tar -zxvf nginx-1.8.0.tar.gz -C /usr/local/temp RUN wget http://zlib.net/zlib-1.2.8.tar.gz && tar -zxvf zlib-1.2.8.tar.gz -C /usr/local/temp RUN wget http://www.openssl.org/source/openssl-1.0.1q.tar.gz && tar -zxvf openssl-1.0.1q.tar.gz -C /usr/local/temp RUN wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz && tar -zxvf pcre-8.37.tar.gz -C /usr/local/temp RUN rm *.tar.gz # 安裝 RUN ls /usr/local/temp/nginx-1.8.0 RUN cd /usr/local/temp/nginx-1.8.0 \ && ./configure --sbin-path=/usr/local/nginx-1.8.0/nginx --conf-path=/usr/local/nginx-1.8.0/nginx.conf --pid-path=/usr/local/nginx-1.8.0/nginx.pid --with-http_ssl_module --with-pcre=/usr/local/temp/pcre-8.37 --with-zlib=/usr/local/temp/zlib-1.2.8 --with-openssl=/usr/local/temp/openssl-1.0.1q \ && make \ && make install # 設置nginx是非daemon啓動,不然nginx沒法啓動 RUN echo "\ndaemon off;" >> /usr/local/nginx-1.8.0/nginx.conf RUN echo 'master_process off;' >> /usr/local/nginx-1.8.0/nginx.conf RUN echo 'error_log logs/error.log;' >> /usr/local/nginx-1.8.0/nginx.conf RUN rm -rf /usr/local/temp/* ENV NGINX_HOME /usr/local/nginx-1.8.0 # 將nginx添加到command update-alternatives --install /usr/bin/nginx nginx /usr/local/nginx-1.8.0/nginx 300 EXPOSE 80 # 使用supervisor來管理多個進程同時啓動 # 若不想使用supervisor,可使用: # CMD nginx $/NGINX_HOME/nginx.conf # 或者進入容器手動啓動nginx CMD ["/usr/bin/supervisord"]
[supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D [program:nginx] command=/usr/local/nginx-1.8.0/nginx -c /usr/local/nginx-1.8.0/nginx.conf
啓動nginx時,能夠提供Nginx的welcome頁面的訪問服務,能夠經過這個頁面簡單地嘗試nginx提供的負載均衡。docker
docker run --name ser1 -p 8881:80 raomengnan/ubuntu:nginx-1.8.0 docker run --name ser2 -p 8882:80 raomengnan/ubuntu:nginx-1.8.0 docker run --name ser3 -p 8883:80 raomengnan/ubuntu:nginx-1.8.0
-p參數將容器的80端口映射到宿主機的888×端口上shell
使用docker inspect ser1
即可以看到容器的詳細信息,其中注意NetworkSetting下的這一段信息就能夠知道容器的網關和ip地址json
"Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.3",
docker exec -it ser1 bash
進入容器內部
nginx安裝目錄在'/usr/local/nginx-1.8.0'下,vim /usr/local/nginx-1.8.0/nginx.conf
編輯配置文件:ubuntu
#user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; client_header_buffer_size 1k; large_client_header_buffers 4 4k; # 配置負載均衡,weight表明權重,權重越高,分配到的可能就越搭 upstream 172.17.0.2 { server 172.17.0.2:8888 weight=5; server 172.17.0.3:80 weight=4; server 172.17.0.4:80 weight=3; } # 配置反向代理 server { listen 80; server_name 172.17.0.2; location /{ # 反向代理的主機頭 proxy_pass http://172.17.0.2; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } # 偵聽本地8888端口,以便爲反向代理到本地的請求提供服務 server { listen 8888; server_name localhost; # 如過沒有對代理的連接形式有特殊要求,能夠直接將root和index寫在server中 location / { root /home/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /home/html; } } }
在ser1這個容器中配置反向代理,要關注server 172.17.0.2:8888 weight=5;
這一行,之因此反向代理到本機的8888端口,很好理解,由於若再次代理到80端口,永遠不能代理到本機的服務中,陷入死循環。vim
#user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; client_header_buffer_size 1k; large_client_header_buffers 4 4k; server { listen 80; server_name 172.17.0.2; # 如過沒有對代理的連接形式有特殊要求,能夠直接將root和index寫在server中 location / { root /home/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /home/html; } } }
serx和ser1的區別就在於http的設置,沒有upstream,server_name 爲要負載的服務器的ip。修改好配置文件後,使用nginx -s reload
從新載入配置。
修改三個ser中的index.html,方便觀察
在瀏覽器中打開 localhost:8881 或者 172.17.0.2,刷新網頁
不斷刷新,能夠看到會打開不一樣容器中的index頁面,說明服務被Nginx均衡地分配到不一樣的service上,這就是Nginx的負載均衡的做用。