使用nginx+docker配置https負載均衡


了解Docker

Docker是一個golang編寫的開源輕量級的、可移植的、自給自足的容器,Docker主要應用在以下場景:

  • web應用的自動化打包和發布;

  • 自動化測試和持續集成、發布;

  • 在服務型環境中部署和調整數據庫或其他的后台應用;

  • 從頭編譯或者擴展現有的OpenShift或Cloud Foundry平台來搭建自己的PaaS環境。

Docker系統有兩個程序:docker服務端和docker客戶端。其中docker服務端是一個服務進程,管理着所有的容器。docker客戶端則扮演着docker服務端的遠程控制器,可以用來控制docker的服務端進程。大部分情況下,docker服務端和客戶端運行在一台機器上。

  • 鏡像:一個鏡像相當於一個root文件系統,包含運行需要的文件、庫、資源、配置
  • 容器:容器是鏡像的實例化操作,容器有自己獨立的文件系統、網絡配置、進程空間,每個容器是獨立的運行機制,容器是無狀態的,數據應保存在數據卷中。
  • 倉庫:管理docker鏡像的發布

docker安裝及配置

在centos系列系統中可直接使用yum命令進行搜索安裝,安裝完畢后可運行docker version查看安裝的版本,docker包含了很有公用的鏡像,可使用docker search進行搜索安裝。

yum install docker -y
docker pull nginx
# 運行4個docker鏡像,網站目錄在./ningx/html/下,日志文件在 ./nginx/logs/下
docker run -it -p 8081:80 --name nginx1 -v `pwd`/nginx/html1/:/usr/share/nginx/html/ -v `pwd`/nginx/logs1/:/var/log/nginx/  -d nginx
docker run -it -p 8082:80 --name nginx2 -v `pwd`/nginx/html2/:/usr/share/nginx/html/ -v `pwd`/nginx/logs2/:/var/log/nginx/ -d nginx
docker run -it -p 8083:80 --name nginx3 -v `pwd`/nginx/html3/:/usr/share/nginx/html/ -v `pwd`/nginx/logs3/:/var/log/nginx/ -d nginx
docker run -it -p 8084:80 --name nginx4 -v `pwd`/nginx/html4/:/usr/share/nginx/html/ -v `pwd`/nginx/logs4/:/var/log/nginx/ -d nginx

安裝docker php-fpm

docker pull php:7.1-fpm
docker run -p 9000:9000 --name php-fpm1 -d -v /opt/app/docker/nginx/app1/:/var/www/html:ro php:7.1-fpm
docker run --name nginx1 -p 8081:80 -d -v /opt/app/docker/nginx/html1:/usr/share/nginx/html:ro -v /opt/app/docker/nginx/conf1:/etc/nginx/conf.d:ro -v /opt/app/docker/nginx/logs1:/var/log/nginx --link php-fpm1:php nginx
echo "<?php phpinfo();" > /opt/app/docker/nginx/app1/index.php

推薦《Docker從入門到實踐》,具體可打開gitbook查看:https://www.gitbook.com/book/yeasy/docker_practice/details

nginx配置

nginx的安裝就不再描述了,最簡單快捷的可使用yum進行安裝,可可以自行去官網進行下載編譯安裝,以下是我的nginx負載均衡https到docker的配置文件:

注:我的運行環境在aws上,你可以將docker和nginx安裝在一台機器上,也可以將docker部署在1台或4台機器,nginx部署在一台機器,再結合keepalived做高可用就可實現高可用雙機熱備的https負載均衡啦~

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    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;
    
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
        
    index   index.html index.htm;
    
    upstream docker_nginx {
    	ip_hash; #同一個ip一定時間內負載到一台機器
    	server 172.31.0.155:8081; # docker虛擬的第1台nginx機器
    	server 172.31.0.155:8082; # docker虛擬的第2台nginx機器
    	server 172.31.0.155:8083; # docker虛擬的第3台nginx機器
    	server 172.31.0.155:8084; # docker虛擬的第4台nginx機器
    }
    
	server {
	    # 使用openssl自建的rsa證書
		ssl_certificate /opt/ssl/nginx.ipp365.com.crt;
		ssl_certificate_key /opt/ssl/nginx.ipp365.com.key;
		ssl_session_timeout 5m;
		ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
		ssl_prefer_server_ciphers on;
	
		listen 443;
		ssl on;
		server_name nginx.ipp365.com;
		
		location / {
				# 代理到真實機器,如果真實機器也安裝了https則使用https
				# 一般代理集群對流量進行了https后,真實機器可不再使用https
				proxy_pass http://docker_nginx;
		}
	}
}

創建ssl自建的證書

線上證書一般去ca申請的,測試的話可以使用openssl自己創建兩個證書,創建命令如下:

# 生成一個2048位密鑰文件
openssl genrsa -out privkey.pem 2048
# 使用密鑰文件生成一個證書
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095

SSL常見錯誤

問題:此網站出具的安全證書不是由受信任的證書頒發機構頒發的。

服務器正在使用的SSL證書不是通過正式的全球信任的CA頒發。推薦購買GlobalSign SSL,GeoTrust SSL ,Symante SSL證書, SSL通常是因為沒有正確安裝證書,請再檢查一下是否刪除了原來的測試證書,如果網站使用的證書是正確的,請重新啟動webserver。

問題:此網站出具的安全證書是為其他網站地址頒發的。

一個SSL證書所對應的域名是一個全域名FQDN( Fully Qualified Domain Name ),如果證書中的域名是www.domain.com,則通過其他相近的域名:web.domain.com,app.domain.com,domain.com,系統都會報告和證書中的域名不匹配。如果有多相同主域名的站點需要申請證書,推薦通配型SSL證書;如果不是相同主域名則需要購買多域名型SSL證書。

問題:本頁面包含有不安全的內容。

如果一個頁面需要通過HTTPS訪問被訪問,則其中所有的元素都必須是HTTPS方式,如果有:圖片、JS腳本,FLASH插件是通過HTTP方式去調用的,就會出現這個錯誤,最常見的,就是調用flash播放插件:codebase='http://download.macromedia.com/pub/shockwave/
cabs/flash/swflash.cab',將http改成HTTPS即可,刷新后測試SSL問題有沒有解決。

問題:此網站出具的安全證書已過期或還未生效。

這個標識網站使用的SSL證書已經過期,請先檢查網站證書的有效期,如果網站證書有效期在本日以后,則請檢查本地電腦的日期設置,是否正確。如果證書過期了,請盡快聯系易維信客服,續費!就能處理好SSL錯誤了。
問題:為什么使用匿名Diffie-Hellman(ADH)算法時會收到"no shared cipher"錯誤?

默認情況下,出於安全原因,OpenSSL並不啟用ADH算法。僅在你確實明白了這個算法的副作用時,你才可以啟用此算法。
為了使用匿名Diffie-Hellman(ADH)算法,你必須在編譯OpenSSL時使用"-DSSL_ALLOW_ADH"配置選項,並在SSLCipherSuite指令中添加"ADH"。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM