---
tags: Network Management 2023 Spring
---
# Apache Web Server
<!-- {%hackmd hackmd-dark-theme %} -->
> 國立成功大學 網路管理 [IM7021E] 2023 Spring 筆記整理
課程使用之Linux Distribution:Fedora 10
Fedora 10安裝:https://hackmd.io/@cpt/Bk6qbqiNn
Linux相關基本指令:https://hackmd.io/@cpt/ryg8Ncx4h
:::danger
老師說我們在做DNS server和Web server的quiz時,要做以下設定:
`System` -> `Administration` -> `SELinux Management`

將`System Default Enforcing Mode`選成`Disable`

以下是新版作業系統或Console mode的設定方式:
開啟`selinux`的設定檔:
```bash!
vi /etc/selinux/config
```
找到`SELINUX=`,改成`SELINUX=disabled`,修改完後儲存離開,並`reboot`

:::
---
> https://linux.vbird.org/linux_server/centos4/0360apache-centos4.php
WWW伺服器常見的兩個:Apache和IIS
也因此有兩大常見的系統:
- Linux + Apache + MySql + PHP,這組合又稱作LAMP
- Windows + IIS + MSSQL + ASP(.NET)
## LAMP所需套件
- httpd (也就是Apache)
- mysql
- mysql-server
- php
- php-devel (與PHP加速軟體有關)
- php-mysql
Installation:
```bash!
$ yum install httpd mysql-server php php-devel php-mysql
```
## Apache設定檔
### 主要設定檔
`/etc/httpd/conf/httpd.conf`
### 預設的「首頁」所在目錄
`/var/www/html`
<!-- 設定主機名稱:
```bash!
$ vi /etc/hosts
``` -->
## Apache啟動、終止、重啟
啟動:
```bash!
$ /etc/rc.d/init.d/httpd start
```
重啟:
```bash!
$ /etc/rc.d/init.d/httpd restart
```
終止:
```bash!
$ /etc/rc.d/init.d/httpd stop
```
狀態查看:
```bash!
$ /etc/rc.d/init.d/httpd status
```
> 這些檔案是shell script
### 檢查是否有在執行
```bash!
$ ps aux | grep httpd
# 檢查是否在執行httpd
$ /etc/rc.d/init.d/httpd start
# 確認有安裝後,用這個指令就可以啟動他
$ ps aux | grep httpd
# 這時可以看到許多httpd程式在啟動中(9個)
# 若同時有9個人連進來,就可以照顧到這9個人
# 要啟動多少個這是可以設定的
# 這個case,若超過9個人連進來,可能會delay,server會啟動新的demand去服務他,他並不用等那9個人結束後才能用
# 所以老師建議default就不用去改他
```

>可以看到`start`後再用`ps aux | grep httpd`就有9個httpd正在執行
## `httpd.conf`設定檔
開啟Apache server的主要profile設定檔:
```bash!
$ vi /etc/httpd/conf/httpd.conf
```
此設定檔主要分成三個部分:
- `Global environment`
- `'Main' server configuration`
- `Virtual host`
### Setting Global Environment
- `ServerRoot "/etc/httpd"`
- The top of the directory tree under which the server's configuration, error, and log files are kept
- `PidFile run/httpd.pid`
- The file in which the server should record its process identification number when it starts
- `Include conf.d/*.conf`
- Load config files from the config directory "`/etc/httpd/conf.d`"
### Setting of Main Server
- `ServerAdmin root@localhost`
- Your address, where problems with the server sohuld be e-mailed.
- `DocumentRoot "/var/www/html"`
- 設定說網頁的資料是存在server的哪個directory,不建議去更動這個選項
- By default, all requests are taken from this directory, but symbolic links and aliases may be used to point to other locations

- `DirectoryIndex`
- 用`vi`開啟設定檔之後,輸入`:/DirectoryIndex`可快速跳到此地方
- 這是設定目錄內的預設存取檔案優先順序
- 若是`DirectoryIndex hello.html test.html index.html`
- 那就會先檢查有沒有`hello.html`這個檔案,若沒有就再檢查`test.html`,依此類推
- 注意不可以有`,`,用空格即可
- 整個server只會有一個設定
- 在存取每個資料夾時都會依照這個設定尋找優先顯示的網頁

