文章地址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多的問題。因此你們有這個想法的就早點動手吧。