Multi Server的Web架構

2020/10/31

 

本篇使用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之前的版本如果有遇到這個問題

也是可以透過別人寫好的套件來處理

jdavidbakr/multi-server-event

 

檔案系統

檔案儲存不用說

一定是不能存在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文章來解決