1. 程式人生 > >利用 apache2 在多個伺服器上部署多個專案實踐

利用 apache2 在多個伺服器上部署多個專案實踐

一、背景

應專案需求,要在兩個遠端伺服器上利用 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)。之所以這樣分配,原因有三:

  1. Server需要接收並處理所有前端(web + app)的請求,還要進行資料的儲存(MongoDB)和搜尋(ElasticSearch),對記憶體、頻寬、硬碟容量等的要求都比較高;
  2. 做web版微信支付等開發時,要求配置獨立的域名,不能帶埠(微信支付具體要求很複雜,主要是為了安全性);
  3. 由於配套網站較多(這裡是 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

至此,在兩個伺服器上部署多個專案基本完成,更多細節不再贅述。