Nginx 的HTTPS配置

#常用命令

nginx -t 測試配置是否正確
nginx -s reload 加載最新配置
nginx -s stop 立即停止
nginx -s quit 優雅停止
nginx -s reopen 重新打開日誌

1.加密協議

(1)需要配置符合PFS規範的加密套餐,目前推薦配置:
ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4

(2)用來指定所開啓協議的版本,目前1.2是主流而且更高效。不安全的SSLv2 和 SSLv3 都要禁用。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
目前最新的TLS是1.3版本,不過目前也沒有大範圍使用,不過要支持TLS1.3,要使用openssl的1.1.1系列版本,所以要使用TLS1.3,升級openssl 並且在編譯安裝nginx的時候指定。

server {
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

2.Http升級爲WebSocket

因爲WebSocket協議是一個hop-by-hop協議(此類頭部字段只對單次轉發有效。會因爲轉發給緩存/代理服務器而失效),爲了讓Nginx代理服務器可以將來自客戶端的Upgrade請求發送到後端服務器,要求Upgrade和Connection的頭信息必須被顯式的設置。可以通過下文將要講解的修改Nginx的配置文件方式解決此問題。

代理服務器分別與客戶端和服務器建立連接,由於WebSocket連接是長時間保持的,所以代理服務器需要允許這些連接處於打開狀態,而不是像對待HTTP使用的短連接那樣將其關閉。

     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";

2.主文件

http {
    include       mime.types;
	#指定默認類型爲二進制流,也就是當文件類型未定義時使用這種方式,
	#例如在沒有配置PHP環境時,Nginx是不予解析的,此時,用瀏覽器訪問php文件會出現下載窗口
    default_type  application/octet-stream;
	#proxy_read_timeout連接成功後,後端服務器響應時間(代理接收超時)
    proxy_read_timeout 1200;
	#proxy_connect_timeout 跟後端服務器連接超時時間(代理連接超時)
    #proxy_connect_timeout 1200;
	#proxy_send_timeout後端服務數據回傳時間(代理髮送超時)
    #proxy_send_timeout 1200;	
	
	#通過單引號'連接日誌格式,""[]都會出現在日誌中
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" $request_time $http_host "$http_x_forwarded_for"';
	#日誌文件位置				  
    access_log  /appdata/log/nginx/www.hnsyun.com  main;
    
	#是否調用sendfile函數輸出文件,普通應用必須設on
    sendfile        on;
    
	#ngx_http_limit_conn_module 模塊,來限制連接數。那麼請求數的限制該怎麼做呢?這就需要通過
    #ngx_http_limit_req_module 模塊來實現,該模塊可以通過定義的 鍵值來限制請求處理的頻率
	#區域名稱爲one,大小爲10m,平均處理的請求頻率不能超過每秒10次。
    limit_req_zone $binary_remote_addr zone=ConnLimitZone:10m  rate=10r/s;
	#設置你所希望的日誌級別,當服務器因爲頻率過高拒絕或者延遲處理請求時可以記下相應級別的日誌。 
	#延遲記錄的日誌級別比拒絕的低一個級別;比如, 如果設置“limit_req_log_level notice”, 
	#延遲的日誌就是info級別。
    limit_req_log_level notice;
    #客戶端對服務端的持續連接時間,避免頻繁重新建立連接
    keepalive_timeout  65;
	
	upstream server_name {

}

    server {
	}
	
}	
	

3.sticky模塊(nginx-sticky-module-1.1.tar.gz)

 upstream v3.yun.com{
        server 192.168.112.70:8081 weight=1;  #負載均衡
        server 192.168.112.69:8081 weight=1;
        sticky;
    }

4.server部分的配置

server {
    listen 19999 ssl;                                                 #監聽端口
    server_name v3.yun.com;                            #訪問域名
    ssl_certificate      /app/nginx/conf/myapp.crt;            #證書地址
    ssl_certificate_key  /app/nginx/conf/myapp.key;
    ssl_session_timeout 50m;  #session變量生存時間的50分鐘
    ssl_session_cache shared:SSL:1m;  #會耗費一部分內存,1m可以同時保存4000個會話,10m理論支持4萬個會話
    ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;    #讓服務器選擇要使用的算法套件,這樣避免客戶端選擇低安全的算法

    location /  {
     proxy_pass http://222.17.216.20:8888;     #請求轉向服務器列表,可以實現負載均衡
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;     #WebSocket
     proxy_set_header Connection "upgrade";
     proxy_set_header X-real-ip $remote_addr;             #後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
     proxy_set_header X-Forwarded-For $remote_addr; 
     proxy_read_timeout 86400;                     #控制proxy後端服務器之間的超時時間
     }

 

5.HTTPS證書的申請與頒發

openssl genrsa - des3 - out server.key 1024
openssl req - new - key server.key - out server.csr
cp server.key server.key.bak
openssl  rsa - in server.key.bak  - out server.key
openssl x509 - req - days 10240 - in server.csr - signkey server.key - out server.crt

6.nginx重新編譯添加ssl模塊--with-http_ssl_module

找到安裝nginx的源碼根目錄,如果沒有的話下載新的源碼

http://nginx.org

tar xvzf nginx-1.3.2.tar.gz

查看ngixn版本極其編譯參數

/usr/local/nginx/sbin/nginx -V

進入nginx源碼目錄

cd nginx-1.3.2

以下是重新編譯的代碼和模塊

./configure --prefix=/usr/local/nginx  --with-http_stub_status_module  --with-http_ssl_module  --with-file-aio  --with-http_realip_module

make 千萬別make install,否則就覆蓋安裝了

make完之後在objs目錄下就多了個nginx,這個就是新版本的程序了

備份舊的nginx程序

cp /usr/local/nginx/sbin/nginx    /usr/local/nginx/sbin/nginx.bak

把新的nginx程序覆蓋舊的

cp objs/nginx  /usr/local/nginx/sbin/nginx

測試新的nginx程序是否正確

/usr/local/nginx/sbin/nginx -t

nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx:configuration file /usr/local/nginx/conf/nginx.conf test issuccessful

平滑重啓nginx

/usr/local/nginx/sbin/nginx -s reload

查看ngixn版本極其編譯參數

/usr/local/nginx/sbin/nginx -V

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章