成熟的web服務有很多,也都很著名。各個著名的web服務的配置當前也不可能完全相同。在此,我們參考Angular官方文檔,給出Apache、NGinx的部署方式。
## Hosts
無論我們使用什么web服務,在本地測試部署前都需要先為應用設置一個域名,比如我們使用http:///www.yz.com。
> **注意:**我們當前的后臺僅支持http://www.yz.com以及http://localhost:4200的跨域請求。所以如果你是新手的話,也使用http://www.yz.com就好。
下一步則在本機為http://www.yz.com添加一個127.0.0.1的指向。
### windows
1. 按下 **Windows鍵 + R**
2. 在運行窗口中輸入 notepad
3. 點擊確定
4. 將下列文字復制到文件中:
```
# Copyright (c) 1993-2006 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handle within DNS itself.
127.0.0.1 localhost
::1 localhost
127.0.0.1 www.yz.com
```
5. 在“文件”菜單上,選擇“另存為”,在“文件名”框中鍵入“**hosts**”(不包括引號),然后將文件保存到桌面
6. 再次按下 **Windows 鍵 + R**
7. 輸入 **%WinDir%\System32\Drivers\Etc**,點擊確定
8. 重新命名 hosts文件成 hosts.old。
9. 將剛剛在桌面創建的hosts文件復制或移動到 **%WinDir%\System32\Drivers\Etc 文件夾**中,如果系統提示您輸入管理員密碼,請選擇“繼續”。
### macos
macos下修改hosts需要`sudo`權限,以下分別展示使用`nano`及`vi`編輯器的實現方式:
#### nano
`nano`編輯器使用相對簡單,各個快捷鍵都有提示,適用于新手。打開命令行,依次執行如下:
```bash
sudo nano /etc/hosts
```
然后在文件的最后新建一行,輸入:
```bash
127.0.0.1 www.yz.com
```
輸入完成后,依次按`ctrl+x`、`y`、`回車`完成編輯。
#### vi
如果你喜歡使用`vi`編輯器,則可以按以下步驟:
```bash
sudo vi /etc/hosts
```
按快捷鍵:`shift+g`切到最后一行,然后按`end`切到該行結尾,在按`i`切換到編輯模式,再按方向鍵右來到文件結尾,按回車后新起一行輸入:
```bash
127.0.0.1 www.yz.com
```
輸入完成后按:`esc`退出編輯模式,然后輸入`:wq`后回車,完成文件的編輯保存功能。
### 測試
完成`hosts`文件變更后,便可以新打開一個`shell`,然后在其中執行`ping www.yz.com`,如果看以下字樣則說明成功:
```bash
panjie@panjies-iMac angular11-guild % ping www.yz.com
PING www.yz.com (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.029 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.079 ms
```
此時如果我們已經成功安裝并運行了web服務,該服務同時運行于80端口的話。則重新打開瀏覽器并輸入http://www.yz.com的話,則會顯示相應的web服務信息。
如果你確認按教程的步驟修改了`hosts`文件,重啟系統后仍然未生效的話,那么你可能需要清空一樣系統的DNS緩存。
windows系統下執行:`ipconfig /flushdns`
macos系統下執行:`sudo killall -HUP mDNSResponder`
## http-server
`nodejs`下有一個小巧的http服務軟件,我們可以非常方便的使用它向同一局域網的伙伴們共享數據,或者應用我們當前的展示環境。
和`Angular/cli`等眾多軟件一樣`http-server`也是`npm`托管的軟件之一,所以也可以使用`npm install`命令來安裝。在項目開發中,我們使用了`http install -s xxx`當軟件僅安裝到當前的項目中。而在此,我們需要將`http-server`安裝到系統上,所以應該使用`npm install -g http-server`:
```bash
% npm install -g http-server
```
如果發生權限錯誤,則應該執行`sudo npm install -g http-server`:
```bash
panjie@panjies-iMac angular11-guild % sudo npm install -g http-server
/usr/local/bin/http-server -> /usr/local/lib/node_modules/http-server/bin/http-server
/usr/local/bin/hs -> /usr/local/lib/node_modules/http-server/bin/http-server
+ http-server@0.12.3
updated 3 packages in 5.05s
```
然后我們使用`shell`來到打包后的項目文件夾`dist/first-app`,執行`http-server -p 80`:
```bash
panjie@panjies-iMac first-app % pwd
/Users/panjie/github/mengyunzhi/angular11-guild/first-app/dist/first-app
panjie@panjies-iMac first-app % http-server -p 80
Starting up http-server, serving ./
Available on:
http://127.0.0.1:80
http://10.70.1.141:80
Hit CTRL-C to stop the server
```
接著打開瀏覽器,訪問:http://www.yz.com

