1. 程式人生 > >生產環境構建指南:Web應用——部署

生產環境構建指南:Web應用——部署

系列教程

內容簡介

在今天的教程中,我們將探討如何部署示例PHP應用、WordPress以及專有DNS:

使用者可通過域名經由HTTPS訪問我們的應用,而此域名則指向負載均衡器。負載均衡器將充當應用伺服器的反向代理,而應用伺服器則接入資料庫伺服器。經過簡單的伺服器配置,專有DNS將允許我們使用名稱指向伺服器的專有網路地址。

以上各元件執行在六臺伺服器之上,分別為:

  • 專有DNS (ns1與ns2)
  • 資料庫伺服器(db1)
  • 應用伺服器(app1與app2)
  • 負載均衡器(lb1)

下面開始設定DNS。

專有DNS伺服器

在執行規模龐大的伺服器系統時,使用域名進行定址無疑是一項重要的實現基礎——因為我們可以通過更新DNS記錄輕鬆更換伺服器,而無需直接面對令人頭痛的IP地址配置檔案。在本示例中,我們將設定自己的DNS伺服器,從而根據域名而非IP地址引用伺服器的專有網路地址。

我們利用“nyc3.example.com”下的主機名稱作為每臺伺服器的專有網路地址。舉例來說,資料庫伺服器的專有網路地址將為“db1.nyc3.example.com”,其在解析後將指向資料庫伺服器的專有IP地址。請注意,示例子域名幾乎可以任意設定,我們通常會選擇具有解釋性的表達。在本示例中,“nyc3”代表的是該伺服器位於NYC3資料中心,而“example.com”則為我們應用的域名。

為每臺伺服器新增DNS記錄的具體方式請參閱以下文章:

在DNS部分完成後,大家應該已經擁有兩臺BINd伺服器:ns1與ns2。如果大家已經瞭解設定中全部伺服器的專有IP地址,則可直接將其新增到DNS當中; 如果還不清楚,可在建立伺服器的過程中再新增對應的DNS記錄。

接下來著手設定資料庫伺服器。

設定資料庫伺服器

由於我們需要對應用伺服器進行負載均衡,因此需要將其從應用伺服器中獨立出來。將資料庫伺服器與應用伺服器中解耦出來是一種常見的應用規模擴充套件操作,具體方式可參閱PHP應用橫向擴充套件:例項概述

以上教程中已經涵蓋了全部必要步驟,不過大家也可以參閱如何設定一套遠端MySQL資料庫以瞭解如何設定一套遠端解耦MySQL資料庫伺服器。

安裝MySQL

在資料庫伺服器db1中安裝MySQL Server:

- sudo apt-get update

- sudo apt-get -y install mysql-server

在提示符中輸入要使用的MySQL root密碼。現在執行:

- sudo mysql_install_db

- sudo mysql_secure_installation

這裡我們需要輸入之前設定的MySQL管理員密碼。隨後,系統會詢問是否要更改密碼。如果密碼內容沒問題,可以按“N”選擇不。其它詢問內容全部選擇預設即可。

配置MySQL以監聽專有網路介面

開啟MySQL配置檔案:

- sudo vi /etc/mysql/my.cnf

找到其中的bind-address設定,將其變更為資料庫伺服器的專有網路地址:

/etc/mysql/my.cnf

bind-address            = db1.nyc3.example.com

儲存並退出。

重啟MySQL:

- sudo service mysql restart

設定資料庫與資料庫使用者

現在我們需要建立資料庫及資料庫使用者,以供應用伺服器接入。

進入MySQL控制檯:

- mysql -u root -p

在提示符處輸入MySQL root密碼。

為應用建立資料庫:

- CREATE DATABASE app;

MySQL會將各使用者關聯至其應當接入的伺服器。在本示例中,我們擁有兩臺應用伺服器進行接入,因此我們應當為其分別建立使用者。建立一個名為“appuser”的資料庫使用者,其能夠接入至任一應用伺服器(app1與app2)的專有網路地址。大家應當為每個使用者使用同樣的密碼:

- CREATE USER 'appuser'@'app1.nyc3.example.com' IDENTIFIED BY 'password';

- CREATE USER 'appuser'@'app2.nyc3.example.com' IDENTIFIED BY 'password';

我們在後文中需要具體配置最終資料庫使用者許可權,不過在這裡暫時為appuser分配全部appdatabase控制權限:

- GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'app1.nyc3.example.com';

- GRANT ALL PRIVILEGES ON app.* TO 'appuser'@'app2.nyc3.example.com';

- FLUSH PRIVILEGES;

寬鬆的許可權設定保證了應用安裝器能夠將應用安裝在資料庫當中。如果大家擁有兩臺以上應用伺服器,則應當在這裡建立全部必要的資料庫使用者。

退出MySQL提示符:

- exit

現在資料庫伺服器設定已經完成,下面設定應用伺服器。

設定應用伺服器

應用伺服器負責執行我們的應用程式碼,其將接入資料庫伺服器。本示例中的應用為WordPress,其屬於PHP應用且通過Apache或者Nginx等Web伺服器起效。由於我們需要對應用伺服器進行負載均衡,因此應當設定兩臺相同的伺服器。

這部分工作屬於應用伺服器設定中的必要步驟,大家可以參閱如何設定一套遠端資料庫中的“設定Web伺服器”章節。

安裝Apache與PHP

接下來在app1與app2上安裝Apache與PHP:

- sudo apt-get update

- sudo apt-get -y install apache2 php5-mysql php5 libapache2-mod-php5 php5-mcrypt

配置Apache

我們將在負載均衡伺服器上使用HAProxy以處理SSL終端,因此我們不允許使用者直接訪問應用伺服器。在這裡,我們將把Apache與每臺伺服器的專有網路地址相繫結。

在兩臺應用伺服器上分別開啟Apache埠配置檔案。在預設情況下,其應為ports.conf檔案:

- sudo vi /etc/apache2/ports.conf

找到Listen 80一行,向其中新增自己的專有IP地址:

Apache ports.conf — Listen on private interface

Listen private_IP:80

儲存並退出。這部分內容將配置Apache只監聽該專有網路介面,意味著其無法通過公共IP地址或者主機名稱接受訪問。

重啟Apache以應用變更:

- sudo service apache2 restart

Apache現在只接受應用伺服器專有網路地址的訪問。在後文中,我們將配置負載均衡器以由此傳送使用者請求。

下載並配置應用

在本示例中,我們使用WordPress作為實際應用。如果大家使用其它PHP應用,則可下載並執行相關配置,並直接跳過此章節。

在第一臺應用伺服器app1中下載WordPress壓縮包:

- cd ~

- wget http://wordpress.org/latest.tar.gz

進行解壓縮:

- tar xvf latest.tar.gz

前往解壓縮目錄:

- cd wordpress

WordPress需要建立一個wp-content/uploads目錄以作為上傳目錄:

- mkdir wp-content/uploads

我們這裡使用示例WordPress配置檔案作為模板。將其複製到正確位置:

- cp wp-config-sample.php wp-config.php

開啟該配置檔案並進行編輯:

- vi wp-config.php

變更以下程式碼行中的高亮部分以配置WordPress資料庫連線方式:

wp-config.php

/** The name of the database for WordPress */
define('DB_NAME', 'app');

/** MySQL database username */
define('DB_USER', 'appuser');

/** MySQL database password */
define('DB_PASSWORD', 'password');

/** MySQL hostname */
define('DB_HOST', 'db1.nyc3.example..com');

由於我們需要在負載均衡伺服器上使用TLS/SSL加密,因此需要新增以下內容以確保WordPress瞭解其位於使用SSL的反向代理之後:

define('FORCE_SSL_ADMIN', true);
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
   $_SERVER['HTTPS']='on';

大家還需要更新其中的key與salt,因此可以在必要時取消其中的cookies。但本示例將忽略這方面內容,旨在確保其在各應用伺服器上皆保持一致。

儲存並退出。

WordPress現在已經配置完成,但其檔案必須被複制到正確位置以供Web伺服器軟體使用。

將應用檔案複製至Document Root處

現在,我們已經完成了應用配置,接下來需要將其複製至Apache的document root當中,以供網站訪問者檢視。

在本示例中,我們將使用Apache的預設DocumentRoot位置/var/www/html。

首先刪除預設index.html檔案:

- sudo rm /var/www/html/index.html

而後使用rsync將WordPress檔案複製到/var/www/html,同時生成www-data持有者(即Apache的執行使用者身份):

- sudo rsync -avP ~/wordpress/ /var/www/html

