最近有个项目需要上线到浙政钉工作台,那边要求项目走 https 访问,但是服务器没有进行相应的配置一直都是走的 http,于是乎对服务器进行的一番配置,注明:linux 服务器 ,记录一下相关的踩坑记录,以及完整版的成功配置流程。
各位找到各自服务器上的 nginx 安装目录,下面有个 sbin 文件夹,来到 sbin 目录下执行 ./nginx -V命令,注意是大写的 v,小写的 v 只会展示 nginx 的版本号信息。执行完出现下图圈红的这些信息说明 ssl 模块已经安装过了。可以忽略下文的 ssl 模块安装的相关内容,直接看 nginx 配置的内容。
cd /usr/local/nginx/sbin
./nginx -V
如果没有安装 ssl 模块,即使你成功的配置好 https 的相关配置,网站也依旧不能使用 https,会提示诸如:无法提供安全连接、TLS协议不支持呀等问题。ssl 模块的安装是为了能让后端接口得以使用 https 的方式调用。找到我们的 nginx 安装解压包,我这里是放在 /usr/local/software 目录下,然后执行如下命令进入到 nginx-1.18.0 目录下。
cd /usr/local/software/nginx-1.18.0
来到 ngixn-1.18.0 目录 然后依次执行如下这三条命令
./configure --with-http_ssl_module
make
make install
由于我已经安装过了给大家看一下我当时执行的历史命令,也是这些。
安装好 ssl 之后,我们发现 nginx-1.18.0 安装包的 objs 目录下有如下这些文件,直接拷贝到 nginx 安装目录下的 sbin 文件夹下面。
nginx 默认的安装路径一般都在 /usr/local/nginx 这个位置,拷贝完成后 sbin 目录长这样。
到此 nginx ssl模块安装成功,切回 nginx 的安装目录接着执行如下命令,发现已经安装成功了。
cd /usr/local/nginx/sbin
./nginx -V
由于 https 默认是走 443 端口的,于是我们需要在 nginx.conf 中配置 443端口的监听,然后里面配置证书路径配一下就好了,这里我是用的 pem 证书。
server {
listen 80;
server_name 你的域名;
#return 301 https://$server_name$request_uri;
location / {
index index.html;
alias /usr/local/nginx_static/dist/;
#autoindex on;
}
location /fmphone {
index index.html;
alias /usr/local/nginx_static/dist2/;
}
}
server {
listen 443 ssl;
server_name 你的域名;
ssl_certificate 证书linux绝对路径;
ssl_certificate_key 证书linux绝对路径;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH;
ssl_protocols TLSv1;
ssl_prefer_server_ciphers on;
}
由于我这里有些项目需要接着走 http ,有些项目走 https ,我并没有开启全局 http 转 https ,也就是没有放开这行代码。这里需要注意的是,当放开这行代码后,监听 80 端口的 service 里面的 location 就会失效,因为请求全转发到 443 端口了,对应的 location 也要挪到 443 对应的那个 service 里面。我这里 location 写到了 80 端口对应的 service 里面是因为,我有些项目要走 http 有些要走 https,配的 http 与 https 共存(他们都是用的 80 service 里面的location),一个项目既可以通过 http 访问,也可以通过 https 访问,对应的 location 只能写到 80 对应的 service 里面,写到 443 对应的 service 会失效。这里大家需要注意一下哦。
return 301 https://$server_name$request_uri;
当我们都配置好后,发现走 https 能正常访问项目,但是居然还提示是不安全的连接?这种情况我们只需要点不安全几个字,查看证书就好了,查看证书有效期,发现原来是我的证书过期了,一万个草泥马涌上心头,在这里,我们需要注意对应证书对应的域名是不是一致的,证书对应的域名=证书查看器后面那一坨。如果不一致会爆你证书与域名不匹配的错。
一开始我连着公司的一个 wifi 测试发现一切正常,第二天上班一觉醒来,发现项目无法访问了,找了一上午原因,无意间换了个 wifi 诶嘿居然又正常了,换另外一个 wifi 诶嘿又不正常了,于是乎我就想到 wifi 有鬼,一个是内网 wifi 一个是外网 wifi。
这种一般都是防火墙的问题,我们先排查一下 linux 服务器防火墙是否拦截了 443 端口。执行如下命令
systemctl status firewalld
可以看到物理防火墙压根都没开启。于是乎你真就觉得不是防火墙的问题了吗?
linux还有一个云防火墙呢,反馈给领导让他去联系运维人员去配置云防火墙开启对外网访问的支持。
这几天把我手底下负责的项目 http 全部改成 https 了。有些项目用到了 session ,改成 https 后,每次刷新接口 session 都不一致的 bug,看了一眼这台服务器的 nginx 配置文件,发现后端代理是配置了,proxy_cookie_path 也配置了,但是配错了!!!!!!下面的是正确的配置,转发后的请求为 http://127.0.0.1:8080/serviceTrade/ ,下图配置代表把前缀为 /serviceTrade 的 cookie 携带到 /serviceapi/serviceTrade/ 路径下,而前端调用接口是通过 /serviceapi/serviceTrade/ 路径访问的,这样一来就解决了 session 传递的问题。
server {
listen 80;
server_name 域名;
location /serviceapi/serviceTrade/ {
proxy_pass http://127.0.0.1:8080/serviceTrade/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cookie_path /serviceTrade /serviceapi/serviceTrade/;
proxy_set_header Cookie $http_cookie;
}
}
到此终于又可以安心睡大觉了