:::info
假設將DirectoryIndex改成`DirectoryIndex hello.html hello2.html index.html`,則每次在存取「每個」資料夾時都會依照這個順序,先找看看這個資料夾有沒有`hello.html`,沒有就找`hello2.html`,再沒有就找`index.html`
(設定完之後記得要restart)

<!--  -->
假設以下是`html`資料夾裡面的檔案&資料夾:
```bash!
# /var/www/html
.
├── hello2.html
├── hello.html
└── level1
├── hello2.html
└── level2
└── index.html
```
輸入`http://localhost`,開啟的是位在`html`資料夾內的`hello.html`

輸入`http://localhost/level1`,開啟的是位在`level1`的`hello2.html`

輸入`http://localhost/level1/level2`,開啟的是位在`level2`的`index.html`

:::
## 查看網頁
假設以下是`/etc/www/html`資料夾裡面的檔案&資料夾:
```bash!
# /var/www/html
.
├── index.html
└── level1
├── index.html
└── level2
└── index.html
```
先啟動Apache:
```bash!
$ /etc/rc.d/init.d/httpd start
```
查看預設的首頁,也就是`/var/www/html/index.html`,在瀏覽器輸入以下網址二擇一皆可:
```
http://127.0.0.1
or
http://localhost
```
查看`level1`預設的首頁:
```
http://127.0.0.1/level1
or
http://localhost/level1
```
若要查看`level2`預設的首頁,則依此類推。
此外,倘若某資料夾內沒有預設的首頁的檔案,像是假如`level1`資料夾裡面是空的,則輸入`http://localhost/level1`會看到以下畫面:
<!--  -->

可以設定說若找不到目錄內的檔案,到底要顯示目錄內的清單,還是禁止看到,一般都會設定禁止看到檔案清單,以下是設定方法
<!-- 輸入網址:`localhost/test/hello.html`
這樣就能看到
這樣會看到資料夾的內容`http://localhost/test/`
若想要連到某個目錄後自動連到某個黨名,可以再directoryIndex設定
-->
<!-- 進入設定檔,搜尋,輸入`:/DirectoryIndex`做搜尋的動作
DirectoryIndex hello.html index.html index.html.var
注意不能有逗號,用空格就好
到任何一個目錄內,若有hello.html,就優先連到這個檔案
後面還有index.html index.html.var,就是會依照優先度連到這些檔案
設定完之後記得要restart
這時再輸入`http://localhost/test/`,就會開啟hello.html -->
<!-- ### AccessFileName .htacess
在某些晴望下 可以設定該目錄能不能被存取
assign the activated file name -->
## 禁止查看檔案清單
開啟設定檔:
```bash!
$ vi /etc/httpd/conf/httpd.conf
```
會可以查看檔案清單主要是因為預設的這段設定:
```bash!
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
```
是因為`Options`這個項目有`Indexes`,有`Indexes`就代表可以查看檔案目錄。此外,因為這裡是設定`/var/www/html`這個目錄可以查看檔案目錄,所以這個設定也會套用到`html`這個資料夾底下的全部資料夾。若要取消,可以:
1. 將`/var/www/html`的`Indexes`拿掉
2. 或者要設定個別目錄的權限的話,就在底下設定`level1`資料夾的權限,並且`Options`不要有`Indexes`:
```bash!
<Directory "/var/www/html/level1">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
```
再存取`http://localhost/level1`就會變成這樣:

:::info
此外,這樣設定的話,由於`level2`資料夾在`level1`資料夾內,所以`level2`也會被套用到這個設定,若要針對`level2`個別設定,就在設定檔內依此類推寫一段針對`level2`的設定。
++所以,我們設定的順序要先設定上層的資料夾,再設定下層的資料夾。因為如果上層的資料夾後面才設定,那上層資料夾的設定就會覆蓋下層資料夾的設定。++
:::
## <Directory "路徑"> 說明
```bash!
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
```
- `Options`
- `Indexes`:顯示檔案目錄
- `FollowSymLinks`:允許soft link
- `AllowOverride`
- 只有`None`或`All`
- `None`:會啟動保護,不能override
- `All`:會去讀`.htaccess`檔案,看設定什麼
- 接下來的`Order`、`Allow`、或`Deny`是一組的,決定誰可以存取目錄
- `Order`決定解讀的順序,看是先看`Allow`才看`Deny`,還是先看`Deny`才看`Allow`
```bash!
Order allow,deny
Allow from all
Deny from ifpi.org.tw
```
- 這樣就是先解讀誰可以存取機器,所以是全部都可以去取,除了ifpi.org.tw不能存取
```bash!
Order deny,allow
Deny from all
Allow from ncku.edu.tw
```
- 拒絕全部的人,除了ncku.edu.tw連進來的
## 設定存取特定資料夾需帳密才可存取
假如要將`level2`的存取設定成要有帳密才可存取,首先先到設定檔設定以下內容,記得`AllowOverRide`要設定成`All`,這樣存取`level2`資料夾時才會去讀取`.htaccess`檔案