- sudo chgrp -R www-data /var/www/html/*

我們的app1應用伺服器已經設定完成。接下來設定另一臺應用伺服器。

將應用檔案複製至另一伺服器

為了確保應用檔案在不同應用伺服器上保持一致,這裡我們需要將設定檔案複製到Web的document root當中。在使用WordPress的情況下,利用Web介面上傳檔案並安裝外掛以將這些檔案儲存在特定伺服器上。如果這些檔案未能被複制到全部應用伺服器上,則部分使用者可能會檢視到存在圖片缺失及外掛錯誤的頁面。如果大家選擇的PHP應用並非WordPress,且未將任何資料(例如上傳檔案或者下載外掛)儲存至應用伺服器,則可手動完成應用檔案複製。在這種情況下,請使用rsync將應用檔案從app1複製至app2。

當複製工作完成後,兩臺應用伺服器也都應配置就緒。下面設定負載均衡器。

設定負載均衡伺服器

我們的負載均衡伺服器將執行HAProxy,並作為應用伺服器的反向代理負載均衡器。使用者將通過https://www.example.com這一URL經由該負載均衡器訪問我們的應用。

這部分內容屬於負載均衡器伺服器設定中的必要步驟,大家可參閱以下教程瞭解細節資訊:

複製SSL證書

在lb1負載均衡伺服器上執行以下步驟。

首先在容納SSL證書的目錄當中將現有證書、任意中間CA證書及證書金鑰整合為單一.pem檔案。例如(我們的證書位於/root/certs):

- cd /root/certs

- cat www.example.com.crt CAintermediate.ca-bundle www.example.com.key > www.example.com.pem

將該pem檔案複製至/etc/ssl/private:

- sudo cp www.example.com.pem /etc/ssl/private/

該檔案將供HAProxy為SSL終端使用。

安裝HAProxy

在lb1負載均衡伺服器上安裝HAProxy:

- sudo add-apt-repository ppa:vbernat/haproxy-1.5

- sudo apt-get update

- sudo apt-get -y install haproxy

下面進行HAProxy配置。

HAProxy配置

我們需要利用設定、SSL終端以及正確的前端與後端配置HAProxy,從而確保其能夠與應用伺服器協同運作。

開啟HAProxy配置檔案進行編輯:

- sudo vi /etc/haproxy/haproxy.cfg
HAProxy配置:常規設定

我們首先需要將maxconn設定為一個合理的數字。此設定會影響到HAProxy所能允許的最大併發連線數量,進而影響到服務質量並預防Web伺服器由於接收過多請求而發生崩潰。大家需要立足於實際環境進行考量。在配置中的全域性部分新增以下行(並使用合理數值):

haproxy.cfg — maxconn

maxconn 2048

另外,新增以下行以配置所生成臨時DHE key的最大數量:

haproxy.cfg — tune.ssl.default-dh-param

tune.ssl.default-dh-param 2048

接下來,在預設部分的mode http內容之下新增以下行:

haproxy.cfg

option forwardfor
option http-server-close

如果大家希望啟用HAProxy狀態頁,則可在預設區段內新增以下行(利用安全值指定使用者與密碼部分):

haproxy.cfg

stats enable
stats uri /stats
stats realm Haproxy\ Statistics
stats auth user:password

如此一來,我們就能夠在域名後新增/stats以檢視HAProxy狀態頁面了。

先別急著關閉此配置檔案!下面我們還需要新增代理配置。

HAProxy配置:代理

我們首先需要新增一套前端以處理輸入的HTTP連線。在檔案末尾,新增名為www-http的前端:

frontend www-http
bind www.example.com:80
reqadd X-Forwarded-Proto:\ http
default_backend app-backend

這套前端的作用在於接收HTTP連線並將其重複定向至HTTPS。

現在再新增一套前端以處理輸入的HTTPS連線。確保指定正確的pem證書:

frontend www-https
bind www.example.com:443 ssl crt /etc/ssl/private/www.example.com.pem
reqadd X-Forwarded-Proto:\ https
default_backend app-backend

完成前端的配置之後,繼續通過以下行新增後端:

backend app-backend
redirect scheme https if !{ ssl_fc }
server app1 app1.nyc3.example.com:80 check
server app2 app2.nyc3.example.com:80 check

此後端負責指定負載均衡器的流量將被髮送至哪臺應用伺服器。另外,redirect scheme https行還會要求將HTTP連線重新定向至HTTPS。

現在儲存並退出。HAProxy已經可以啟動,但下面我們需要啟動其日誌記錄功能。

啟動HAProxy日誌記錄

開啟rsyslog配置檔案:

- sudo vi /etc/rsyslog.conf

而後找到以下行,取消其註釋以啟用UDP系統日誌接收機制。修改後內容如下:

/etc/rsyslog.conf

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

現在重啟rsyslog以應用新配置:

sudo service rsyslog restart

HAProxy日誌記錄功能已經啟動!日誌檔案將在HAProxy啟動後被儲存為/var/log/haproxy.log。

重啟HAProxy

重啟HAProxy以應用變更:

- sudo service haproxy restart

我們的負載均衡器現在已經設定完成。

接下來,我們需要執行應用的安裝指令碼。

安裝WordPress

在使用之前,我們必須首先執行WordPress安裝指令碼以準備其所使用的資料庫。

在瀏覽器中開啟以下站點:

https://www.example.com/wp-admin/install.php

這裡將顯示WordPress安裝介面。填寫表單並點選Install WordPress按鈕。

WordPress安裝完成後,該應用即可隨時執行。

總結

作為應用的組成部分,伺服器現在已經設定完成,而我們的應用也可交付使用。大家可以通過管理員使用者身份檢視日誌,而普通使用者也可通過對應域名經由HTTPS實現站點訪問。

請對應用進行測試以確保其執行效果完全符合預期。

在後續教程當中,我們將瞭解如何為生產應用設定建立恢復規劃:生產環境構建指南:Web應用——恢復規劃

翻譯:diradw

相關推薦

生產環境構建指南Web應用——部署

系列教程 內容簡介 在今天的教程中,我們將探討如何部署示例PHP應用、WordPress以及專有DNS: 使用者可通過域名經由HTTPS訪問我們的應用,而此域名則指向負載均衡器。負載均衡器將充當應用伺服器的反向代理,而應用伺服器則接入資料庫伺服

生產環境構建指南Web應用——備份

系列教程 內容簡介 在為應用中的各元件建立起恢復規劃後,大家需要設定備份系統以為其提供支援。在今天的教程中,我們將瞭解如何利用Bacula構建備份解決方案。使用Bacula這類完整的備份系統能夠幫助大家完全掌控備份內容,立足於單個檔案級別進行細化

生產環境構建指南Web應用——恢復規劃

系列教程 內容介紹 現在我們已經擁有了自己的示例應用設定,接下來為其構建一套恢復規劃。所謂恢復規劃是一套配備文字記錄的規程集合,用於在伺服器設定內恢復潛在故障或者管理錯誤。另外,建立這樣一套恢復規劃還能幫助大家掌握應用伺服器設定內的元件與資料。

【Head First Servlets and JSP】筆記 26 web 應用部署

ins servlet schema servlets pre cati www 錯誤 b- 【須知】 物理目錄結構與虛擬目錄結構的差異 WAR 實際上就是 JAR 什麽東西應該放在 WEB-INF 文件夾下? 【了解】 <mime-mappin

構建Fabric的web應用--搭建一個Fabric網路環境(二)

想知道更多區塊鏈技術開發問題,請百度【鏈客區塊鏈技術問答社群】進入 配置docker-compose.yml檔案 在 fixtures 目錄下建立一個 docker-compose.yml 檔案並編輯 $ vim docker-compose.yml 將 network下的bas

構建Fabric的web應用--搭建一個Fabric網路環境(一)

想知道更多區塊鏈實戰技術,請百度【鏈客區塊鏈技術問答社群】進入 引言 a. 說明 我們不會在本教程中詳細解釋 Hyperledger Fabric 的工作原理。在學習本教程之前,您應該通過Hyperledger Fabric 官網 或其它渠道學習 Hyperledger Fabric 的

linux web應用部署環境

特此宣告:本文用到的相關連結由syoukaihou、陳數義、hui_2016提供 1.jdk1.8.0安裝 1).在jdk官網下載,linux安裝的jdk版本 點選開啟連結         2).切換到root使用者: su root         3).輸入命令:cd

摘記Web應用系統測試內容

目標 最小化 ica 界面 電子郵件 描述 郵件 時間 運行 表示層: 內容測試,包括整體審美、字體、色彩、拼寫、內容準確性和默認值 Web站點結構,包括無效的鏈接或圖形 用戶環境,包括Web瀏覽器版本和操作系統配置(

Repractise基礎篇Web應用開發七日談

一些事 mit 個人 性能 簡單的 第五天 第一天 ogg 喜歡 Repractise基礎篇:Web應用開發七日談 本來想的僅僅是畫一個例如以下的七日圖來說說Web開發的。隨後又想了想這似乎是一個非常棒的Web開發相關的知識介紹。應用開發是一個非常有意

rancher初級(搭建+基本操作+web應用部署

進行 span png nbsp 添加數據 tar test 密碼 保持 Rancher搭建 首先rancher需要安裝了docker的linux環境,我的系統版本為 在docker的基礎上啟動rancher服務器,Rancher 服務器是一個 Docker image,所

go語言快速入門Web應用的HelloWorld(11)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

SpringCloud從入門到進階(四)——生產環境下Eureka的完全分散式部署

內容   由於前兩節的內容我們知道,開啟了preferIpAddress後,Eureka的偽分散式部署會提示replica不可用。這一節我們講解如何在生產環境下部署完全分散式的Eureka叢集,確保開啟了preferIpAddress後replica的可用性。 版本   IDE:IDEA 2017.2.

最簡單的nginx教程 - 如何把一個web應用部署到nginx上

Nginx (engine x) 是一個高效能的HTTP和反向代理服務,也是一個IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0釋出於2004年10月4日。其將原始碼以類BSD許可證的形式釋出,

SpringBoot | 第十七章web 應用開發之檔案上傳

前言 上一章節,我們講解了利用模版引擎實現前端頁面渲染,從而實現動態網頁的功能,同時也提出了相容jsp專案的解決方案。既然開始講解web開發了,我們就接著繼續往web這個方向繼續吧。通常,我們在做web開發時,碰見諸如附件上傳、圖片頭像上傳等檔案的上傳需求也是再正常不過的。

SpringBoot | 第十九章web 應用開發之 WebSocket

前言 web開發也講解了三章了,這章節開始講解關於與前端通訊相關知識。實現一個線上聊天室類似的功能或者後端推送訊息到前端,在沒有WebSocket時,讀大學那夥還有接觸過DWR(Direct Web Remoting),也使用過輪詢的方式,當Servlet3.0出來後,也有

ASP.NET Core 入門教程 1、使用ASP.NET Core 構建第一個Web應用

一、前言 1、本文主要內容 Visual Studio Code 開發環境配置 使用 ASP.NET Core 構建Web應用 ASP.NET Core Web 應用啟動類說明 ASP.NET Core Web 專案結構說明 2、本教程環境資訊 軟體/環境說明 作業系統 Windows 10

MyEclipse教程Web開發——部署和測試Web專案

MyEclipse 線上訂購年終抄底促銷!火爆開搶>> MyEclipse最新版下載 本教程向用戶展示了使用關聯的Web專案建立Web片段專案的機制。使用者還可以獲得要檢查的示例專案。在本教程中,使用者將學習如何: 建立Web片段和關聯的Web專案 部署並測試包含Web片段的示

docker + nginx 實現web應用部署方案(以react為例)

1. 安裝docker 使用yum install docker -y,此處不再詳細說明 2. 配置react專案 可以使用cmss-react-app,構建完成後可以看到如下的專案目錄 在根目錄下執行npm install & npm run build

SpringBoot | 第十八章web應用開發之WebJars使用

前言 前面一章節我們主要講解了關於檔案上傳的兩種方式。本章節繼續web開發的相關知識點。通常對於web開發而言,像js、css、images等靜態資源版本管理是比較混亂的,比如Jquery、Bootstrap、Vue.js可能各個前端框架所依賴的自個元件的版本都不盡相同,一

換個姿勢學習Kubernetes運營,如何5個月在生產環境構建K8S?_Kubernetes中文社群

在分散式系統上管理服務是運維團隊面臨的最困難的問題之一。在生產中突破新軟體並學習如何可靠地運營是非常重要的。本文是一則例項,講述為什麼學習運營Kubernetes很重要,以及為什麼很難。本文是關於Kubernetes bug導致的一小時中斷故障的事後剖析。為什麼選擇在Kuberne