## Apache
安裝apache的方式有很多,在此省略安裝過程,需要注意的是angular構建后的應用依賴于Apache的重寫模塊,在Apache安裝完成后,需要啟動其重寫(rewite)模塊。
apache安裝成功后,會有一個名稱為`httpd.conf`的文件。該文件即apache的配置文件,我們使用編輯器打開此文件(動手改之前先備份):
> 如果默認安裝的Apache的服務端口不是80,請自行更改為80。
然后以`httpd-vhosts.conf`關鍵字進行查找,找到該行后去除該行最左側的`#`,比如:
```
- #Include /usr/local/etc/httpd/extra/httpd-vhosts.conf
+ Include /usr/local/etc/httpd/extra/httpd-vhosts.conf
```
**注意:**不要照抄上面的代碼,每臺計算機都不一樣,你要做的就是去除該行前的注釋。
然后我們再來到Apache配置文件夾下的`extra`文件夾,將原有的`httpd-vhosts.conf`重命名為任意名稱,并新建一個空的`httpd-vhosts.conf`文件,在文件中加入以下內容:
```bash
<VirtualHost www.yz.com:80>
ServerAdmin yourmail@yunzhi.club
DocumentRoot "/Users/panjie/github/mengyunzhi/angular11-guild/first-app/dist/first-app"
ServerName www.yz.com
ErrorLog "/usr/local/var/log/httpd/www.yz.com-error_log"
CustomLog "/usr/local/var/log/httpd/www.yz.com-access_log" common
</VirtualHost>
<Directory "/Users/panjie/github/mengyunzhi/angular11-guild/first-app/dist/first-app">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
```
需要注意的是你不能照抄上述代碼,上述代碼中所有以`""`包裹起來的字符串,都應該按照實際的情況替換你自己的。
然后我們重新啟動`apache`服務。
最后來到當前構建的項目中,在構建完成的項目根目中(當前為:/Users/panjie/github/mengyunzhi/angular11-guild/first-app/dist/first-app),增加一個`.htaccess`文件,內容如下:
```
RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^ /index.html
```
此時我們打開瀏覽器訪問:http://www.yz.com,將顯示以下信息:

## nginx
安裝nginx的過程略。nginx安裝后,基配置文件名為`nginx.conf`,備份此文件后我們打開并編輯它,然后在其`http`標簽中加入以下子標簽:
```
server {
listen 80;
server_name www.yz.com;
location / {
root /Users/panjie/github/mengyunzhi/angular11-guild/first-app/dist/first-app;
try_files $uri $uri/ /index.html =404;
}
}
```
**注意:**需要注意的是你不能照抄上述代碼,上述代碼中`root `以后的字符,應該按照實際的情況替換你自己的。
然后執行`nginx -t`查看是否報錯,無報錯的話使用`nginx -s reload`來重新加載配置文件。
此時我們打開瀏覽器訪問:http://www.yz.com,將顯示以下信息:

