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

瞭解Docker

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

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

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

  • 在服務型環境中部署和調整數據庫或其餘的後臺應用;nginx

  • 從頭編譯或者擴展示有的OpenShift或Cloud Foundry平臺來搭建本身的PaaS環境。git

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

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

docker安裝及配置

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

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的配置文件: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"。

相關文章
相關標籤/搜索