利用Nginx實現 IIS7.5雙獨立SSL站點 + IIS集羣

SSL申請可以從騰訊雲免費,在此不冗述

1.添加兩個SSL站點使用各自的SSL證書

    使用非標SSL端口 如:446,447 添加兩個SSL站點,才能分別綁定各自對應的SSL證書,如果都使用443的話,IIS7.5是不支持的。而爲了不需在訪問時輸入https://域名:446 這樣的形式,故引入 Ngnix 做反向代理才能實現,

    切記!那些所謂的修改“C:/Windows/system32/inetsrv/config/applicationHost.config” 的方法全部都是杜撰的,對於IIS7.5無效!(那些不經驗證就亂髮方法的作者太無恥!浪費我好幾個小時測試最終無效!)

2.Ngnix設置反向代理

    其實就是將帶域名和端口信息的的URL請求通過Ngnix轉發給局域網指定IIS使用非443端口的SSL網站,從而實現一個外網IP掛載多個https網站(外網訪問不需要添加非443端口,請求首先由Ngnix截獲,後由域名來區分跳轉到哪個https網站)

修改 nginx\conf\nginx.conf :見3下面的代碼和多機集羣一起說了.

參考:https://blog.csdn.net/howsoever/article/details/82346741

3.Ngnix設置多機集羣

    同上,設置好反向代理後,在web服務器設置那裏還可以添加多個局域網IIS服務器地址,帶非443端口,由Ngnix通過負載均衡決定url請求轉發給那臺局域網IIS服務器處理,從而實現多機負載相同的網站,注意各IIS服務器對應的相同網站內容一致。

Ngnix配置如下: nginx\conf\nginx.conf 

#user  nobody;
#這裏設置Ngnix進程數量,根據服務器能力設置
worker_processes  4;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    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"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    #tcp_nodelay on;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 128k;
  fastcgi_buffers 4 128k;
  fastcgi_busy_buffers_size 256k;
  fastcgi_temp_file_write_size 256k;

  #gzip  on;
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 32k;
  gzip_http_version 1.1;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;
  gzip_disable "MSIE [1-6].";

  server_names_hash_bucket_size 128;
  client_max_body_size     100m; 
  client_header_buffer_size 256k;
  large_client_header_buffers 4 256k;

    #SSL網站1,域名1配置
	# can't use http https head 此處設置域名1爲多機集羣,由兩臺局域網服務器分做負載均衡,注意不能帶https://等頭,只用IP,注意:域名1和2均爲 www.xxx.com 形式.
	upstream 域名1 {
		server 局域網IIS服務器IP地址1:447;
		server 局域網IIS服務器IP地址2:443;
	}

	server {  
        #反向代理,兩個域名這裏設置都用443端口
        listen 443 ssl;
        server_name  域名1;
        ssl             on;
        #這裏設置存放SSL證書的物理地址,Ngnix的是兩個文件,證書申請可以在騰訊雲免費,方法不再冗述
        ssl_certificate "E:/nginx/conf/ssl/域名1/1_域名1_bundle.crt";    
        ssl_certificate_key  "E:/nginx/conf/ssl/域名1/2_域名1.key";  
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
        ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!3DES:!aNULL:!eNULL;
        ssl_prefer_server_ciphers  on;
 
		location / {  
            #注意,多機集羣的話這裏要使用域名1,做反向代理則只能使用局域網IP
			proxy_pass https://域名1; 			
			proxy_set_header   Host    $host;  
			proxy_set_header   X-Real-IP   $remote_addr;  
			proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;  
		}
	}
    
    #SSL網站2,域名2配置
    server {
        #反向代理,兩個域名這裏設置都用443端口
        listen       443 ssl;
        #這裏就是區分兩個域名用的,不帶能https://
        server_name  域名2;
		ssl             on;
		ssl_certificate "E:/nginx/conf/ssl/域名2/1_域名2_bundle.crt";    
        ssl_certificate_key  "E:/nginx/conf/ssl/域名2/2_域名2.key";  
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
        ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!3DES:!aNULL:!eNULL;
        ssl_prefer_server_ciphers  on;
		
        location / {
            #此處域名2不做多機集羣,只做反向代理,故域名2這裏使用局域網IP加IIS的非443端口號
			proxy_pass https://局域網服務器IP:446/;
			proxy_set_header   Host    $host;  
			proxy_set_header   X-Real-IP   $remote_addr;  
			proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }        
    }

	#include vhosts.conf;注意原引入的include可能會包含其他服務器設置,不需要的要屏蔽掉
}

參考:https://blog.csdn.net/zhanghan18333611647/article/details/50811980 , https://blog.csdn.net/zunguitiancheng/article/details/52738335 

4.用Windows Service Wrapper將Ngnix添加爲系統服務自動啓動

    Ngnix本身不支持以系統服務方式啓動,需要利用這個小工具:Windows Service Wrapper ,編寫正確的XML配置,用命令行方式將設定好名稱的Windows Service Wrapper添加爲系統服務,之後,Windows Service Wrapper會以系統服務方式運行,並啓動XML文件內設置好的Ngnix,隨系統啓動。

<service>
	<id>nginx</id>
	<name>nginx</name>
	<description>nginx Run at server</description>	
	<logpath>e:\nginx\</logpath>
	<log mode="roll-by-size">
		<sizeThreshold>10240</sizeThreshold>
		<keepFiles>8</keepFiles>
	</log>
	<executable>e:\nginx\nginx.exe</executable>
	<startarguments>-p e:\nginx</startarguments>
	<stopexecutable>e:\nginx\nginx.exe</stopexecutable>
	<stoparguments>-p e:\nginx -s stop</stoparguments>
</service>

注意:Windows Service Wrapper要使用 2.1.2版本工作才正確,否則停止服務會報錯. 1.9版不行, 2.1.2版下載: https://download.csdn.net/download/jessezappy/10886895

參考:https://www.cnblogs.com/roam/p/5926550.html  ,  https://www.cnblogs.com/edward2013/p/5506588.html

5.測試

    我只有一個公網IP,掛載了兩個SSL網站,兩個註冊的域名均指向這一個公網IP,

測試IIS+雙SSL網站:手機上輸入 ,  https://域名1  ,https://域名2  ,不需要帶非443端口,都能正確訪問,說明反向代理工作正常。

測試多機集羣:手機上輸入,https://域名1 ,將域名1 指向的兩臺局域網IIS服務器的相同網站首頁稍作修改,以便於區分兩個網站,打開後,反覆刷新頁面,會發現首頁被修改的內容不同呈現,說明多機集羣工作正常。

測試Windows Service Wrapper,重啓運行Ngnix的服務器,不做任何操作,手機訪問兩個SSL網站,都能正常打開,說明Windows Service Wrapper添加的Ngnix服務工作正常。

 

20190618注意: SSL 證書到期後,除了更新 IIS 的證書外,不要忘記!更新 Nginx 的 SSL 證書!不要忘記!更新 Nginx 的 SSL 證書!不要忘記!更新 Nginx 的 SSL 證書!

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