Windows下用Nginx配置https服务器及反向代理springboot项目

上一章:springboot 配置ssl 实现https访问

由于前端需要https访问,所以后端配置ssl,但自定义的证书,好像只支持https://localhost访问,但项目最终是要部署到服务器上的,所以一定要支持https ip访问。所以准备通过nginx配置ssl服务器,来反向代理

其中的业务逻辑:

前端——>nginx   通过https访问

nginx——>后端  通过http访问


1、安装OpenSSL

先到http://slproweb.com/products/Win32OpenSSL.html 去下载OpenSSL(根据系统选择32位或者64位版本下载安装)。

然后安装在F:\OpenSSL-Win64下。

然后配置环境变量。在系统环境变量中添加环境变量:

变量名:OPENSSL_HOME

变量值:F:\OpenSSL-Win64\bin;

(变量值为OPENSSL安装位置下的bin目录)

并在 Path变量 结尾添加一条: %OPENSSL_HOME%

2、下载安装nginx

下载最新的稳定版本即可

可以参考我先前的一篇文章:

https://blog.csdn.net/qq_41603102/article/details/82429124

3、生成证书

1、在Nginx安装目录中创建ssl文件夹用于存放证书。

2、然后到ssl目录下,打开cmd

3、创建私钥

在命令行中执行命令:

openssl genrsa -des3 -out test.key 1024     # test文件名是自己随便起即可

输入密码后,再次重复输入确认密码。记住此密码,后面会用到。

4、创建csr证书

在命令行中执行命令:

openssl req -new -key test.key -out test.csr

其中key文件为刚才生成的文件。

执行上述命令后,需要输入一系列的信息。输入的信息中最重要的为Common Name,这里输入的域名即为我们要使用https访问的域名 ,比如我输入的是localhost。其它的内容随便填即可。

以上步骤完成后,ssl文件夹内出现两个文件:test.csr 和 test.key

5、去除密码

在加载SSL支持的Nginx并使用上述私钥时除去必须的口令,否则会在启动nginx的时候需要输入密码。

复制test.key并重命名为test.copy.key。

在命令行中执行如下命令以去除口令:

openssl rsa -in test.copy.key -out test.key

然后输入密码,这个密码就是上文中在创建私钥的时候输入的密码。

6、生成crt证书

在命令行中执行此命令:

openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt

至此,证书生成完毕。我们发现,ssl文件夹中一共生成了4个文件。下面,配置https服务器的时候,我们需要用到的是其中的test.crt和test.key这两个文件。

 

 4、修改Nginx的nginx.conf配置文件

我的这个文件在F:\Program Files\nginx-1.14.2\nginx-1.14.2\conf目录下。用任意一个编辑器(如Sublime Text之类)打开这个nginx.conf文件。

找到HTTPS server配置的那一段(即包含有listen 443 ssl配置那一段)。我们发现这段代码被注释掉了。所以,首先我们把该段代码前面的#号去掉。然后分别修改其中的ssl_certificate和ssl_certificate_key配置项为刚才所生成的test.crt和test.key这两个文件的目录。并配置server_name为localhost。修改后的该段配置如下:

 #HTTPS server
    
    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      F://Program Files//nginx-1.14.2//nginx-1.14.2//ssl//test.crt;  # 这个是证书的crt文件所在目录
        ssl_certificate_key  F://Program Files//nginx-1.14.2//nginx-1.14.2//ssl//test.key; # 这个是证书key文件所在目录

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

注意一下那两个证书的文件路径的写法。

5、重启nginx

因为修改了配置文件,所以要重新加载配置文件 执行如下命令:

nginx -s reload

发现报错

路径好像有问题,所以修改路径

#ssl_certificate      F://Program Files//nginx-1.14.2//nginx-1.14.2//ssl//test.crt;
#ssl_certificate       F:/Program Files/nginx-1.14.2/nginx-1.14.2/ssl/test.crt;
#ssl_certificate       F:\Program Files\nginx-1.14.2\nginx-1.14.2\ssl\test.crt;
ssl_certificate       F:\\Program Files\\nginx-1.14.2\\nginx-1.14.2\\ssl\\test.crt;

把上面4个全试了一边,最后尴尬的发现,没有一个成功的~~

怎么办呢?还是有办法的

把刚才的配置还原

ssl_certificate      cert.pem;
ssl_certificate_key  cert.key;

然后重启nginx,发现

它这报错信息中,提到从conf文件夹中找不到cert.pem。那我们换个思路,我们把上面的test.cet,test.key文件放到conf文件夹下,这样就能找到了

ssl_certificate      test.crt;
ssl_certificate_key  test.key;

然后重启,发现成功!

这时候,在浏览器地址栏输入https://localhost并回车。

这时候,你可能看到“您的连接不是私密连接”的提示,单击页面中的“高级”,并接着单击“继续前往m.test.com(不安全)”,就可以看到Nginx的欢迎界面了。说明https服务器已经配置成功了。

ps:执行nginx -s reload命令:

  nginx: [error] OpenEvent("Global\ngx_reload_6252") failed (2: The system cannot find the file specified)

错误原因:

  Nginx 尚未启动导致,执行 start nginx 命令开启Nginx即可

6、反向代理springboot项目

继续修改配置文件:

#HTTPS server
    
    server {
        listen       443 ssl;
        server_name  localhost;

        #ssl_certificate      cert.pem;
        #ssl_certificate_key  cert.key;
		
		ssl_certificate      test.crt;
        ssl_certificate_key  test.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            #root   html;
            #index  index.html index.htm;
			
			proxy_pass http://127.0.0.1:8086;     # spring boot 项目的端口号
            
            # 固定写法-------------
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port $server_port;
			
			
			
        }
    }

打开浏览器,输入https://10.167.xx.xx/meeting/test

注意:10.167.xx.xx是你本机的IP地址

这样我们就可以实现 https通过ip来访问后端springboot项目了

这样http就能通过https协议访问了,那么问题来了?

如何使ws,wss协议那怎么办呢?

下一章:nginx 配置websocket的反向代理

参考:

https://mobilesite.github.io/2017/03/11/windows-nginx-https-config/

https://segmentfault.com/a/1190000016760251

猜你喜欢

转载自blog.csdn.net/qq_41603102/article/details/88389104