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下配置证书

这一步网上真的是五花八门

  1. 在nginx的安装目录下(比如我的就在/usr/local/nginx),创建一个叫cert的文件夹(名字随便起)
mkdir cert
  1. 将解压出来的两个文件全部拷贝到此目录下面
  2. 打开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 / {
#
#
#}
#}
  1. 放开此代码,稍作修改,如下:
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;
posted @ 2020-12-09 07:49  在谷歌上百度  阅读(63)  评论(0编辑  收藏  举报