跳到主要內容

Linux操作不求人 - 肆章之參 - 伺服器架設(III) - 網頁伺服器(I) - Apache 或 Nginx

#Apache
     在CentOS6_x64要使用 httpd 的網頁服務,較有名的就屬 Apache (https://httpd.apache.org/) 與  Nginx (https://nginx.org/) 網頁伺服器軟體,而在 CentOS6_x64 下,Apache為預設的網頁伺服器,亦是世界上最普遍使用的網頁伺服器軟體,另一個為MS IIS(Internet Information Service,http://www.iis.net/)。一般讀者會看到,Linux的高手高手高高手們,有些會說 Apache 主要來處理動態網頁(如PHP處理)的扛霸子,Nginx(唸成 Engine X)則是在靜態網頁處理有執牛耳之地位(就是佞北修瓊),除這兩者之外,當然還有很多 http 伺服器軟體(如 lighthttpd,https://www.lighttpd.net/)。Apache 與 NginX 兩者的歷史緣由就不在贅述,讀者可自行去 Wikipedia 看看,當然也有很多比較兩種軟體的 benchmark 的資訊。當然,也有高手用 Apache 與 Nginx 同時啟用來架網頁伺服器,並分流不同型態的網頁,至不同的伺服器軟體處理。但筆者認為,您可以選一樣即可,用 apache(https://en.wikipedia.org/wiki/Apache_HTTP_Server) 或是 Nginx(https://en.wikipedia.org/wiki/Nginx ),因兩者都可以同時處理靜態與動態的網頁,就是依讀者習慣做選擇 (老話一句,您送丟後),筆者個人是習慣用 Apache 來當工作的網頁伺服器軟體。
     一開始,先說明 Apache 的設定。先利用 yum -y install  httpd 來下載 Apache httpd,CentOS6_x64下皆以 httpd 來作為 Apache 的套件名稱。如圖4-22



(圖4-22)

 緊接著,我們利用指令 vim  /etc/httpd/conf/httpd.conf,來編輯設定檔 /etc/httpd/conf/httpd.conf,因為設定檔太長,筆者以下直接說明該修改的參數數值,再提醒聰明的讀者,設定前,皆要仔細閱讀檔案內的說明內容,有些有關 SELinux 對該服務的設定開放方式,會寫在裡面喔:

ServerTokens Prod     
/*  為了系統資訊安全性,使用 Prod 表僅傳回顯示系統資訊為 Server: Apache,而無版本與作業系統版本或模組版本等資訊,預設值 OS ,會顯示版本資訊與作業系統種類  */

KeepAlive On
/*  設定保持 httpd服務連線,此設定開啟時,參數 MaxKeepAliveRequests 的值與 KeepAliveTimeout 值,則會引入 */

MaxKeepAliveRequiests  500
/*  保持每次最大連線數為 500 sessions,建議範圍為100 - 500  */

KeepAliveTimeout  5
/*   僅等待下一次的傳輸秒數為 5 秒 ,建議範圍為 2 - 5 */

Listen 192.168.100.200:80
/*   若有多個 IP,用預設值則會對所有IP開放 80埠的服務,若僅一個IP則不影響。筆者僅設定一個IP,亦可以設定兩個真實IP,如接著再設定 Listen 192.168.100.201:80,再將 192.168.100.201 設成 virtualhost,就可以用不同的 html根目錄來做到不同的網站服務   */

ServerAdmin  idontknow@url.com
/*  管理者的 email 地址  */

DocumentRoot "/var/www/html"
/*  主要存放 index.html 等網站首頁的位置,若您的IP為192.168.100.200,對應的 hostname 為 www.mylinux.com ( 真實 IP 為視 DNS Server 的解析配對名稱),則若在此位置下放置 index.html 檔,在瀏覽器打上 www.mylinux.com ,即可顯示 index.html 的內容,若您不願意讓搜尋引擎搜到 DcumentRoot 內的資料夾內容,亦可在這資料夾下新增一檔案 robots.txt ,其內容為以下:
User-agent: *
Disallow:  /
allow: /index.html    #  表示僅允許搜尋引擎紀錄 index.html

*/

<Directory "/var/www/html">      # 設定個別資料夾路徑的權限,此路徑為 DocumentRoot
  Options  FollowSymLinks        #  如果這個資料夾是虛擬連結,亦可使用
  AllowOverride None   /* 若要使用 .htaccess 設定檔來限定帳密權限,則AllowOverride值設為 AuthConfig,或是設定為 All,用以接受 .htaccess 之參數( https://httpd.apache.org/docs/current/howto/htaccess.html) */
  Order allow, deny  #  設定瑞非允許的IP,皆為拒絕存取此資料夾
  Allow from all        #  允許全部的IP皆可存取此資料夾,all可換成允許的 IP 或 hostname
</Directory>
/*  以上個別資料夾的設定相當重要,可以設定成需認證帳號密碼,與何 IP 範圍才能看到資料夾下的網頁頁面,詳細可參考http://httpd.apache.org/docs/2.2/mod/core.html#options  */

<IfModule mod_userdir.c>
#   UserDir  disabled      
   userDir  public_html
</Ifmodule>

/* 設定是否開放使用者亦可在家目錄建個人網頁,UserDir 預設為 disabled,則不允許個人網頁,若允許則須加上 # 符號,來移除UserDir disabled,並且移除在 userDir 前面的符號 # ,讓 ~/public_html 變成每個使用者的個人網頁根目錄(DocumentRoot),需注意SElinux對網頁根目錄之限制 httpd 的權限,記得要利用以下指令開啟SELinux的homedirs 限制:
$ setsebool -P httpd_enable_homedirs=1
$ setsebool -P httpd_read_user_content=1
除此之外,亦注意 /home/*/public_html 必須為更改權限為 755 ,且 /home/*,必須更改權限至少為 711
*/

DirectoryIndex index.html index.htm index.php
/*  加入 index.php 增加對 index.php 為首頁格式的支援  */

ServerSignature Off
/*  使用 Off 可以關閉錯誤訊息包含伺服器名稱,故可關閉或是設定為 Email ,表示錯誤資訊頁面,僅有管理者 Email 地址  */

若不需使用到 Option Indexes所顯示之Index 頁面,將以下 icons FancyIndexing 功能關閉,約551行:
# Alias /icons/ "/var/www/icons/"
#<Directory "/var/www/icons">
#      Options  Indexes MultiViews  FollowSymLinks
#      AllowOverride None
#      Order allow,deny
#      Allow from all
#</Directory>

DefaultLanguage en 

<VirtualHost 192.168.100.200:80>
  ServerAdmin  idontknow@url.com
  DocumentRoot  /var/www2
  ServerName  www2.mylinux.com
  ErrorLog  logs/www2.mylinux.com-error_log
  CustomLog logs/www2.mylinux.com-access_log common
</VirtualHost>
/*  以上為設定虛擬網站方式,假定同一 IP要提供很多網站的服務 ,或也要讓 VirtualHost 使用 port 443,請在設定 VirtualHost 資料夾前加上  NameVirtualHost  *:443,再多一個<VirtualHost 192.168.100.200: 443 ></VirtualHost> 設定即可,再進入 /etc/httpd/conf.d/ssl.conf,設定 ssl 憑證路徑,檔案內容亦有https(使用 mod_ssl )的 <VirtualHost  _default_:443 ></VirtualHost>設定    */

若要限制某一資料夾需認證帳號密碼存取,我們可利用以下:
<Directory "/var/www/html/myprivate"> 
Option FollowSymLinks
AllowOverride AuthConfig
Order allow, deny
Allow from 192.168.100.
</Directory>
/* 若有一私有資料夾 myprivate 僅允許內網IP,並須帳號密碼驗證,則我們需要在此資料夾下新增兩個隱藏檔 .htaccess 設定對資料夾存取的參數,與 .htpasswd 對可讀取的帳號密碼存放位置
.htaccess 內容如下:
AuthType Basic
AuthUserFile /var/www/html/myprivate/.htpasswd
Auth Name "My private folder"
require valid-user
----------------------------------------------------------------

接著利用指令產生可使用的帳號密碼:
$ cd /var/www/html/myprivate
$ htpasswd  -c  youraccount
/*  第一次要產生 .htpasswd 檔案,需加上參數 -c  ,之後要增加可存取使用者不需加上參數,.htpasswd內的密碼為使用 MD5 加密的明碼。*/


 以上設定完,儲存後離開並重啟動Apache伺服器軟體後,瀏覽無ssl加密的 http://127.0.0.1(localhost) ,已可看到如圖4-23-1。但還須接著設定 ssl 加密 ,我們先利用下面指令來產生私鑰:
$ cd /etc/httpd       # 先進入 /etc/httpd 的設定檔路徑,或是 /etc/pki/tls
$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout myhttpd.key -out myhttpd.pem
/*  同樣產生十年的金鑰與憑證,但因沒經過第三方認證,故使用瀏覽器讀取時,會出現如圖4-23-2,點選允許例外一樣可以瀏覽。若有商業需求,請至第三方憑證發行單位購買,如https://www.verisign.com/  或  http://www.twca.com.tw/portal/product/ssl_3.html,或是可以用免費但90天要更新的憑證發行單位,https://letsencrypt.org/   */

緊接著在 /etc/httpd/conf.d/ssl.conf 設定上述金鑰 myhttpd.pem  與憑證  myhttpd.key
SSLCertificateFile          /etc/httpd/myhttpd.pem
SSLCertificateKeyFile   /etc/httpd/myhttpd.key

與開啓以下設定
DocumentRoot /var/www/html
ServerName *.*.*.*:443    #  此*.*.*.* 端看您的Server Domain Name 爲何

$  service httpd restart
$  chkconfig --level 235 httpd on
$  netstat -tlnp | grep 443          # 查詢是否有在監聽

若皆要導到 https,請在 http.conf 內的<VirtualHost *.*.*.*:80> </VirtualHost>內,
加上如下
Redirect permanent / https//*.*.*.*    # *.*.*.*您的domain name

































(圖4-23-1)


































(圖4-23-2)

開啟防火牆允許規則
$ iptables -A INPUT  -p tcp  --dport 80  -j  ACCEPT
$ iptables -A INPUT  -p tcp  --dport 443  -j  ACCEPT

若是躲在防火牆之 NAT 後方的 httpd 伺服器,可以設定先利用 PREROUTING chain 及允許 iptables FORWARD chain ( https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Security_Guide/s1-firewall-ipt-fwd.html )
$ iptables -t nat -A PREROUTING  -i  eth0  -p  tcp --dport  80  -j  DNAT --to-destination  192.168.100.200
/*  http://linux-ip.net/html/nat-dnat.html  */

並允許 FORWARD chain:
$ iptables -A FORWARD -i eth0 -p  tcp --dport 80  -d  192.168.100.200

$ service iptables save

開放 SELinux 的 httpd 規則
$  setsebool  -P  httpd_read_user_content=true
/*   為了個人家目錄內的  public_html 資料夾,用來放置使用者帳號的個人網頁資料   */

$  chcon  -Rv  --type=httpd_sys_content_t  /var/www/html
/*  增加 /var/www/html 為讓 SELinux  允許可讓 httpd 所開放的內容  */

$  semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"  
/*  要下載 SElinux tool( yum -y install policycoreutils-python ),才能利用指令 semanage,加入 SElinux 允許 httpd 永久對網頁所使用的資料夾,與其內的子資料夾之檔案做開放  */

$ semanage port -a -t http_port_t -p tcp 443
/*  利用指令 semanage,開啟對 tcp port 443 的允許。  */

其他關於 Apache 2.2.X 的詳細參數,可以參考 apache 的網站說明,http://httpd.apache.org/docs/2.2/en/


# Nginx
     關於安裝 Nginx 的部分,亦可以先由 yum install nginx 或 yum -y install nginx (記得要先有 epel-release,連看不想看的下一步懶人裝法,如圖4-24






































(圖4-24)

     啟動 Nginx前,我們先利用 service httpd stop,停掉我們的 Apache 服務吧。nginx下載後直接 service nginx start 啟動即可(圖4-25),好,哈哈收工,下去領500。就這樣?對,不是眼睛業障重,最基本的就是 Nginx 伺服器如此,瀏覽器網址列輸入 localhost(127.0.0.1), 便可以展示靜態 HTML 網頁。雖是如此,筆者還是需做一些設定的介紹,讓讀者可以像調整 Apache 參數一樣,可以多調整 Nginx。Nginx 的設定檔為 /etc/nginx/nginx.conf,檔案內容很少,如圖4-25,讀者們有沒有更愛上它了呢?




































(圖4-25)

    我們來修改 /etc/nginx/nginx.conf 參數(圖4-26)看看,是否發揮他的效能,以下僅列出要改的參數值,其餘數值維持預設即可:
worker_processes 2; 
/* 端看您的 CPU 核心數目,筆者核心數為 2 核心,亦可由指令 cat /proc/cpuinfo | grep processor 得知。如真的懶得知道硬體規格,亦可以直接使用 auto 即可 */

events {  # 僅提出要修改處,其餘維持預設值
   worker_connection 10240;
   multi_accept on;
   use   epoll;
}
/*  用 ulimit -n 可以查到系統可同時開啟的檔案數,我們利用編輯 /etc/security/limits.conf,將系統的安全限制打開至最大 65535  0 (無限制),如圖4-27,但 worker_connection 不要設定到最大值,僅先給定 10240(要注意 worker_processes數值 * worker_connection數值是否會超過 limit 數值 65535 ),表示每秒可以接受10240個使用者連線 ,通常端看伺服器能承受的負載程度。  */

http{       # 僅提出要修改處,其餘維持預設值
keepalive_timeout  5;  #設定如 Apache ,代表每次連線的暫停時間,以提高連線可接受次數
gzip on
}







































(圖4-26)








































(圖4-27)

若需要使用架設多網站功能,則須設定 nginx VirtualHost 設定檔放置於 /etc/nginx/conf.d/virtual.conf,如圖4-28,一樣可導到 /usr/share/nginx/vhost ( 預設的 Nginx root document 為 /usr/share/nginx/html )資料夾內的 index.html 內容。listen 的部分,就端看您的 IP ,只因筆者皆在 VM 下實作,故皆設127.0.0.1。最後記得要開放 SELinux 的允許 http 存取的 port,指令如下:
$ semanage port -a -t http_port_t -p tcp 8080



















(圖4-28)


    最後,與Apache同樣的,我們一樣要讓 nginx 可以使用 ssl 來加密,以下再產生一個十年憑證:
$ cd /etc/nginx       # 先進入 /etc/nginx 的設定檔路徑,或是 /etc/pki/tls
$ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout mynginx.key -out mynginx.pem

將以上產生的金鑰與憑證加入 /etc/nginx/conf.d/ssl.conf  的內容裡,並去除一些參數前的 # 符號,如圖 4-29


































(圖4-29)

上述的參數設定修改完,儲存後離開,記得要開啟防火牆允許 Nginx有使用到的 port:
$ iptables -A INPUT  -p tcp  --dport 80,443  -j  ACCEPT
$ iptables -A INPUT  -p tcp  --dport 8080  -j  ACCEPT
$ service iptables save

與 SELinux 的限制
$ semanage port -a -t http_port_t -p tcp 443
$ semanage port -a -t http_port_t -p tcp 8080

其中SELinux對網頁資料夾的限制,一樣要開啟權限允許
$  chcon  -Rv  --type=httpd_sys_content_t  /var/www
$  semanage fcontext -a -t httpd_sys_content_t "/var/www(/.*)?"  
/*  端看您的 VirtualHost 所存放資料的位置  */

以上 iptables 與 SELinux 設定允許後,對於非 localhost 的連接埠才能使用服務,對於對外開放的網頁伺服器,才有網頁服務的能力。

一樣將 nginx 加入開機執行,並重啟動它來服務吧!
$ chkconfig --level 235 nginx on
$ service nginx restart

讀者若需要了解更多 nginx 參數設定,請參考 http://nginx.org/en/docs/

     以上為 Apache 與 Nginx 設定靜態網頁的功能,若要使用互動式的網頁,這樣沒有引入CGI 模組的狀態下,是無法解析(parse)如 .php 網頁這種動態的頁面,故下一節我們便要接著提到使用 PHP 的直譯器模組,引入 Apache(使用mod_php) 與 Nginx (使用 PHP-FPM) 來使用,並配合安裝 MySQL/ MariaDB 與 相當好用的 資料庫網頁管理軟體  phpMyAdmin (https://www.phpmyadmin.net/)。當這些技術都學會後,就可以架設單位或公司的"關番碗讚"(官方網站),再也不需求人了。


If you have any feedback or question, please go to my forum to discuss.

這個網誌中的熱門文章

Linux 操作不求人系列 - 貳章之貳 - Shell Script 程式設計(II) - BASH 與 TCSH / CSH

     在上章,我們介紹很多bash shell指令的應用方式,並讓它們變成 script,在這章此節,我們要承襲上節,繼續討論 bash shell script 的其它程式設計概念,與讓程式可重複使用的方法,就是利用函式(function)。      首先,我們來創作一個判斷是否為閏年的函數,script的名稱就取為 check_year.sh ,請自行將其設為可執行。程式碼如圖2-6,為了解說方便,筆者利用指令 nl check_year.sh 將程式碼包含行數印出(圖2-7),其他除顏色外,都與圖2-6同。以下 export 宣告環境變數,自訂變數無需加宣告保留字。(2021.10.07更正export說明,以下自訂變數宣告請直接去除export開頭) (圖2-6) (圖2-7)        圖2-7第2-6行,與之前的範例相似,皆有防堵參數個數輸入錯誤的判斷。第7-11行為接著判斷輸入的年分,是否為真的正整數,也就是大於零的數字。其中第7行可解釋為,利用正規表示式搜尋 $2 字串值得頭至尾部的字元,皆由 0-9 組成,若有,則為真(True)會進入 if 內的陳述執行, 但我們想要的,應該是僅要字串其中一字元為非正整數,便進入if 內的警告並跳出 。故,筆者在判斷式前多加一個 ! ,代表著當字元完全是正整數時,就不要執行  if  內陳述,而直接往第12行執行,但若其中有一個字元為非正整數,則會進入 if 內印出錯誤訊息並跳出 Script 。在此例使用者輸入非正整數等字串(如:12ab、cde、1a1b),便會出現錯誤訊息"Error Value",並跳出 Script 。而第8行的判斷式,效果跟第7行相同,但只能在BASH 3.0才能支援,故筆者故意保留,讓讀者可以學到另一種表示方式。         第12-28行,為宣告一個函式 leapyr () ,在 BASH Script內若要使用含式,必須在使用之前先建立函式的功能,如函式建立在第12-28行,則若要呼叫使用(Call)函式,則必須在第29行之後才能呼叫,並且可重複呼叫。第13行為定義函式呼叫時,一定會有一個外部參數, 此外部參數非該 Script 的外部參數 ,而是由程式撰寫者給入,故在此無設定防呆判斷。第14-

Linux操作不求人 - 伍章之陸 - Intel PXE 與利用 tftp + anaconda kickstart來自動部署系統

     現代的個人電腦與筆電爲了節能省碳,往往皆省略了光碟機的設置。雖然說 USB隨身碟亦可應用於安裝作業系統,但若遇到機房的大量機器需安裝之問題,亦不適合此種用光碟片或隨身碟逐臺安裝的方式,或是需準備多片光碟或隨身碟。故爲了大量安裝與部屬 Linux作業系統的機器,我們便可透過具有PXE功能之網路卡(https://en.wikipedia.org/wiki/Preboot_Execution_Environment),其所具備的網路開機的能力,來作透過網路方式來安裝與大量部署 CentOS Linux作業系統。其原理 wikipedia  的PXE說明,都解釋得很清楚,筆者不需要再 " 掉書包 ",在開發者大神面前班門弄斧,我們就直接來做做看。      首先,我們一樣透過 yum來安裝所需的 tftp伺服器軟體(http://www.jounin.net/tftpd32.html),利用PXE支援 tftp 透過 udp 埠號 69連線,來提供檔案的能力,給利用 PXE開機後安裝作業系統的機器,圖5-60   (圖5-60) 接著修改 tftp 設定檔 /etc/xinetd.d/tftp,如圖5-61,請記得 disable  要改為 no (圖5-61)      若要修改 server_args 參數為自訂的 tftp root 路徑,記得要變更 SELinux 的權限設定,如要改為/tftpboot,則使用指令 chcon  來調整,如以下: $ mkdir /tftpboot $ chcon  --reference /var/lib/tftpboot  /tftpboot 接著將 xinetd 與 tftp 加入開機啟動,並重啟動 xinetd,如下: $ chkconfig  --level  235  xinetd on $ chkconfig  --level  235  tftp  on $ service xinetd restart 開放防火牆通行 $ iptables -A INPUT -p udp --dport 69 -j ACCEPT $ service iptables re

Linux操作不求人- 肆章之壹 - 伺服器架設(I) - SSH(SFTP、SCP)、FTP伺服器與遠端連線

@ ssh, sftp      通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋: $   rpm  -qa  |   grep  openssh     #  ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。 或使用以下 $   rpm  -qa  |   grep  ssh         #  比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。      如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。 (圖4-1) 再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2 $ chkconfig | grep ssh   # 查詢 sshd 是否有於 開機 runlevel 啟動 再利用以下指令,來查詢是否防火牆有允許連線 $ iptables  -L  |  grep ssh   # 出現如圖4-2 允許通過之條件 (圖4-2)      接下來,我們要先來調整 sshd 的設定檔,利用 vim  /etc/sshd/sshd_conf ,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。 (圖4-3-1)