文章地址html
很早前就想着升级https
,总以为会很难本身想用nginx可是也没用过不会弄就一直拖着,前两天忽然决定搞一下,没想到一天多时间就搞完了,因此人仍是要多尝试,有这个想法还没搞的人要赶快动起来啦。这里记录一下防止后面本身在搞还要去查资料。node
网站是本身个人的网站,后台用的 nodejs
,服务器用的阿里云的 ECS
,操做系统是linux - centOS。react
网上介绍好处的文章不少,我本身升级主要是为了几个方面linux
react-native
,不少时候都要 https
才能够。https
。本身的站点比较简单,目前就想着这样子作,由于后面可能在这个站点上实验些其余的东西,有可能会用到 docker,选择了用 nginx
来处理请求。ios
sll证书用的阿里云的 云盾证书, 由于本身服务器就在阿里云,固然最大的缘由仍是免费。操做仍是简单的,进去一通乱点找到免费的那个购买就好了。nginx
编译环境,已经安装的能够忽视c++
# 安装make: yum -y install gcc automake autoconf libtool make # 安装g++ yum install gcc gcc-c++
选择安装目录,我选择安装在 /usr/local/src
下web
cd /usr/local/src
安装 pcre
, zlib
, 前者为了重写rewrite,后者为了gzip压缩。chrome
注意下面wget的地址,可能你下载时候这个版本会没有资源,你能够直接访问那个地址进去看看最新的资源版本号是多少,我的意见若是你和我同样以前的版本都没有用过的话,有最新稳定版的就用最新的,这个后面会提到。docker
# 安装 pcre cd /usr/local/src wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz tar -zxvf pcre-8.40.tar.gz cd pcre-8.40 ./configure make make install # 安装 zlib wget https://zlib.net/zlib-1.2.11.tar.gz tar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure make make install
安装 ssl
wget https://www.openssl.org/source/openssl-1.0.1t.tar.gz tar -zxvf openssl-1.0.1t.tar.gz ./config make make install
安装 nginx
wget https://nginx.org/download/nginx-1.13.0.tar.gz tar -zxvf nginx-1.13.0.tar.gz cd nginx-1.13.0 # 下面是把 Nginx 安装到 /usr/local/nginx 目录下,注意后面跟的是刚才安装的pcre、zlib和ssl的源码地址,根据本身安装的调整 ./configure --sbin-path=/usr/local/nginx/nginx \ --conf-path=/usr/local/nginx/nginx.conf \ --pid-path=/usr/local/nginx/nginx.pid \ --with-http_ssl_module \ --with-pcre=/usr/local/src/pcre-8.40 \ --with-zlib=/usr/local/src/zlib-1.2.11 \ --with-openssl=/usr/local/src/openssl-1.0.1t make make install
确保80端口没有被占用,我以前node是在监听80端口的,如今把服务先中止。
# 查看端口状况 netstat -ano|grep 80 # 启动nginx sudo /usr/local/nginx/nginx
启动后再从新打开你的站点,看到 Welcome to nginx!
界面就安装好了。
通常网上申请好证书,下载时候都会给你些配置提示,我这个阿里云的证书,下载时候就根据不一样配置给了详细的答案。把证书下载下来,放到nginx文件中,我这里放在了一个新建的 cert
文件夹中,而后配置nginx文件下的 nginx.conf
开启 https
.
# 配置前先备份总没有错 cp nginx.conf nginx.conf.back # 进入配置文件后找到下面https的配置,有个 `# HTTPS server`的注释 server { listen 443; server_name 你的证书站点; ssl on; root html; index index.html index.htm; ssl_certificate cert/你的证书; ssl_certificate_key cert/你的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 / { root html; index index.html index.htm; } }
配置好以后重启你的nginx, sudo /usr/local/nginx/nginx -s reload
而后用https
访问你的站点,若是能够看到欢迎界面就说明成功了,我这里被坑了一下,由于服务器默认没有开启443端口的权限,我就一直访问不了,后面去阿里的控制台加了443端口权限就能够了。
说白了就是访问http
的请求强行转到https
上,仍是配置nginx,把上面监听80端口的server重定向到https
server { listen 80; server_name xxxx.com www.xxxx.com; rewrite ^ https://$http_host$request_uri? permanent; }
设置好后重启nginx,再去访问本身站点的http
连接,应该能够看到自动跳转到了https
,这一步应该问题不大,我这里遇到了一个奇怪的问题,访问主站点时候竟然重定向到了这个网站https://localhost
,还觉得配置不对搞了半天不知道哪里的问题,后面把个人chrome
的缓存啥的清理一遍竟然本身好了。
这里主要就是把https的请求即监听433端口的那个server
,代理到真正的处理后台上。我这里把nodejs
监听的端口挑到了8080,仍是配置nginx,修改上面433端口server配置里面location /
里面到内容。
location / { # 代理用户真实信息 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-NginX-Proxy true; # 要代理的本地后台 个人是8080端口 proxy_pass http://127.0.0.1:8080; # 这里是由于我站点有websocket服务,nginx (>= 1.3.13) 版本能够代理,因此说用尽可能新的版本比较ok. proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
设置好以后重启nginx,若是正常的话配置就差很少能够了。
由于个人网站还没作多久,因此历史问题还不严重,大概看一看就知道那些第三方连接不对,如今基本上服务商都提供https
的资源了,把不合格的资源换成https
试一试,能够请求的话就去改代码吧,这里遇到两个问题。
https
后请求不了。去七牛云搞了半天上传了本身的证书什么的,仍是不知道在哪里配置。索性本身网站用的图片还少,愤怒的打算用本身站点以前作的文件上传服务了,后面想一想我本身1M的网速,仍是忍住了。后面发现阿里云的 oss,能够用https请求,就把图片资源换成阿里云的了。websocket
服务用的nodejs的socket.io
库,还用到了根据用户ip定位的功能,转发后原来代码里获取到的ip地址全变成了127.0.0.1
,还觉得配置不对改了半天,后面打印出库说明文件里获取ip信息的client.handshake
对象。发现用户ip是headers
的x-real-ip
属性,因此改代码根据这个属性获取ip,而后能够正常获取ip信息了。到这里全站https基本都配置好了,由于本身网站比较新,全站转过来还挺轻松了,能够想象若是维护好久了都站点去转确定要碰见n多的问题。因此你们有这个想法的就早点动手吧。