CentOS7上部署Nginx实现https和http重定向https
目标:
- https访问域名显示网站
- http访问域名重定向到https
我有什么?
- 一个云服务商VPS
- 一个已备案的域名
- 一个springboot程序
我已经实现了什么?或我能实现什么?
- 已安装CentOS7在云服务商VPS上
- 可以通过http访问域名显示网站
心路历程:
第一阶段:否定将https写在springboot代码里面。(大约1.5小时)
- 头痛医头,脚痛医脚。先在Google搜索:++https需要什么?++ 搜索结果:++需要证书++
- 操作:++云服务商控制台上申请免费的SSL证书++
- 阅读云服务商提供的证书安装方式进行证书的安装方式(apache,IIS,nginx,tomcat),发现没有提到如何给springboot进行安装的。与之最类似的是如何给tomcat安装的。
- 灵机一动。直接在Google上搜索:++springboot使用https++ 搜索结果:++需要改动程序代码,增加@Configuration的配置文件,更改server.port为443++
- 因为原springboot程序的依赖文件是用gradle实现的,并且用的开发语言是Groovy。所以单单是阅读Gradle官网资料理解gradle如何使用,Groovy语法怎样使用就费了很多精力和时间,还没算上照猫画虎修改了gradle文件从而添加依赖之后报错的排查与修复的精力和时间。
- 但是,写着写着突然想到,https既然是代码,那能不能不写在springboot里面,以配置文件的方式写成配置文件的方式多好!?那样就可以降低很大的耦合度!
第二阶段:配置nginx(2小时)
- 既然是配置文件的方式,那不由自主的想到了nginx。没吃过猪肉,还没见过猪跑么。大大小小的专栏和课程都提到了nginx负载均衡,那么大概nginx也能实现个https的配置的功能吧?
- Google搜索:++nginx https++ 搜索结果:++nginx官网讲解++
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
}
# 在自己服务器,照猫画虎,下载nginx,配置,然后GG 显示服务器拒绝连接。
- 在崩溃的心态下,想到,既然https崩了,那我试试http能不能成吧?
- springboot以80端口(因为之前就是按80方式运行才可以直接http访问的)的方式运行,然后发现80端口被占用了,发现是nginx一直在使用80端口监听请求。
- 那么,就只能让springboot换一个端口运行咯?换成8090,然后进行端口转发。Google搜索:++nginx 80 to 8080++ 搜索结果:++非常棒的github页,1.4k star++
server{
listen 80;
location / {
proxy_pass http://127.0.0.1:8090;
}
}
- 网站成功显示,这说明nginx端口转发成功。
- PS:这里的8090只需nginx可访问即可,与外网是否可访问无关。
第三阶段:nginx配置https
- 既然http能成功,那https肯定也能成功;
- 以http://www.domainname.com的证书配置,网站拒绝连接;
- 以http://ssl.domainname.com的证书配置,网站拒绝连接;
- 奶奶的,云服务商的443端口也开了呀!
- 突然想到,cenos7自身的firewall-cmd可能没开443端口,所以:
开启端口
[root@centos7 ~]# firewall-cmd --zone=public --add-port=443/tcp --permanent
查询端口号443 是否开启:
[root@centos7 ~]# firewall-cmd --query-port=443/tcp
重启防火墙:
[root@centos7 ~]# firewall-cmd --reload
查询有哪些端口是开启的:
[root@centos7 ~]# firewall-cmd --list-port
- Then everything looks like good.访问443端口,服务器不再拒绝访问。
- nginx配置https证书,并配置80端口重定向到https
server {
listen 443 ssl;
#填写绑定证书的域名
server_name www.domain.com;
#证书文件名称
ssl_certificate 1_www.domain.com_bundle.crt;
#私钥文件名称
ssl_certificate_key 2_www.domain.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;
location / {
proxy_pass http://127.0.0.1:8090;
}
}
server {
#nignx同时监听80端口,并重定向到https
listen 80;
#填写绑定证书的域名
server_name www.domain.com;
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
第四阶段
爽了。
思考
在解决问题的过程中,我发现我的想法要么莫得,要么一下子跳出来好多个,当我的大脑处理这些想法的时候,我似乎是以多线程的方式进行,一会想一下这个,一会想一下那个,这样的工作方式对计算机来说没什么问题,但对条理没那么清楚又感性的人来说似乎就有些难受。所以,记录与排列优先级和抗干扰以及执行力就显得尤为重要,上述四点每一点都不简单,慢慢来吧。
PS:查资料,一定要看官方(或被认可度较高的)文档是怎么写的,这样才能少走弯路!
编辑于 2020-06-24 00:21