Multi Server的Web架構
本篇使用Laravel來做說明
說明
近期在工作上
有處理原本單機架構
轉成Load Balancer架構的調整
整理一下遇到的一些問題
Laravel Cron Job
以Laravel來說
每一台Server都需要設定Cron Job來執行排程
但如果是Multi Server的架構
變成有N台Server就會同時執行N次的排程
這樣就會有問題
因此Laravel官方在5.6以上的版本
就提供解決方案
在排程上使用onOneServer method即可
另外要注意的事cache driver必須使用database, memcached, redis等獨立的服務
這樣才能透過這個cache來讓laravel判斷目前是否有其他server正在跑排程
那在Laravel 5.6之前的版本如果有遇到這個問題
也是可以透過別人寫好的套件來處理
檔案系統
檔案儲存不用說
一定是不能存在Web Server上
需要另外存外部的檔案系統
Database
資料庫一定要是獨立的服務
不能直接在每台Web Server上
需要外架設一台Database Server
或是使用雲端服務的資料庫系統像是AWS RDS
Proxy Server調整
在單一Server原本上面可能需要直接設定SSL(像是Let's Encrypt)
這些SSL設定、憑證基本上在Multi Server上不需要處理
交給前端一點的Loan Balancer服務即可
不過在每台Server上的Proxy Server還是需要設定
以apache來說
會調整成localhost的方式
<VirtualHost *:80>
ServerName localhost
DocumentRoot /site/project/backend/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /site/project/backend/public/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
<Files "deploy.commit">
Require all denied
</Files>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
另外如果在Mutli Server前面的Load Balancer沒有做http強制轉https的動作
Web Server也是可以自己做
可以參考AWS這篇ELB同樣情況的說明
也可以參考此篇網路文章
綁定IP的服務調整
有些服務像是金流、簡訊很喜歡綁IP
可參考另一篇AWS EC2對外請求透過NAT Gateway轉譯IP文章來解決