文章地址背景很久以前就想升级https了。一直觉得nginx会很难用,但是又不知道怎么用,所以一直拖。两天前,我突然决定去做。一时之间,没想到一天多就搞定了,所以大家还是要多多尝试,有这个想法没做过的赶紧行动吧。这里记录一下,防止以后自己动手,查资料。网站是我的个人网站,后台用的是nodejs,服务器用的是阿里云ECS,操作系统是linux-centOS。目的网上有很多介绍好处的文章。我自己的升级主要是几个方面。之前网页都是用手机定位,现在用的是react-native,经常需要https。很多微信小程序也需要https。最重要的事情。.看到我的网站前面有不安全的标志让我恶心。进程自己的站点比较简单,现在想着这么干,因为以后可能会在这个站点上试验其他的东西,可能会用到docker,选择用nginx来处理请求。ssl证书sll证书使用的是阿里云的云盾证书,因为自己的服务器在阿里云上,当然最大的原因还是免费。操作还是很简单的,进去点进去找到免费的就可以买。服务器(centos)下载nginx编译环境,安装的可以忽略#installmake:yum-yinstallgccautomakeautoconflibtoolmake#installg++yuminstallgccgcc-c++选择安装目录,我选to安装在/usr/local/src下cd/usr/local/src安装pcre、zlib,前者用于rewriterewrite,后者用于gzip压缩。注意下面wget的地址。可能这个版本下载的时候没有资源。你可以直接访问那个地址,看看最新的资源版本号是多少。个人意见,如果你和我一样没用过之前的版本,还有Usethelateststableversion,后面会提到。#安装pcrecd/usr/local/srcwgetftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gztar-zxvfpcre-8.40.tar.gzcdpcre-8.40./configuremakemakeinstall#安装zlibwgethttps://zlib.net/zlib-1.2.11.tar.gztar-zxvfzlib-1.2.11.tar.gzcdzlib-1.2.11./configuremakemakeinstallinstallsslwgethttps://www.openssl.org/source/openssl-1.0.1t.tar.gztar-zxvfopenssl-1.0.1t.tar.gz./configmakemakeinstall安装nginxwgethttps://nginx.org/download/nginx-1.13.0.tar.gztar-zxvfnginx-1.13.0.tar.gzcdnginx-1.13.0#下面是在/usr/local/nginx目录下安装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.1makemakeinstall启动,保证80端口没有被占用。以前在node上监听80端口,现在先停止服务。#查看端口状态netstat-ano|grep80#启动nginxsudo/usr/local/nginx/nginx启动后,重新打开你的站点,看到Welcometonginx!界面,安装完成。配置ssl证书。一般是在网上申请证书,下载的时候会给一些配置提示。我的阿里云证书下载的时候会根据不同的配置给你详细的解答。下载证书并将其放入nginx文件中。我是放在新建的cert文件夹下,然后在nginx文件下配置nginx.conf,开启https。#配置前先备份没有错cpnginx.confnginx.confconf.back#进入配置文件后,找到下面的https配置,有`#HTTPSserver`的注释server{listen443;server_name您的证书站点;SSL开启;根HTML;indexindex.htmlindex.htm;ssl_certificatecert/你的证书;ssl_certificate_key证书/你的密钥;ssl_session_timeout5m;ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocolsTLSv1TLSv1.1TLSv1.2;ssl_prefer_server_ciphers开启;位置/{根html;indexindex.htmlindex.htm;配置完成后重启你的nginx,sudo/usr/local/nginx/nginx-sreload然后使用https访问你的站点,如果能看到欢迎界面就代表成功了。我在这里被骗了,因为服务器默认没有开放443端口的权限。就是这样。说白了,全站https就是把访问http的请求强行转到https,或者配置nginx把监听80端口的服务器重定向到https服务器{listen80;服务器名称xxxx.comwww.xxxx.com;重写^https://$http_host$request_uri?永恒的;}设置好后重启nginx,然后访问自己站点的http链接,应该可以看到自动跳转到https了,这一步应该问题不大,我这里遇到了一个奇怪的问题,访问的时候主站点,我实际上被重定向到这个网站https://localhost。以为配置不对,半天不知道问题出在哪里。真实服务的反向代理主要是将HTTPS请求,即监听433端口的服务器,代理到真实的处理后台。这里我选择了nodejs监听的端口为8080,或者配置nginx,在上面的433端口修改服务器配置中的location/content。location/{#代理用户真实信息proxy_set_headerHost$http_host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-NginX-Proxytrue;proxy_passhttp://127.0.0.1:8080;#这是因为我的站点有websocket服务,nginx(>=1.3.13)版本可以代理,所以用最新的版本就可以了。proxy_http_version1.1;proxy_set_header升级$http_upgrade;proxy_set_header连接“升级”;}设置完成后,重启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就基本配置好了。因为我的网站比较新,整个站点迁移起来还是比较容易的。可想而知,如果网站维护时间长了,问题肯定不少。所以如果你有这个想法,就尽快去做吧。参考资料Centos下Nginx安装Nginx安装配置Node.js+Nginx-Whatnow?
