架設你的網站伺服器 架設流程與問題排除

me
林彥成
2021-07-07 | 2 min.
文章目錄
  1. 1. 伺服器記憶體不足
  2. 2. 伺服器網路連線設定
  3. 3. 伺服器後端服務管理
  4. 4. 伺服器檔案權限設定
    1. 4.1. Permission denied while connecting to upstream

通常推薦用 Linux 架設網頁伺服器,作業系統則推薦使用 CentOS 或是 Ubuntu。架站最快方式是安裝 Nginx 並配置前後端相關服務。Nginx 的用途主要提供反向代理,方便我們進行服務界接和相關路徑設定,也提供部屬靜態網頁的簡易設定,更多相關的設定歡迎參考我之前寫過的 常用的 Nginx Config 與相關指令教學

在架設完不管是地端或是雲端的伺服器後,通常會遇到四個問題

  1. 記憶體不足
  2. 網路連線設定
  3. 後端服務管理
  4. 檔案權限設定

伺服器記憶體不足

如果開了記憶體較小的機器,有時候會遇到記憶體較滿卡頓的情況,可以幫主機加上用硬碟空間的交換記憶體 swap,因為像前幾年小編使用 EC2 預設是沒有的。

  • tophtop 看一下是不是一直在交換
  • watch -n 1 free -m 只看記憶體
  1. 設定交換記憶體大小: sudo fallocate -l 2G /swapfile
  2. 設定檔案權限: sudo chmod 600 /swapfile
  3. 設定為交換記憶體: sudo mkswap /swapfile
  4. 啟用交換記憶體: sudo swapon /swapfile
  5. 修改系統設定: sudo nano /etc/fstab
1
2
3
# 在最後一行加入修改系統設定,讓下次重開機時也會生效
/swapfile none swap sw 0 0

伺服器網路連線設定

  1. 防火牆設定: 會碰到這個一般是都弄好了,但怎麼都看不到網頁,若停用防火牆後以使用,代表防火牆需要設定

    • sudo ufw disable 停用
    • sudo ufw allow from 192.168.0.0/16 允許通過
  2. 連接埠 (Port) 的設定: 可能程式沒寫好錯誤處理,又剛好選到的 port 跟其他服務一樣。

    • 看一下目前這個 port 是不是有被使用: netstat -tulpn | grep LISTEN
    • 透過指令查看特殊 Port 的服務是否正常 telnet www.google.com 80
    • 模擬斷線: iptables -A OUTPUT -p TCP –dport {PORT} -j REJECT
  3. tcp timeout 設定: 預設值不一定適合,為了效能可以依照需求設定。

1
2
sudo sysctl -w net.ipv4.tcp_keepalive_time=110
sysctl -p
  1. somaxconn 數值設定: 也是調整效能用。
1
2
sysctl -w net.core.somaxconn=512
sysctl -p

伺服器後端服務管理

這裡以 Node.js 為例,建置時 NODE_ENV 設定為 production,網路上的大大測試看起來有差,為了提升效能也建議使用像是 express-redis-cache 這類的套件,如果是較為靜態的資料,就可以透過將資源短暫快取在記憶體中,減少對資料庫的負擔。

在遠端連接 Linux 伺服器中通常不會有桌面,通常會需要註冊成系統服務或是使用 FOREVER, PM2 這類的工具,會是透過管理工具進行管理,Node.js 中常見的工具為 PM2。也因為 Node.js 是單線程,效能優化上最簡單就是透過 cluster mode (類似 nginx 配合多核心的設定可以無痛升級效能)

常用的指令如下:

1
2
3
4
pm2 save
pm2 monit
pm2 ls
pm2 serve

伺服器檔案權限設定

檔案權限有時候會發現寫不進去或無法執行,全開的話就 chmod -R 777 ./*,不需要執行的話就 755,執行 (+X),這裡可以看到三個數字,就是搭配在 linux 上使用指令 ls -l 看到三組的 rwx,其中 r=4 (讀),w=2 (寫),x=1 (執行)

UserGroupOther
764
rwxrwr
777
rwxrwxrwx

Permission denied while connecting to upstream

如果 Nginx 設置了 proxy_pass 卻沒有作用的時候,這時候可以透過 tail -f /var/log/nginx/*.log 指令來查看相關錯誤,如果發現 Permission denied while connecting to upstream,可能就是 SELinux 權限的問題,這時候如果只是需要先測試的話,可以

  1. 設定連接權限: setsebool httpd_can_network_connect on -P
  2. 查看是否設定成功:getsebool -a | grep httpd

喜歡這篇文章,請幫忙拍拍手喔 🤣

share