--- tags: Blue 的學習紀錄, Node.js --- # Node.js - NGINX, SSL With Lets Encrypt ## 目標 跟著下面影片的教學,簡單快速的架設 Nginx 並且安裝 SSL 在 Node server 上 <iframe width="560" height="315" src="https://www.youtube.com/embed/oykl1Ih9pMg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> ## 情境 已購買一個網域 並且擁有一台遠端主機(例如 Linode or DigitalOcean) ## 流程 <https://gist.github.com/bradtraversy/cd90d1ed3c462fe3bddd11bf8953a896> ### 安裝 process manage 使用 pm2 這個套件,讓 Node server 跑在背景服務 npm 頁面: <https://www.npmjs.com/package/pm2> 官方文件: <https://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/> #### 安裝 pm2 ```bash= sudo npm i pm2 -g ``` #### 用 pm2 使 Node 執行在背景 ```bash= pm2 start app.js --name "process name" --watch --ignore-watch="node_modules" ``` `--name`:process 的名稱 `--watch`:當前目錄及所有子目錄中,若任何檔案更動時,自動重啟 process `--ignore-watch`:忽略特定檔案不要 watch #### 查看狀態 ```bash= pm2 status pm2 logs ``` #### 設定為 startup 當主機重啟開機時,使 Node server 也自動重啟 ```bash= pm2 startup pm2 save ``` #### 重啟主機以確定一切如預期運作 ```bash= # 重啟主機 reboot ... # 重啟完後查看 Node server 是否有在背景執行 pm2 status ``` :::info 至此,已經可以輸入 `domain name:port` 進入 Node server ::: ### 安裝簡易防火牆 使用 `ufw` 這款套件,來幫助我們對於 port 的管理 #### 安裝 ufw ```bash= # 安裝 ufw apt-get install ufw # 啟用 ufw ufw enable ``` #### 設定要開啟的 port 開啟 ssh、http、https 的 port ```bash= ufw allow ssh ufw allow http ufw allow https ``` #### 查看 ufw 的狀態 ```bash= ufw status ``` :::info 因為設定了防火牆,所以原來 Node server 所 listen 的 port 就無法存取了 ::: ### 安裝 Nginx ```bash= sudo apt install nginx ``` 安裝好後,在瀏覽器以 ==http== 的方式連線到 domain name,會顯示 Nginx 成功安裝的畫面 ### 設定 Nginx 讓 Nginx 知道該如何導向 request 到 `/etc/nginx/sites-available/default` 中 於 Server 底下新增: ```bash= proxy_pass http://localhost:8080; #whatever port your app runs on proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; ``` 關於各項設定背後的涵義,我還沒有研究,有機會的話再補充 ```bash= # Check NGINX config sudo nginx -t # Restart NGINX sudo service nginx restart ``` 到這邊為止,已經做完了 Nginx 方面的設定 ### LetsEncrypt 安裝 LetsEncrypt 超級簡單,短短幾行就結束,其背後的運作機制以後有機會再來研究補充 ```bash= sudo apt-get install python-certbot-nginx sudo certbot --nginx -d yourdomain.com # Only valid for 90 days, test the renewal process with certbot renew --dry-run ```