一、项目背景
在生产环境下,已经安装 Nginx,并能够正常运行。鉴于客户要求,将在运行的 nginx 由 http 协议更改为 https 协议。并且,当输入http://域名/路径
时,能够跳转到 https://域名/路径
二、添加 http_ssl_module
2.1 编译Nginx,添加SSL模块
2.1.1 全新安装的 Nginx
针对全新安装的Nginx,编译时添加对应的ssl模块即可
./configure --prefix=/usr/local/nginx --with-http_ssl_module
#预编译时,添加 --with-http_ssl_module
2.1.2 已安装的 Nginx
2.1.2.1 获取有https模块的 nginx 可执行文件
2.1.2.1.1 编译生成nginx可执行文件
wget http://nginx.org/download/nginx-1.9.15.tar.gz
#下载原版本的nginx
tar zxvf nginx-1.9.15.tar.gz
#解压nginx
cd nginx-1.9.15
#进入解压后的nginx文件夹
./configure --prefix=/usr/local/nginx --with-http_ssl_module
#指定现在的nginx目录并添加 --with-http_ssl_module
make
#进行编译,而不进行安装
2.1.2.1.2 执行后查看nginx可执行文件
2.1.2.2 复制新nginx可执行文件并授权
复制新nginx可执行文件并授权nginx可执行文件,若不授权则可能不能正常启动
2.2 确定 http_ssl_module 是否安装成功
/usr/local/nginx/sbin/nginx -V
#要根据自己的实际nginx可执行文件进行是修改
三、配置 https 的 SSL证书
3.1 上传 SSL 证书到指定目录
相关的路径和文件名要进行记录,便于配置使用
3.2 修改 nginx 的配置文件
vim /usr/local/nginx/conf/nginx.conf
在 [server]
模块下进行相关配置的添加, 这些都是腾讯云推荐的配置,直接拿来用就行了,只是修改证书的路径,注意这些路径是相对于/etc/nginx/nginx.conf文件位置,也可以使用绝对路径。
.....
#上述配置,请忽略
http {
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
large_client_header_buffers 4 64k;
client_max_body_size 20m; #上传文件最大值
server_tokens off; #隐藏nginx版本号
#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;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
include /usr/local/nginx/conf.d/*.conf;
server {
listen 443 ssl;
server_name cj.xxxx.edu.cn;
client_body_buffer_size 50m;
client_max_body_size 100m;
#charset koi8-r;
#这些都是腾讯云推荐的配置,直接拿来用就行了,只是修改证书的路径,注意这些路径是相对于/etc/nginx/nginx.conf文件位置
ssl on;
ssl_certificate /usr/local/nginx/ssl/xxx.edu.cn.cer.pem;
ssl_certificate_key /usr/local/nginx/ssl/xxx.edu.cn.key.pem;
ssl_session_timeout 15m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#设置ibpsv3转发规则
location /ibpsv3 {
proxy_pass http://ibpsHost;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header 'Access-Control-Allow-Origin' '*';
}
......
#下述配置文件,请忽略
}
}
配置文件解析
ssl on;
ssl_certificate 1_XXX.com_bundle.crt;
ssl_certificate_key 2_XXX.com.key;
ssl_session_timeout 5m;
#客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
#按照这个套件配置
ssl_prefer_server_ciphers on;
#设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
四、查看效果
五、http重定向到https
注意是新增对80端口的监听,这样请求80,才能转到443。在https的server中直接修改会造成死循环。
即http的80 server{ } 和 https的 443 server{ } 应均存在。
5.1 第一种方式使用return 301:
#......省略
server {
listen 80;
server_name www.xxxx.edu.cn;
#server_name 后面建议加域名
return 301 https://127.0.0.1$request_uri;
}
#......省略
server {
listen 443 ssl;
server_name www.xxxx.edu.cn;
}
#......省略
5.2 第二种方式使用rewrite:
#......省略
server {
listen 80;
server_name www.xxxx.edu.cn;
#server_name 后面建议加域名
rewrite ^(.*)$ https://$host$1 permanent;
}
#......省略
server {
listen 443 ssl;
server_name www.xxxx.edu.cn;
}
#......省略