Catherine's blog

Knowledge makes humble, ignorance makes proud.

0%

apache 線上課程筆記

僅以此紀錄線上課程 Linux雲端伺服器,用AWS暸解Apache與Nginx筆記

安裝Apache2與建立第一個網頁

  • 指令 netstat -plnt 可以看到監聽的port號
    • p代表顯示每個網路連接埠是被哪個程式使用
    • t代表tcp
    • n代表不自動解析 DNS、連接埠名稱與使用者名稱,這樣可以加速 netstat 的執行速度
    • l代表列出所有 listening 狀態的連接埠

      Linux 的 netstat 指令可以用來查詢各種網路相關資訊,檢測各種網路相關的問題。 在 Linux 系統中若要檢查網路相關的問題,netstat是一個很常使用到的指令之一,雖然他只能在本機執行,但是他可以列出非常多很有用的資訊,像 socket、TCP、UDP、IP 與 ethernet 層的各種資訊都可以利用 netstat 來查詢。
      一般遇到問題時,第一個檢查步驟就是查閱系統記錄檔(log),必要時可以嘗試提升記錄層級(logging level)來獲得更詳盡的資訊。如果 netstat 所提供的資訊不夠時,亦可使用 Wireshark、tshark、tcpdump 或 nmap 等檢測工具。
      在每個 Linux 系統中預設都會有安裝 netstat,而且他不需要使用管理者權限即可執行,也同時支援 IPv4 與 IPv6,不過不同的 UNIX/Linux 系統可能在參數上會有一些差異,所以如果您寫好的指令要在不同的系統上執行時,可能要稍微注意一下。
      使用 Netstat 指令檢測網路的技巧

  • 安裝Apache會自動監聽80 port
    • 指令

1
$ sudo apt-get install apache2

改變Ubuntu 監聽port號與初探反向代理

  • 改變監聽port號可能是因為安全性問題,不想讓其他人任意連接網站或是任意爬蟲
    • 可影響檔案為
      • apache2.conf(設定Directory裡的資料夾路徑,管理/var/www/這個資料夾)
      • ports.conf(可以直接改port號)
      • site-enabled資料夾(影響的是更細節的東西,virtualhost是可以做更細部的調整)
  • 反向代理(使用virtual box時)
    1. 用virtual box時我們會連到自己本機的8800 port(virtual box設定)
    2. 由127.0.0.1:8800轉到virtual box上主機的80 port

ufw防火牆設定

  • 預設未開啟,開啟後若無特別設定則會關閉所有連入要求
  • 若要開啟可先查看防火牆狀態,操作如下
    1. 指令 sudo ufw app list(可得知防火牆現在允許通過的applications)
    2. 指令 sudo ufw app info OpenSSH(確認 OpenSSH 細節)
    3. 指令 sudo ufw allow 22/tcp(允許tcp 協定 22 port access)
    4. 指令 sudo ufw enable(打開防火牆)
    5. 指令 sudo ufw status(查看防火牆狀態)
    6. 指令 sudo ufw status verbose(查看預設狀態,預設allow (incoming), allow (outgoing))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$ sudo ufw app list
Available applications:
Apache
Apache Full
Apache Secure
CUPS
OpenSSH

$ sudo ufw app info OpenSSH
Profile: OpenSSH
Title: Secure shell server, an rshd replacement
Description: OpenSSH is a free implementation of the Secure Shell protocol.

Port:
22/tcp


$ sudo ufw allow 22/tcp
Rules updated
Rules updated (v6)

$ sudo ufw status
Status: active

