僅以此紀錄線上課程 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時)
用virtual box時我們會連到自己本機的8800 port(virtual box設定)
由127.0.0.1:8800轉到virtual box上主機的80 port
ufw防火牆設定
預設未開啟,開啟後若無特別設定則會關閉所有連入要求
若要開啟可先查看防火牆狀態,操作如下
指令 sudo ufw app list(可得知防火牆現在允許通過的applications)
指令 sudo ufw app info OpenSSH(確認 OpenSSH 細節)
指令 sudo ufw allow 22/tcp(允許tcp 協定 22 port access)
指令 sudo ufw enable(打開防火牆)
指令 sudo ufw status(查看防火牆狀態)
指令 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的開關方式
systemctl
開啟sudo systemctl start apache2.service
可先查看要開啟的服務清單,sudo systemctl list-unit-files
關閉sudo systemctl stop apache2.service
查看狀態sudo systemctl status apache2.service
service(通用型給系統使用)
開啟sudo service apache2 start
關閉sudo sudo service apache2 stop
查看狀態sudo service apache2 status
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]
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進來的人可以看到哪些資料夾內容
envvars
環境變數、起服務user & group、log file 位置
ports.conf
conf-enabled
其他配置檔,enabled代表會使用的,會去連結available檔
conf-available
mods-enabled
mods-available
sites-enabled
sites-available
magic
vim指令 set nu 及顯示行數 Linux 指令 top 可以查看目前所有進行中的程序
[補充] Option詳解
ALL
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 / RewriteRule ^/index\.html$ / [R=301,L] 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] 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] RewriteRule .*.(jpg|gif|png) hater.png [NC,R] </IFModule>
1 Header always append X-Frame-Option SAMEORIGIN
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
1 $ sudo apt-get install certbot python3-certbot-apache
Choose how you’d like to run Certbot,Either get and install your certificates…
安裝完成之後需將原有網站的圖片檔案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] RewriteRule .*.(jpg|gif|png) hater.png [NC,R] </IFModule>
雖然是免費的但90天就要更新一次不然會過期,詳細方法在下一章節
若想更改細項內容可以進入VirtualHost中最下方Let’s Encrypt自動加入的檔案,Include /etc/letsencrypt/options-ssl-apache.conf
crontab使用與Let’s encrypt自動更新
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 */2 * * * * echo "hello" > ~/hello.txt
使用sudo,設定自動執行,意即每個月不管是哪一天都要執行
1 2 0 0 1 * * certbot renew --dry-run
Let’s Encrypt官方網站