## github pages
github為了提供的pages也可以為我們提供免費的web服務,比如我們當前項目位于為https://github.com/mengyunzhi/angular11-guild,則可以利用該倉庫來發布一個web服務:
```bash
ng build --output-path ../docs --base-href /angular11-guild/
```
接著在github的項目上按一定的規則來設置pages,則可以在[https://mengyunzhi.github.io/angular11-guild/](https://mengyunzhi.github.io/angular11-guild/)瀏覽當前項目了。
## 小結
任何web服務都可以拿來做angular應用的服務。這是由于Angular構建完成后就是一個普普通通的web頁面,該頁面由html、css以及javascript三大部分構成。本節中我們在配置Apache及nginx時,進行了不多的配置,這是由于Angular中擁有對URL的重寫功能,為了防止這種重寫機制造成的404錯誤,我們將404的回跳設置給了`index.html`。
- 序言
- 第一章 Hello World
- 1.1 環境安裝
- 1.2 Hello Angular
- 1.3 Hello World!
- 第二章 教師管理
- 2.1 教師列表
- 2.1.1 初始化原型
- 2.1.2 組件生命周期之初始化
- 2.1.3 ngFor
- 2.1.4 ngIf、ngTemplate
- 2.1.5 引用 Bootstrap
- 2.2 請求后臺數據
- 2.2.1 HttpClient
- 2.2.2 請求數據
- 2.2.3 模塊與依賴注入
- 2.2.4 異步與回調函數
- 2.2.5 集成測試
- 2.2.6 本章小節
- 2.3 新增教師
- 2.3.1 組件初始化
- 2.3.2 [(ngModel)]
- 2.3.3 對接后臺
- 2.3.4 路由
- 2.4 編輯教師
- 2.4.1 組件初始化
- 2.4.2 獲取路由參數
- 2.4.3 插值與模板表達式
- 2.4.4 初識泛型
- 2.4.5 更新教師
- 2.4.6 測試中的路由
- 2.5 刪除教師
- 2.6 收尾工作
- 2.6.1 RouterLink
- 2.6.2 fontawesome圖標庫
- 2.6.3 firefox
- 2.7 總結
- 第三章 用戶登錄
- 3.1 初識單元測試
- 3.2 http概述
- 3.3 Basic access authentication
- 3.4 著陸組件
- 3.5 @Output
- 3.6 TypeScript 類
- 3.7 瀏覽器緩存
- 3.8 總結
- 第四章 個人中心
- 4.1 原型
- 4.2 管道
- 4.3 對接后臺
- 4.4 x-auth-token認證
- 4.5 攔截器
- 4.6 小結
- 第五章 系統菜單
- 5.1 延遲及測試
- 5.2 手動創建組件
- 5.3 隱藏測試信息
- 5.4 規劃路由
- 5.5 定義菜單
- 5.6 注銷
- 5.7 小結
- 第六章 班級管理
- 6.1 新增班級
- 6.1.1 組件初始化
- 6.1.2 MockApi 新建班級
- 6.1.3 ApiInterceptor
- 6.1.4 數據驗證
- 6.1.5 教師選擇列表
- 6.1.6 MockApi 教師列表
- 6.1.7 代碼重構
- 6.1.8 小結
- 6.2 教師列表組件
- 6.2.1 初始化
- 6.2.2 響應式表單
- 6.2.3 getTestScheduler()
- 6.2.4 應用組件
- 6.2.5 小結
- 6.3 班級列表
- 6.3.1 原型設計
- 6.3.2 初始化分頁
- 6.3.3 MockApi
- 6.3.4 靜態分頁
- 6.3.5 動態分頁
- 6.3.6 @Input()
- 6.4 編輯班級
- 6.4.1 測試模塊
- 6.4.2 響應式表單驗證
- 6.4.3 @Input()
- 6.4.4 FormGroup
- 6.4.5 自定義FormControl
- 6.4.6 代碼重構
- 6.4.7 小結
- 6.5 刪除班級
- 6.6 集成測試
- 6.6.1 惰性加載
- 6.6.2 API攔截器
- 6.6.3 路由與跳轉
- 6.6.4 ngStyle
- 6.7 初識Service
- 6.7.1 catchError
- 6.7.2 單例服務
- 6.7.3 單元測試
- 6.8 小結
- 第七章 學生管理
- 7.1 班級列表組件
- 7.2 新增學生
- 7.2.1 exports
- 7.2.2 自定義驗證器
- 7.2.3 異步驗證器
- 7.2.4 再識DI
- 7.2.5 屬性型指令
- 7.2.6 完成功能
- 7.2.7 小結
- 7.3 單元測試進階
- 7.4 學生列表
- 7.4.1 JSON對象與對象
- 7.4.2 單元測試
- 7.4.3 分頁模塊
- 7.4.4 子組件測試
- 7.4.5 重構分頁
- 7.5 刪除學生
- 7.5.1 第三方dialog
- 7.5.2 批量刪除
- 7.5.3 面向對象
- 7.6 集成測試
- 7.7 編輯學生
- 7.7.1 初始化
- 7.7.2 自定義provider
- 7.7.3 更新學生
- 7.7.4 集成測試
- 7.7.5 可訂閱的路由參數
- 7.7.6 小結
- 7.8 總結
- 第八章 其它
- 8.1 打包構建
- 8.2 發布部署
- 第九章 總結