接下來在你要設定存取限制的資料夾內建立`.htaccess`檔案,以這個例子為例的話就是在`level2`資料夾內建立`.htaccess`檔案
```bash!
$ cd /var/www/html/level1/level2
$ vi .htaccess
```
`.htaccess`檔案裡面的內容:
```bash!
# 第一個選項是密碼檔放在哪邊,檔名可以自己設定
# 這樣Apache就會去你指定的資料夾讀取帳密檔
AuthUserFile /tmp/.passwordfile
# 第二個是提示字:
AuthName "We need your password to confirm your authorization"
AuthType Basic
require valid-user
```
:::info
- 建議`.passwordfile`檔案不要放在網頁存取的資料夾內,建議放在其他資料夾,這裡的例子是放在`/tmp/`底下
- 檔名可以自己設定,不一定要`.passwordfile`
:::

接下來要在前面指定的資料夾內建立帳密檔-`.passwordfile`,以這個例子就是要在`/tmp`資料夾內建立`.passwordfile`
```bash!
$ cd /tmp
$ htpasswd -c .passwordfile user1
> 輸入密碼
```

:::info
這裡的`user1`跟作業系統內的使用者沒有關係,可以創自己想要的名稱
:::
重新啟動Apache後,存取`http://localhost/level1/level2`就會要求輸入帳號密碼:

<!-- cd /var/www/html/test
mv index.htm index.html
http://localhost/test
這樣就能看到內容
cd /tmp
ls -al
就能看到.passwordfile檔案
vi /etc/httpd/conf/httpd.conf
:/Directory
AllowOverride All 這樣就可以選擇性的要不要保護這個folder,用.htaccess檔案來保護
/etc/rc.d/init.d/httpd restart
這樣再輸入`http://localhost/test`就會要求輸入密碼
 -->
