利用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 证书!

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