CentOS7上部署Nginx实现https和http重定向https

CentOS7上部署Nginx实现https和http重定向https

目标:

  1. https访问域名显示网站
  2. http访问域名重定向到https

我有什么?

  1. 一个云服务商VPS
  2. 一个已备案的域名
  3. 一个springboot程序

我已经实现了什么?或我能实现什么?

  1. 已安装CentOS7在云服务商VPS上
  2. 可以通过http访问域名显示网站

心路历程:

第一阶段:否定将https写在springboot代码里面。(大约1.5小时)

  1. 头痛医头,脚痛医脚。先在Google搜索:++https需要什么?++ 搜索结果:++需要证书++
  2. 操作:++云服务商控制台上申请免费的SSL证书++
  3. 阅读云服务商提供的证书安装方式进行证书的安装方式(apache,IIS,nginx,tomcat),发现没有提到如何给springboot进行安装的。与之最类似的是如何给tomcat安装的。
  4. 灵机一动。直接在Google上搜索:++springboot使用https++ 搜索结果:++需要改动程序代码,增加@Configuration的配置文件,更改server.port为443++
  5. 因为原springboot程序的依赖文件是用gradle实现的,并且用的开发语言是Groovy。所以单单是阅读Gradle官网资料理解gradle如何使用,Groovy语法怎样使用就费了很多精力和时间,还没算上照猫画虎修改了gradle文件从而添加依赖之后报错的排查与修复的精力和时间。
  6. 但是,写着写着突然想到,https既然是代码,那能不能不写在springboot里面,以配置文件的方式写成配置文件的方式多好!?那样就可以降低很大的耦合度!

第二阶段:配置nginx(2小时)

  1. 既然是配置文件的方式,那不由自主的想到了nginx。没吃过猪肉,还没见过猪跑么。大大小小的专栏和课程都提到了nginx负载均衡,那么大概nginx也能实现个https的配置的功能吧?
  2. 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 显示服务器拒绝连接。
  1. 在崩溃的心态下,想到,既然https崩了,那我试试http能不能成吧?
  2. springboot以80端口(因为之前就是按80方式运行才可以直接http访问的)的方式运行,然后发现80端口被占用了,发现是nginx一直在使用80端口监听请求。
  3. 那么,就只能让springboot换一个端口运行咯?换成8090,然后进行端口转发。Google搜索:++nginx 80 to 8080++ 搜索结果:++非常棒的github页,1.4k star++
server{
    listen 80;
    location / {
        proxy_pass http://127.0.0.1:8090;
    }
}
  1. 网站成功显示,这说明nginx端口转发成功。
  2. PS:这里的8090只需nginx可访问即可,与外网是否可访问无关。

第三阶段:nginx配置https

  1. 既然http能成功,那https肯定也能成功;
  2. domainname.com的证书配置,网站拒绝连接;
  3. ssl.domainname.com的证书配置,网站拒绝连接;
  4. 奶奶的,云服务商的443端口也开了呀!
  5. 突然想到,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
  1. Then everything looks like good.访问443端口,服务器不再拒绝访问。
  2. 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