利用 apache2 在多個伺服器上部署多個專案實踐
阿新 • • 發佈:2018-12-21
一、背景
應專案需求,要在兩個遠端伺服器上利用 apache2 部署多個專案(前後端分離):
- Server (Nodejs/Koa2)
- Android APP、Apple APP (ionic3)
現將部署過程及遇到的問題記錄下來。
二、伺服器配置說明
專案一共用到了兩臺伺服器,具體配置資訊如下:
- System: Ubuntu 16.04
- Mem: 8G
- Disk: 200G
- Bindwidth: 10Mbps
- System: Ubuntu 16.04
- Mem: 2G
- Disk: 50G
- Bindwidth: 2.5Mbps
三、架構圖
根據上圖可知,這裡將Server、site1.com等部署在了效能更優的伺服器(VPS 1), 而將site2.com、site3.com部署在效能較低的伺服器(VPS 2)。之所以這樣分配,原因有三:
- Server需要接收並處理所有前端(web + app)的請求,還要進行資料的儲存(MongoDB)和搜尋(ElasticSearch),對記憶體、頻寬、硬碟容量等的要求都比較高;
- 做web版微信支付等開發時,要求配置獨立的域名,不能帶埠(微信支付具體要求很複雜,主要是為了安全性);
- 由於配套網站較多(這裡是 3 個),需要多個域名或多個埠。採用一個伺服器開放多個埠的方式,節省成本,但降低了網站的識別度,也不滿足上述第 2 條要求;而每個網站都配備一個域名和伺服器,意味著更高的成本,對於小型專案來說不是經濟的做法,而且不利於管理。
因此,本專案採取了架構圖所示的折中的方式。
四、apache2 的安裝與配置
4.1 安裝
ubuntu 上自帶了 apache2 軟體包,只需要執行命令安裝:
sudo apt-get install apache2
4.2 VPS 1 中 Apache2 的配置
在 /etc/apache2/sites-available 中新增配置檔案 site1.conf,忽略掉所有註釋後,配置如下,重點注意這裡的重定向配置:
<VirtualHost *:80> ServerAdmin [email protected] DocumentRoot /var/www/site1_com # 專案目錄 ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "/var/www/site1_com"> # 專案目錄 AllowOverride All </Directory> # 重定向 # 將所有對該apache伺服器上 site1.com(:80) 的 http 請求,都重定向到 https://site1.com/REQUEST_URI # RewriteEngine on # RewriteCond %{SERVER_NAME} = site1.com # RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} </VirtualHost>
該專案可以直接通過公網呼叫 server 的介面:site1.com:3000,及其不安全。
為了安全性,需要對網站進行 ssl 加密。這裡先保留以上不安全的配置檔案和專案目錄,另外再新增一個 ssl 加密配置檔案和專案目錄 site_com_ssl。
加密完成後,/etc/apache2/sites-available/ 目錄下會多出一個配置檔案 site1-le-ssl.conf,內容大體如下:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin [email protected]
DocumentRoot /var/www/site1_com_ssl
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/site1_com_ssl">
AllowOverride All
</Directory>
ServerName site1.com
# 以下為 Certbot 自動配置的資訊,引入了 ssl 證書和金鑰等。
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/site1.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/site1.com/privkey.pem
</VirtualHost>
<VirtualHost *:3001>
# 重點 - 反向代理
# 將外部對 https://site1.com:3001 的訪問請求,反向代理到伺服器的 http://localhost:3000 (即 Node 監聽的埠)。
# 通過反向代理,外部只能訪問 https://site1.com:3001 的安全介面,而將 http://localhost:3000 “隱藏”起來,可以防止伺服器遭受外部惡意攻擊。
# 相應地,site1_com_ssl 訪問伺服器時的請求地址也要修改為 https://site1.com:3001。
ProxyPreserveHost On
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
ServerName site1.com
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/site1.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/site1.com/privkey.pem
</VirtualHost>
</IfModule>
因此在正式生產環境下,應將 :80埠 重定向到 :443 埠,並關閉防火牆的 3000 埠,開啟 3001 埠。
4.3 VPS 2 中 Apache2 的配置
該伺服器的配置和部署相對簡單,和 VPS 1 的配置大同小異。
需要注意的是,apache2 還要監聽 :8080 的 ssl 埠,因此 /etc/apache2/ports.conf 的配置如下:
Listen 80
<IfModule ssl_module>
Listen 443
Listen 8080
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
Listen 8080
</IfModule>
不要忘記開啟防火牆的該埠
sudo ufw allow 8080
至此,在兩個伺服器上部署多個專案基本完成,更多細節不再贅述。