To Action From
-- ------ ----
22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: allow (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
443/tcp (v6) ALLOW IN Anywhere (v6)

Ubuntu 用 ufw 指令快速啟用和設定防火牆

3種Apache service的開關方式與它隱含的意思(systemctl, service, apache2)

  • 一般 Linux系統進來時讀的設定檔為/etc/init.d
  • 3種Apache service的開關方式
    1. systemctl
      • 開啟sudo systemctl start apache2.service
        • 可先查看要開啟的服務清單,sudo systemctl list-unit-files
      • 關閉sudo systemctl stop apache2.service
      • 查看狀態sudo systemctl status apache2.service
    2. service(通用型給系統使用)
      • 開啟sudo service apache2 start
      • 關閉sudo sudo service apache2 stop
      • 查看狀態sudo service apache2 status
    3. apache2
      • 開啟sudo /etc/init.d/apache2 start
      • 關閉sudo /etc/init.d/apache2 start stop
      • 查看狀態sudo /etc/init.d/apache2 status

        三種指令之前其實是有關係的,但要改設定或起服務時要小心,如果沒有改在根源,抑或是用不同的指令起服務跟關閉服務,會造成有些東西有作用有些東西沒作用,需要注意
        原理:systemctl、service 都會執行 /usr/sbin/apache2裡的 apache2ctl,apache2ctl 會用到apache2

etc 底下的apache2檔案分佈用途介紹 & Apache.conf 詳細介紹(一) & Apache.conf(二) 如何簡單的搞砸系統安全性 [Directory, denied, granted, DocumentRoot]

  1. apache2.conf
    • 載入ports.conf、conf-enabled、mods-enabled、sites-enabled
    • 設定的內容都是全域性的
    • VirtualHost(sites-enabled中設定)就可以達到同一台主機有兩個不同的網站,可以透過不同的DomainName進到不同的網進到不同的網站
    • Include & InculudeOptional 的差異是 Include 是不能沒有,InculudeOptional 是沒有也沒關係
    • LogFormat 選擇 Log 格式,不同種的格式會在 sites-enabled/000-default.conf 裡查看,CustomLog 的內容 ${APACHE_LOG_DIR}/access.log combind,真實路徑可在 /etc/apache2/envvars 查看
    • Directory 設定從apache進來的人可以看到哪些資料夾內容
  2. envvars
    • 環境變數、起服務user & group、log file 位置
  3. ports.conf
    • 設定監聽port號
  4. conf-enabled
    • 其他配置檔,enabled代表會使用的,會去連結available檔
  5. conf-available
  6. mods-enabled
    • 依功能開啟模組
  7. mods-available
  8. sites-enabled
    • 網站功能相關
  9. sites-available
  10. magic
    • 像是enum的概念,可以自行決定數字代表什麼

vim指令 set nu 及顯示行數
Linux 指令 top 可以查看目前所有進行中的程序

[補充] Option詳解

  • ALL
    • 打開所有權限除了 MultiViews
  • ExecCGI
    • 共同的通訊協定,可以顯示不同符合CGI協定的程式語言檔案
  • FollowSymLinks
    • 通常都會打開,算有點重要,開啟才能看到軟連結項目
  • Includes
    • 動態用法,如果今天html裡還鑲html,現在動態產生html都是直接使用程式語言,一般建議打開Include 也要打開 IncludesNOEXEC,是一個安全性措施,因為Include 可以使用 server IncludesNOEXEC 可以讓執行的指令消失
  • IncludesNOEXEC
  • Indexes
    • 若沒有出現 *index.html,就會直接顯示根目錄
  • MultiViews
    • 很常在現行框架被實現,不見得是使用apache來做到這件事,可以在request 上設置一些header的分隔,使之回應你不同的結果
  • SymLinksIfOwnerMatch
    • 如果今天做一個軟連結,他的owner跟檔案的owner是同一個的話,他就會顯示出來,如果不同就不會顯示,會被FollowSymLinks影響,如果FollowSymLinks開啟,無論SymLinksIfOwnerMatch有沒有開啟,檔案都會顯示出來

https://httpd.apache.org/docs/2.4/mod/core.html#options

利用不同port號架設多重站台(VirtualHost, a2ensite, a2dissite)

  • Directory
    • AllowOverride 是指.htaccess的權限
  • sites-enabled
    • 指令 a2ensite 000-default 將 000-default.conf 從 sites-available 加回 sites-enabled(因為之前課程有刪除),如果需要刪除可以透過 a2dissite
    • 需重啟apache
    • sites-available 中做更動,建議使用自己的conf cp 000-default改成自己的
  • 記得將ports.conf中多增加一個監聽的port號(同VirtualHost)
  • sudo ufw allow 8480/tcp 若有開啟防火牆請允許此port號

virtual host是一種網路技術,可以讓多個主機名稱(host name),在一個單一伺服器(或是一個伺服器組)上運作,而且可以分開支援每個單一的主機名稱。虛擬主機可以執行多個網站或服務的技術。虛擬並非指不存在,而是指空間是由實體的伺服器延伸而來,其硬體系統可以是基於伺服器群,或者單個伺服器。
所以簡單來說,它就像是把你的伺服器切成好幾段,分配給你每一個網站的概念。那麼現在就讓我們來看看要如何操作吧。

在linux與mac下用apache使用Virtual host

網域網址設定,利用不同網址Domain架設多站台

  • 先買網址
  • cp 000-default.conf demo.XXX.tw.conf
  • cp 000-default.conf test.XXX.tw.conf
  • 進到各自的conf檔案修改
    • ServerName demo.XXX.tw,test.XXX.tw
    • DocumentRoot /var/www/demo(須自行創建,test的部分只需將demo換成test)
  • 改完之後sudo a2ensite demo.XXX.tw.conf
  • sudo systemctl reload apache2
  • sudo mkdir /var/www/demo(test也要)
  • 各自建立index.html
  • 檢查 apache2.conf Directory /var/www有打開
  • sudo systemctl reload apache2

利用Rewrite module 把index.html 導向首頁路徑(mod_rewrite)

  • 將需要的html檔準備好
  • 將 /etc/apache2/sites-available/demo.XXX.tw.conf 中的 RewriteEngine 改成on ,可以看到RewriteRule ^index.html$ /,代表只要是index開頭 html結尾的都導入根目錄
  • 必須使用IFModule包起來,代表如果符合時,使用的module為mod_rewrite
    • R=301就是導到301,301是永久,302是暫時
    • L是如果已經比對過就不再比對,可以節省效能

1
2
3
4
<IFModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/index\.html$ / [R=301,L]
</IFModule>
  • 確認mod_rewrite存不存在,不存在要從mods-avaliable 加回 mods-enabled
  • sudo systemctl reload apache2

使用htaccess,RewriteRule在VirtualHost與htaccess之間的陷阱

  • .htaccess不需要reload apache
  • 小心[R=301,L] 不要有空格
  • 當直接寫在.htaccess時,不需要加根目錄^/index.html$ ,只需寫成^index.html$,若將此寫回/etc/apache2/sites-available/demo.XXX.tw.conf中,則不起作用,原因參考apache2官方文件,如果寫在.htaccess裡面不需要加根目錄,反之則需要,若要讓兩個地方寫法相同,則須在/etc/apache2/sites-available/demo.XXX.tw.conf原本寫的地方外面加上Directory

1
2
3
4
5
6
<Directory>
<IFModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/index\.html$ / [R=301,L]
</IFModule>
</Directory>

Allowoverride官方文件

AllowOverride 與 AllowOverrideList和htaccess的安全性設定

  • 上篇能運作是因為我們把apache2.conf中,AllowOverride 設為 All,這樣其實不太好因為這樣等於賦予.htaccess太大的權限
  • 可以直接取消apache2.conf中Directory /var/www的部分,直接到 /etc/apache2/sites-available/demo.XXX.tw.conf 加入 Directory

/etc/apache2/sites-available/demo.XXX.tw.conf

1
2
3
4
5
6
<Directory /var/www>
Options FollowSymLinks
AllowOverride FileInfo(因為這個包含了AllowoverrideList中的RewriteEngine、RewriteRule功能)
AllowoverrideList <IFModule mod_rewrite.c> Deny
Require all granted
</Directory>

.htaccess

1
2
3
4
<IFModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/index\.html$ / [R=301,L]
</IFModule>

移動Log檔到個別專案資料夾

  • 可進/etc/apache2/sites-available/demo.XXX.tw.conf更改

1
2
ErrorLog /var/www/demo/logs/error.log
CustomLog /var/www/demo/logs/access.log combind

路徑變化前的條件判斷,RewriteCond 與 RewriteBase

  • 做兩件事,一是若網址搜尋的是不存在的檔案則導到404頁面(404.html),二是若網址搜尋log目前狀況是可以看到,我們需要將之也導到404頁面
    .htaccess

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<IFModule mod_rewrite.c>
RewriteEngine On
# 以根目錄為基準找
RewriteBase /
# L是斷點的意思,如果符合就中止
RewriteRule ^/index\.html$ / [R=301,L]

# 如果找不到post,導向post/404.html 而非原本的404.html
RewriteCond %{REQUEST_FILENAME} /ports/.*
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /posts/404.html [R=302,L]

# 如果找不到首頁,導向首頁
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [L]

# 如果嘗試看logs,導向404.html
# 使用302是因為目前404是代表現在not found,不代表以後也not found,使用301會鎖住
RewriteCond %{REQUEST_FILENAME} /logs/.*
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ 404.html [R=302,L]
</IFModule>

架設靜態網站於VirtualBox(scp 指令)

  • 複製/etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/progressbar.com.conf
  • 更改 progressbar.com.conf VirtualHost port號 <VirtualHost *:8666> , DocumentRoot /var/www/progressbar
  • 在/var/www中建立 progressbar資料夾,sudo madir progressbar
  • 更改資料夾使用者群組,sudo chown mercue:mercue progressbar
  • 回到本機使用scp -r -P 8001 * mercue@127.0.0.1:/var/www/progressbar
  • 開啟防火牆 sudo ufw allow 8666/tcp
  • 在/etc/apache2/ports.conf 中加入監聽port號,Listen 8666
  • 在本機 VirtualBox 中設定反向代理

看懂Chrome Network 網站速度相關訊息與簡易壓力測試

  • 使用檢查,查看NetWork資訊
  • 最下面一行範例 33 reuest |18.8KB | Finish 12.82s | DOMContent 300 ms | Load 1.23s(整個網站共有33 request ,傳送了18.8KB的資訊,全部的東西都拿到並顯示共花了 12.82s,文字在javascript長出DOM的時間 300 ms,若花費時間太長可能就是server有問題,若 Load 花費時間太長可能就是此網站的圖片同時被太多人access,導致server無法應付)
  • 測試網站速度MacOS預設就有這個指令,Linux則是安裝Apache後就會有。Windows可以使用VirtualBox裡面的上課用的Linux Console來執行。不要自己電腦訪問自己,這樣速度會太快不準。指令功用是可以幫你建立很多的連線去訪問預測試的網站

1
$ ab -n 10 -c 10 [欲測試網站網址]

利用github page實現CDN概念與防止圖床被盜連

  • 將圖片都改為github上的圖片
  • 在progressbar.com.conf(使用的網站) 加上 IfModule

1
2
3
4
5
6
7
8
9
<IFModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://progressbar.newbie.tw$ [NC]
RewriteCond %{HTTP_REFERER} !^http://progressbar.newbie.tw/.*$ [NC]
RewriteRule .*.(jpg|gif|png) "-" [NC,F]
# NC 不管大小寫,F是擋掉的意思,官網說這樣"-"就會變成403
RewriteRule .*.(jpg|gif|png) hater.png [NC,R]
# 也可以寫成這樣表示把它轉到hater.png or 404.html
</IFModule>

module headers 與防止網站被iframe嵌入

  • 到VirtualHost加上

1
Header always append X-Frame-Option SAMEORIGIN
  • 引入module

1
$ sudo a2enmod headers
  • restart apache

1
$ sudo systemctl restart apache2
  • 若browser有header的功能才有作用,否則圖片還是會顯示

利用Let’s Encrypt 安裝HTTPS與SSLProtocol變更

  • 進入Let’s Encrypt官網getting start 中的cerbot
  • 選擇Apache Ubuntu18.04
  • 往下滑至Install 照著指令進行即可

1
2
3
4
5
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
  • Install Certbot

1
$ sudo apt-get install certbot python3-certbot-apache
  • Choose how you’d like to run Certbot,Either get and install your certificates…

1
$ sudo certbot --apache
  • 安裝完成之後需將原有網站的圖片檔案http改成https
  • 將VirtualHost中原本設置為http的地方改為https

1
2
3
4
5
6
7
8
9
<IFModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://progressbar.newbie.tw$ [NC]
RewriteCond %{HTTP_REFERER} !^https://progressbar.newbie.tw/.*$ [NC]
RewriteRule .*.(jpg|gif|png) "-" [NC,F]
# NC 不管大小寫,F是擋掉的意思,官網說這樣"-"就會變成403
RewriteRule .*.(jpg|gif|png) hater.png [NC,R]
# 也可以寫成這樣表示把它轉到hater.png or 404.html
</IFModule>
  • 雖然是免費的但90天就要更新一次不然會過期,詳細方法在下一章節
  • 若想更改細項內容可以進入VirtualHost中最下方Let’s Encrypt自動加入的檔案,Include /etc/letsencrypt/options-ssl-apache.conf

crontab使用與Let’s encrypt自動更新

  • 官網有提供一個指令,90天會自動幫你更新

1
$ sudo certbot renew --dry-run
  • 因為不可能90天就進來做一次,只要是架設在Linux上面都會使用cronjob工具
  • 指令crontab -l 檢視目前有沒有任何的工作要做

1
2
$ crontab -l
no crontab for mercue
  • 指令crontab -e 可以進行編輯
  • 選擇vim,找到# m h dom mon dow command,加上以下內容,此範例為每2分鐘做一次

1
2
# m h dom mon dow command
*/2 * * * * echo "hello" > ~/hello.txt
  • 使用sudo,設定自動執行,意即每個月不管是哪一天都要執行

1
2
# m h dom mon dow command
0 0 1 * * certbot renew --dry-run

Let’s Encrypt官方網站

Welcome to my other publishing channels