跳到主要內容

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  newburn930@gmail.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  newburn930@gmail.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  *:8080,再多一個<VirtualHost 192.168.100.200: 8080 ></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  newburn930  
/*  第一次要產生 .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操作不求人 - 伍章之伍 - make 巨集式編譯器

make是Linux下安裝軟體與程式一個相當重要的工具,如前章節所提的安裝軟體三劍客。 configure, make , make install。當我們完成自己所撰寫的C 或 fortran程式,通常會使用編譯器指令 gcc -cgfortran -c 來編譯成連結檔或物件檔函式庫(Library),如 .a (https://en.wikipedia.org/wiki/Static_library) .o .so等附檔名,而此函式庫又可以讓其他程式利用其中的函式與類別。何時要用到動態或靜態函式庫,stackoverflow有專業的回答(https://stackoverflow.com/questions/140061/when-to-use-dynamic-vs-static-libraries)。

假設我們要寫一個簡單的 C 程式,檔名為 hellomake.c,用 make 來編譯我們的程式,程式如下:
#include<stdio.h>
void main ( void )
{
   print ("This is my first c file."\n);
}

---------------------------------------------------
儲存離開後,利用autoscan 指令,便會產生如圖5-70的兩個檔 autoscan.log 與 configure.scan,而 configure.scan 便是需要產生標準的 GNU makefile 的關鍵檔。我們可以把他改成 configure.in 或 configure.ac,並利用 vim configure 來修改參數,如圖5-71,改為圖5-71右邊的參數











(圖5-70)





(圖5-71)


修改完 configure.in 內的參數後,再執行 aclocal 與 autoconf ,就會產生 autom4te.cache 的資料夾與 configure 的執行檔,此執行檔就是先前章節所要編譯原始碼前,會執行的 ./configure ,並會產生適合您的機器環境之 GNU Makefile,如圖5-72


(圖5-72)
接著編輯 Makefile.am 檔的內容,加入如下內容
AUTOMAKE_OPTION=foreign b…

Linux操作不求人 - 肆章之貳 - 伺服器架設(II) - 郵件伺服器 - postfix 與 dovecot

CentOS6_x64 在預設狀態下,通常已經有開啟發 email 的伺服器軟體 postfix,但僅限制在本機(localhost / 127.0.0.1 ) 使用,且僅是讓系統可以傳送錯誤訊息給 root。故我們要經由設定,讓電腦主機內的使用者帳號,皆可以收發 email,而我們用的送信軟體為 postfix,負責 smtp 的部分( https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol ) ,收信軟體則為 dovecot,負責 pop 或 imap ( https://en.wikipedia.org/wiki/Post_Office_Protocol,https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol )的部分,收發信機制的運作機制,可參考wikipedia,https://en.wikipedia.org/wiki/Email,筆者不再贅述,直接說明架設伺服器軟體的操作。先利用 rpm -qa | grep postfix 與 rpm -qa | grep dovecot 來查詢是否已經有安裝,若無,則利用 yum install postfix 與 yum install dovecot 來安裝。除此之外,再利用 chkconfig | grep postfix 與  chkconfig | grep dovecot 來確認是否有在開機時啟動,若想自動化開機啟動,再請設定 chkconfig --level 235 postfix on 與  chkconfig  --level 235 dovecot on 來載入。 如圖4-10與圖4-11:
































(圖4-10)
















(圖4-11)

     接著我們利用 vim 來修改 postfix 設定檔  /etc/postfix/main.cf 。相同地,我們先閱讀設定檔內容前面的說明,postfix 的作者相當細心,每個設定前的說明很詳細,故設定檔很長,請讀者要有耐心閱讀,如圖4-12-1 至 圖4-12-7。往後篇章若設定檔內容太長,筆者便不再列出,會直接說明新增與修改處,在此先說明。




























































































(圖4-12-1)




























































































(圖4-12-2)





























































































(圖4-12-3)





























































































(圖4-12-4…

Linux 操作不求人系列 - 貳章之壹 - Shell Script 程式設計(I) - BASH

本章開始進入Shell Scripts的程式設計,因為Linux Shell的種類相當多,故筆者僅挑選預設的Bash Shell 及 學術界常會使用的 C Shell (/bin/tcsh )來說明與對照,在此先說明。至於 Scripts 的概念,在前章就已經說明過,可視為前壹章的各項指令之組合,在令其在執行檔案裡,依序執行,如前章所看到的 /etc/profile 檔案,在其他軟體上,有點類似巨集(macro)的執行檔,或是MS Windows的批次檔(Batch)。先建立此概念後,我們可以先在Terminal的命令提示字元,使用 for 指令,如圖2-1,在 shell scripts 內為了重複做一件事,而僅修改某些變數值,我們會利用所謂的迴圈(loop)方式來完成,而 bash shell 內常用的是 for 或是 tcsh/csh shell 內的 foreach



























(圖2-1)


     圖 2-1第一個指令輸入 for 的宣告,後面接著 seq 為變數名稱,為了逐次接收 in 後面之陣列值(http://www.gnu.org/software/bash/manual/html_node/Arrays.html)(註:若加了 ; 則 do 便可寫在同一行),接著 > 的提示字元的等待輸入,便是還沒遇到 done 指令來結束 do 的動作,控制此提示字元的環境變數為 PS2。,此例的 seq 值,依序為第一次讀入 first 字串並存入變數 seq 當其值,接著second、third,從 echo $seq 可以看出,接著設定一個變數 file 其值為 my開頭字串,緊接變數值 $seq(first、second、third),再接固定的 script.sh 字串,接著利用echo指令,印出變數值$file,檢查是不是我們預期的字串值(註:如果想要暫停,讓使用者可以看清楚再繼續,可以加上指令sleep 3,表示畫面停止三秒鐘),接著利用 touch 指令產生 $file 字串值的檔案,再將其利用 chmod 指令,u+x 參數為令僅創立此檔的使用者帳號可執行(若要改為同群組可執行,參數需改為 g+x)。故可看到第二個指令輸入 ls,便列出自動批次產生的shell執行檔了。
     以上其實就是 Shell Script 的程式設計之…