## 設定用戶個人網站
:::info
老師說小考比較重要的部分就是個人使用者home directory這部分
:::
### 啟動用戶個人網站功能
假如有多個用戶,user1 user2 user3...,每個用戶都希望有自己的個人網站,這是可以的,但要先到控制檔做以下設定:
```bash!
# 用vi開啟Apache的設定檔
$ vi /etc/httpd/conf/conf.d
# 輸入 :/UserDir,跳到要做設定的地方,找到下面的設定:
<IfModule mod_userdir.c>
UserDir disable
#UserDir public_html
</IfModule>
# 將前述的內容修改成下面的內容:
<IfModule mod_userdir.c>
#UserDir disable
UserDir public_html
</IfModule>
# 設定對UserDir directory的權取權
# 控制檔內有已經寫好的示範例子,但被 # 註解了,直接把#刪除即是以下的內容:
<Directory /home/*/public_html>
AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
# 這是預設對全部使用者directory的存取控制
# 若個別的使用者想要有個別的設定,只要後面再用<Directory /home/user_name/directory>做個別設定即可
$ /etc/rc.d/init.d/httpd restart
# 存檔離開控制檔之後重啟Apache
```
接下來每個使用者只要在自己的home directory內建立`public_html`資料夾,把自己網頁的東西放在這資料夾內
再來要變更使用者home directory的權限,讓Apache可以存取:
```bash!
$ chmod -R 755 /home/user_name
```
接下來即可藉由`http://localhost/~user_name`拜訪使用者的個人網頁
也就是假如我現在有一個使用者`user1`,我就在`/home/user1`底下建立`public_html`資料夾,把網頁的東西放在這資料夾內,並執行`chmod -R 755 /home/user1`來更改權限,就可以透過`http://localhost/~user1`來存取
### 更改用戶個人網站之預設資料夾`public_html`
Apache預設的個人首頁是放置在home directory下的`public_html/`目錄,假如想改成`www/`這個目錄,只要將前述設定中的`public_html`都改成`www`即可:
```bash!
# 用vi開啟Apache的設定檔
$ vi /etc/httpd/conf/conf.d
<IfModule mod_userdir.c>
#UserDir disable
UserDir www # <- 這裡改成www
</IfModule>
<Directory /home/*/www> # <- 這裡改成www
AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
# 存檔離開控制檔之後重啟Apache
$ /etc/rc.d/init.d/httpd restart
```
### 更改存取網址`~user_name` by `Alias`
Apache預設存取每個用戶的網址是`http://localhost/~user_name`,但我們可以做修改,用自己想要的名字,ex. `http://localhost/myalias`,只要進入設定檔做以下設定:
```bash!
$ vi /etc/httpd/conf/conf.d
# 進入Apache的設定檔
Alias /myalias "/home/user1/www/"
# 設定alias,讓 /myalias 可以連到/home/user1/www/
# 設定/home/user1/www的存取控制
# 在不會影響到其他設定、或不會被其他設定影響到的地方輸入以下內容:
<Directory "/home/user1/www">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
# 重新啟動Apache即可
$ /etc/rc.d/init.d/httpd restart
```
:::danger
若寫成`Alias /myalias "/home/user1/www/"`,`/myalias`後面沒有`/`,這樣用`http://localhost/myalias`和`http://localhost/myalias/`都可以去拜訪網頁
但若寫成`Alias /myalias/ "/home/user1/www/"`,也就是`/myalias`後面有`/`,這樣只有`http://localhost/myalias/`才能拜訪到網頁,用`http://localhost/myalias`會無法拜訪網頁
所以建議`/myalias`後面不要加`/`,比較不會出問題
$Reference$
http://phorum.study-area.org/index.php?topic=21235.0
:::
<!--  -->
### 更改存取網址`~user_name` by Soft Link
假如在`/home/user2/`下建立`homepage`資料夾,在裡面建立`index.html`,希望可以不用透過前面那些修改控制檔就能藉由`http://localhost/user2`存取`/home/user2/homepage/index.html`,以下是作法:
```bash!
$ cd /var/www/html
$ ln -s /home/user2/homepage user2
# 在 /var/www/html 裡面建立一個soft link,叫做user2,這個soft link會連到 /home/user2/homepage
$ chmod -R 755 /home/user2
# 更改user2這個資料夾裡面全部東西的權限成755
```
這樣就能藉由`http://localhost/user2`來存取`/home/user2/homepage/index.html`裡面的網頁啦~
:::info
這是由於我們對「首頁」的設定的`Options`內有`FollowSymLinks`這個參數,所以才可以使用Soft link
:::
## 較新的作業系統
### 啟動、重啟、終止Apache
較新的作業系統可能沒辦法用`/etc/rc.d/init.d/httpd`來啟動、關閉、或重啟,必須要改成以下指令
```bash!
$ systemctl [start][restart][stop][status] httpd.service
```

### 使用者個人網頁
:::info
新版的作業系統要去`/etc/httpd/conf.d`修改`userdir.conf`

原本的設定是這樣,修改成下圖:

:::
### Alias
先開啟以下設定檔:
```bash!
$ vim /etc/httpd/conf.d/userdir.conf
```
加入以下內容:
```bash!
Alias /user1 "/home/user1/www"
<Directory "/home/user1/www">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
Require all granted # 一定要有這個
</Directory>
```

:::danger
PS. 一定要有`Require all granted`,否則會沒有權限拜訪網頁
:::

我們也可以創多個Alias連到同一個網址,這樣`http://localhost/myalias`和`http://localhost/user1`都會連到`http://localhost/~user1`
:::info
假如有另一個user,cpt1020,他的網頁的檔案放在`/home/cpt1020/homepage`裡面,他希望`http://localhost/cpt1020`可以存取到`homepage`裡面的資料,但在設定檔裡面已經設定`UserDir www`,可以在設定檔裡面添加以下資料:
```bash!
Alias /cpt1020 "/home/cpt1020/homepage"
<Directory "/home/cpt1020/homepage">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
```
並且記得執行`chmod -R 755 /home/cpt1020`,這樣就可以拜訪`http://localhost/cpt1020`
但若是`http://localhost/~cpt1020`則會因無權限無法拜訪,因為前面設定過`UserDir www`,`~cpt1020`預設是會存取`cpt1020/www/`,可以在設定檔裡面多加以下內容,並且在`www`裡面放`index.html`並記得`chmod`即可:
```bash!
<Directory "/home/cpt1020/www">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
```
但這方法不好,只是記錄一下
:::