Nginx配置HTTPS
为什么要接入HTTPS?HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。HTTP 标准端口是80 ,而 HTTPS 的标准端口是443。
推荐一篇文章,介绍的很详细:https://www.cnblogs.com/xinzhao/p/4949344.html。
SSL证书的申请
这个就比较敢敢单单了,我用的是阿里云申请的域名,直接去有域名的账号下,申请免费的SSL,大概10分钟就能申请下来,非常方便快捷,一键操作。
下载CA颁发的证书
点击下载,是一个zip包,其中包含两个文件(xxx.key和xxx.pem)
nginx下配置证书
这一步网上真的是五花八门
- 在nginx的安装目录下(比如我的就在/usr/local/nginx),创建一个叫cert的文件夹(名字随便起)
mkdir cert
- 将解压出来的两个文件全部拷贝到此目录下面
- 打开conf目录中的nginx.conf配置文件修改443端口监听配置。Nginx默认配置是将443端口的监听配置注释掉了的,如下:
# HTTPS server
# #server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
#
#
#}
#}
- 放开此代码,稍作修改,如下:
server {
listen 443;
server_name www.nmyswls.com;
ssl on;
ssl_certificate /usr/local/nginx/cert/214293826510663.pem;
ssl_certificate_key /usr/local/nginx/cert/214293826510663.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 https://mystory;
# 以下是为了让nginx知道,访问用户的真实ip是多少
proxy_set_header Host $https_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream mystory {
server xx.104.129.162:xxxx weight=5;
server xx.104.189.224:xxxx weight=5;
# ip_hash;
}
简单介绍下参数:
-
ssl_session_timeout:客户端可以重用会话缓存中ssl参数的过期时间,系统默认设置了5分钟,一般设置半小时就可以了。
-
ssl_protocols:指令用于启动特定的加密协议。
-
ssl_ciphers:选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。
-
ssl_prefer_server_ciphers on:设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
-
location:指的是访问你443端口的时候跳转的应用地址,当然可以是一个,也可以是一个proxy_pass来做负载,不清楚这个可以参考以前的文章,我配置的是做轮询分发。
其实到这里httpss的配置已经算ok了
尝试重启一下nginx,切到nginx安装目录下的sbin目录下,执行命令:
nginx -s reload
如果重启成功说明配置没问题,我这边出现一个问题,报这个错:
nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/nginx.conf:102
这说明没有安装ssl的模块,可以尝试如下解决办法:
1.进入nginx的源码目录(在安装目录下面的nginx-1.3.2),不是安装目录
cd nginx-1.3.2
2.执行:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-file-aio --with-http_realip_module --with-http_ssl_module
3.然后执行make命令,千万不能执行make install命令
make完之后在objs目录下就多了个nginx,这个就是新版本的程序了
把新的nginx程序覆盖旧的
cp objs/nginx /usr/local/nginx/sbin/nginx
4.测试新的nginx程序是否正确?
/usr/local/nginx/sbin/nginx -t
出现以下代码说明成功了
nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx:configuration file /usr/local/nginx/conf/nginx.conf test issuccessful
https转http
只需要在监听80端口的时候自动跳转到443端口就可以了
server {
listen 80;
server_name localhost;
location = / {
rewrite ^(.*) https://$host$1 permanent;
}
location / {
rewrite ^(.*) https://$host$1 permanent;
}
}
这里配置的时候出现一个问题,就是每次访问页面的时候,域名后面都会有一个“/”,
例如:https://www.nmyswls.com//article/34
对访问没什么影响,但是很难受,最后请教了一个朋友帮我解决了,
在上面代码重定向的时候不能写成:rewrite ^(.) https://www.nmyswls.com$1 permanent;
应该写成:rewrite ^(.) https://$host$1 permanent;就木问题了
不知道是不是因为我的服务器是突发性实例,加上了https后访问速度有点变慢,先观察一段时间不行的话只好不用http了
最终还是把httpss去掉了,不知道是哪里的原因,可能突发性实例就这尿性把,总感觉网页响应速度慢半拍2018-06-30 22:40
proxy_pass 转发 加不加 /
proxy_pass 不带/
location /alpha/ {
proxy_pass http://192.168.xxx.xxx:80;
}
http://domain/alpha/ --> http://192.168.xxx.xxx:80/alpha/
http://domain/alpha/beta/abc --> http://192.168.xxx.xxx:80/alpha/beta/abc
proxy_pass 带/
location /alpha/ {
proxy_pass http://192.168.xxx.xxx:80/;
}
http://domain/alpha/ --> http://192.168.xxx.xxx:80/
http://domain/alpha/beta/abc --> http://192.168.xxx.xxx:80/beta/abc
Nginx代理websocket
最重要的是要在location中加上这两行,表示协议升级
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;