Linux之Web服務(2)Httpd服務配置之一html
Apache HTTP Serverlinux
Apache HTTP 服務器,簡稱Apache,是很是留下的Web服務器軟件。一般和腳步語言好比PHP,數據庫MySQL一塊兒工做,合成爲LAMP棧(Linux, Apache, MySQL, PHP). 固然流行的Web服務器還有nigix,可是nigix雖然輕量級很穩定,可是功能並不如Apache HTTP功能豐富,而且如今的Apache HTTP還支持模塊化功能,及能夠開發本身的功能模塊並加入到此Web服務器軟件中,更靈活的知足Web業務甚至是和http協議相關的實現。web
本篇主要講解在CentOS 7 上安裝Httpd2.4和相應的配置。shell
Httpd2.4具體配置介紹數據庫
一、Httpd2.4的安裝apache
#使用yum安裝vim
[root@root ~]# yum install httpd -y
#安裝後查看httpd信息,能夠檢查是否已經安裝
後端
[root@root ~]# yum info httpd Loaded plugins: fastestmirror Determining fastest mirrors Installed Packages Name : httpd Arch : x86_64 Version : 2.4.6 Release : 40.el7.centos Size : 9.4 M Repo : installed From repo : centos6 Summary : Apache HTTP Server URL : http://httpd.apache.org/ License : ASL 2.0 Description : The Apache HTTP Server is a powerful, efficient, and extensible : web server.
2、Httpd2.4 默認配置centos
主程序文件:/usr/sbin/httpd瀏覽器
模塊文件:/usr/lib64/httpd/modules/*.so
注:可使用httpd -M 查看當前服務加載的模塊文件列表
主配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d*/.conf
/etc/httpd/conf.modules.d/*.conf
站點文檔路徑:
/var/www/html
日誌文件路徑:
/var/log/httpd/access_log :訪問日誌
/var/log/httpd/error_log: 錯誤日誌
Systemd Unit File:
/usr/ib/systemd/system/httpd.service
自帶腳步文件:
/usr/sbin/apachectl
注意:在CentOS6及之前使用SysV風格啓動的服務腳步使用的就是此腳本。
三、Http2.4 服務的啓動和關閉
#啓動服務
[root@root ~]# systemctl start httpd.service
#關閉服務
[root@root ~]# systemctl stop httpd.service
#查看服務是否啓動成功
[root@root ~]# systemctl status httpd.service
#經過查看默認端口80查看是否開啓監聽
[root@root ~]# netstat -tnlp | grep ':80\>' tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 88660/httpd
#也能夠經過查看進程來查看httpd相關的進程組
[root@root ~]# ps -axu | grep 'httpd\>' | grep -v '\<grep\>' root 88660 0.0 0.5 222032 5104 ? Ss 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88661 0.0 0.3 222032 3108 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88662 0.0 0.3 222032 3108 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88663 0.0 0.3 222032 3100 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88664 0.0 0.3 222032 3100 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND apache 88665 0.0 0.3 222032 3108 ? S 12:47 0:00 /usr/sbin/httpd -DFOREGROUND
解析:這裏發現進程的發起者竟然都是apache,這是爲了保護系統而產生的一個系統用戶,該用戶只負責Httpd守護進程操做,這樣若是Httpd服務被***,而保護了操做系統。在某些低版本如Httpd2.2版本中使用的系統帳戶名可能爲httpd。
4、Http2.4 準配前工做
#對80或Httpd指定監聽的端口開發防火牆
[root@root ~]# iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
#保存此防火牆規則配置
[root@root ~]# iptables-save
5、Httpd2.4 基礎配置檢查
配置文件格式:
DIRECTIVE VALUE
DIRECTIVE:指令,不區分字符大小寫;例如ServerRoot;
VALUE:該值除了文件系統指定路徑除外,大多數也不區分大小寫;
配置修改完後注意事項:
(1)檢查語法; 注:可使用 httpd -t 來檢查,若是顯示OK則無錯誤
(2)讓服務從新重載配置文件
實例:
#檢查配置文件語法是否有誤,OK表示無語法錯誤
[root@root ~]# httpd -t
Syntax OK
#重載服務配置
[root@root ~]# systemctl reload httpd.service
#固然也能夠經過發送1號信號讓 Httpd守護進程從新生成
[root@root ~]# pkill -SIGHUP -f '.*\/httpd\>'
6、具體的配置指令及其選項介紹
1、基本配置指令
ServerTokens OS #會顯示當前apache版本和系統版本 ServerRoot "/etc/httpd" #默認服務器配置跟目錄 PidFile run/httpd.pid #進程信息的存放路徑,相對路徑,相對於/etc/httpd/下 Timeout 60 #超時時間,60秒後端口並從新鏈接 Listen [ip:]port #監聽的地址和端口
注:Listend能夠重複定義屢次,默認監聽本機可用的全部地址;當須要修改監聽多個監聽端口或者添加多個監聽端口時,須要從新啓動httpd服務守護進程,及:
$ systecml restart httpd.service
2、保存鏈接的限制類指令
提示persistent connection : tcp鏈接創建後,資源獲取完成後不會斷開鏈接,而會繼續等待。
而如何進行控制其餘多個資源經過端口訪問進程?
方案猜測:進行訪問的數量限制,進行同一進程訪問的時間限制。
具體配置舉例說明:
是否開啓保存鏈接
KeepAlive on|off
舉例說明:在Tcp進行通訊須要3次握手來創建鏈接,而假設若是須要進行傳輸文件時使用此協議,則傳送一次文件後端口鏈接而後再次3次鏈接創建一次鏈接來進行下一次文件傳輸。
若是改成On,則表示只在傳輸第一個文件時創建一次Tcp鏈接,而不會斷開,接下來繼續進行下面的傳輸不在進行創建鏈接的請求過程。
單一用戶的保持鏈接最大請求次數
MaxKeepAliveRequest 100
解析:當輸出此時爲100次才端口一次鏈接,而後再次創建Tcp鏈接。
注意:只有KeepAlive 設爲爲On 時此選項纔會跟着生效。由於傳輸文件時不能總保持不斷開鏈接,所以這裏設置一個最大的傳輸請求次數來控制,防止網絡請求隊列堵塞。
單一用戶的一次保持鏈接的超時時間,默認爲s秒,httpd2.4能夠設置ms表示毫秒
KeepAliveTimeout 15
解析:假設當進行文件傳輸時,速度很慢,那麼此此文件傳輸超過15秒會自動斷開進行以下一次傳輸鏈接的創建。
2、MAP多處理模塊
prefork MAP 可靠性、兼容性強的MAP,多進程,一個進程處理一次請求;
worker MAP 更高伸縮性的線程MAP,多線程,一個線程程處理一個請求;
event MAP 多線程,每線程處理一次請求,基於事件驅動機制;
這裏主要列出perfork MAP介紹
StartServers 8 #httpd進程組默認會開啓8個守護進程 MinSpareServers 5 #當有多個用戶來進行訪問,會至少有5個進程用來備份使用 MaxSpareServers 20 #最大值預留 ServerLimit 256 #限制容許多少個用戶進行鏈接 MaxClients 256 #容許多少個用戶同時鏈接,及同一時間段的併發量 MaxRequestsPerChild 4000 #最大請求模塊子進程
3、模塊的加載和查看
使用httpd 命令選項查看已經加載的模塊
-t -D DUMP_MODULES : show all loaded modules
-M : a synonym for -t -D DUMP_MODULES
模塊加載具體配置LoadModule
#httpd服務啓動時默認加載的模塊
LoadModule mod_name modules/mod_filename
注意:這裏的LoadModule指定的模塊名會在httpd -M命令中顯示,然後面第二個參數纔是真正對應的模塊文件路徑,此路徑爲相對路徑,相對於ServerRoot配置節點指定的路徑,通常默認爲:
ServerRoot /etc/httpd/ #Httpd服務的根目錄 Include conf.d/*.conf #讀取包含指定目錄下的配置文件
4、用戶相關配置:
User apache #系統用戶,用於執行httpd守護進程 Group apache #系統組,用於此組用戶來管理httpd
注意:此係統用戶通常不會輕易修改,就算要修改也要指定爲一個系統用戶,而且此用戶的默認shell類型爲/sbin/nologin,一次來就算Web服務站點出現的問題或被***,可是此進程的執行爲系統用戶,保證了系統的安全。
5、網站Main Server主要配置
#web服務站點郵箱,如:
ServerAdmin root@localhost
解析:通常爲管理員郵箱,當站點出現問題會發送服務的相關日誌信息給指定郵箱。
#設置站點域名,能夠設置,如:
ServerName www.example.com:80
注意:此域名默認通常機器不會有,當啓動服務時會出現一個提示說找不到ServerName指定域名,所以,能夠設置爲直接的主機名或者DNS配置的域名便可。
#站點文檔及網頁根路徑
DocumentRoot 「/var/www/html」
6、站點文檔訪問受權及衆多服務特性的配置:
一、基於文件系統路徑:
<Directory 「/PTATH/TO/DIR」>
</Directroy>
<File 「」>
</File>
二、基於URL訪問:
<Location 「URL」>
</Location>
<Location "URL">
</Location>
<LocationMatch ~ "URL_PATTERN">
</LocationMatch>
三、訪問的選項節點
Options
選項固定參數:
Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None #表示都不選 All #表示選擇全部參數功能 Indexes: #索引 FollowSymLinks: #容許使用符號連接訪問資源 ExecCGI: #容許執行CGI模塊配置的腳本
具體案例解析:
1、Indexes 功能展現
#修改默認配置添加
<Directoiry "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
<DIrectoiry/>
說明:Indexes表示當訪問這個設定的目錄下是,若是沒有index.html文件,則把此目錄下的全部文件列表顯示在網頁中。如:
#在默認站點文檔根目錄/var/www/html 下建立xx目錄
[root@meng ~]# mkdir /var/www/html/xx
#切換到xx目錄
[root@meng ~]# cd /var/www/html/xx/
#建立兩個帶測試內容的文本文件
[root@meng xx]# echo aa > aa.txt [root@meng xx]# echo bb > bb.txt [root@meng xx]# sync
#從新啓動服務
[root@meng xx]# service httpd restart
#再次進行訪問
[root@meng xx]# links http://10.1.249.185:80/xx/
解析:這裏由於沒有檢查當前目錄下有index.html文件,因此會把當前目錄下的其它全部文件列表給列出來。
說明:若是去掉Indexes 則表示若是目錄下沒有index.html文件,則會隱藏該目錄下的其它全部文件,如顯示如下信息:
[root@meng xx]# links http://10.1.249.185:80/xx/
Forbidden#forbidden #表示爲被禁用的意思
解析:這裏最後一行就把系統的版本以及web站點服務器軟件的版本以及端口後都顯示出來。也是當全局設置有ServerTokens OS纔會顯示。這裏顯示的Forbidden就是上篇所列出的response響應介接收返回的狀態碼status code對應的403,及無權限訪問此目錄下除了默認文件名的默認文檔及index.html的其它任何文件。
注意:Directory配置不能指定文件訪問,爲全局的,所以但若是指定該目錄有文件,任然能夠直接全路徑進行訪問指定資源,如查找 aa.txt,如:
[root@meng xx]# links http://10.1.249.185/xx/aa.txt aa
解析:那爲何任然能夠經過此指定資源全路徑來訪問呢?由於這裏的配置只是對Directory定義的整個目錄生效,可是若是目錄裏的資源文件路徑被獲取,那麼文件仍是能夠訪問的,要拒絕經過指定文件資源路徑訪問能夠經過配置File標籤,及添加:
<Files ~ "/var/www/html/xx/.*\.txt$"> Require all deiend </Files>
說明:這裏訪問/var/www/thml/xx/以.txt結尾的文件都不能訪問了。固然若是創建了其它非以.txt 結尾的文件仍是能夠訪問的,如:
#新建一個覺得.txt的文件,這時訪問此文件時無權限的
[root@meng ~]# echo hello > /var/www/html/xx/hello.txt
#那麼給這個修改此文件名的後綴爲.log
[root@meng ~]# rename txt log /var/www/html/xx/hello.txt
#則再次使用資源文件全路徑去訪問hello.log
[root@meng ~]# links http://10.1.249.185/xx/hello.log
說明:這裏能夠訪問說明只對.txt後綴的文件作了訪問限制,那麼是否是經過全資源路徑就沒法訪問剛纔的aa.txt路徑了呢?非也,使用curl命令就能夠抓取資源,如:
#使用curl將指定路徑資源文檔頁面源代碼讀取打印
[root@meng ~]# curl http://10.1.249.185/xx/aa.txt aa
#固然直接打印此路徑下的全部文件列表仍是不行的
[root@meng ~]# curl http://10.1.249.185/xx/
解析:curl可以根據資源記錄來捕獲對應的資源的源代碼,固然在/var/www/html/xx目錄下是沒有index.html命名的文件,因此要想打印出下面的文件列表,仍是不行的。那麼添加一個index.html 文件。
#在xx目錄下添加一個index.html默認首頁文檔
[root@meng ~]# echo '<html><head><title>新的默認頁<title></head><body><h1>Default<h1></body></html>' \ > > /var/www/html/xx/index.html
#使用curl嘗試訪問並讀取其資源
[root@meng ~]# curl http://10.1.249.185/xx
解析:這裏彷佛明白了什麼,curl只是抓取資源的原代碼或原內容,並不會解析對應的html標記,顯示了301狀態碼錶示這個目錄下的文件被移動過。
#那麼顯示剛剛創建的/var/www/html/xx/index.html
[root@meng ~]# curl http://10.1.249.185/xx/index.html <html><head><title>新的默認頁<title></head><body><h1>Default<h1></body></html>
說明:這樣直接就將源碼截獲了,那麼怎麼辦,只有給此文件設置訪問控制facl了嗎?和linux中的rwx基本權限相似,若是一個目錄不能訪問那麼其下的全部資源若是設置了不能訪問,那麼就徹底不能訪問了。如,修改Directory對/var/www/html/xx目錄的配置:
<Directory "/var/www/html/xx"> Options FollowSymLinks AllowOverride AuthConfig Require all deined#將容許全部修改過爲拒絕全部 </Directory>
#此次再次使用curl去抓取資源源碼
[root@meng ~]# curl http://10.1.249.185/xx/index.html
說明:這樣設置了直接對當前整個目錄設置了訪問控制,那麼想要訪問此目錄的任何文件都不行了,403表示沒有權限,curl使用讀取web資源內容來打印,可是如今也沒有權限去獲取此資源文件了,那麼使用瀏覽器或者links更無法了。
總結:
其實這裏不必這麼麻煩,通常若是在一個目錄下有多種類型的文件,這時能夠經過設置對應的<Files> 標籤來對指定文件名設置訪問權限。而去掉<Directory>裏Options中的Indexes是爲了安全考慮。Indexes的生效主要跟是否有index.html默認頁有關,若是沒有此默認頁,那麼去掉此項並設置訪問拒絕才不會顯示訪問到全部文件。若是須要將不想讓指定的文件在此目錄下被訪問,若是在如今的CentOS系統中,就好辦了,直接將不想被訪問而且被打印在文件列表中:
一、將此文件設置爲隱藏文件
二、給對應的文件設置<Files >標籤控制訪問
驗證總結案例實現:
#刪除剛纔建立的index.html默認頁
[root@meng ~]# rm -f /var/www/html/xx/index.html
#修改FIles標籤拒絕全部人html/xx目錄下全部以.開頭並以txt結尾的文件
[root@meng ~]# vim /etc/httpd/conf/http.conf <Directory "/var/www/html/xx"> Options Indexes FollowSymLinks AllowOverride AuthConfig Require all granted <Files ~ "/var/www/html/xx/\..*txt$"> Require all deined </Files>
#修改aa.txt文件名爲.aa.txt及爲隱藏文件
[root@meng ~]# rename aa .aa /var/www/html/xx/aa.txt
#此時經過ls默認選項查看xx目錄已經沒法找出隱藏文件.aa.txt了
[root@meng ~]# ls /var/www/html/xx/ bb.txt
#經過links訪問此目錄
[root@meng ~]# links http://10.1.249.185/xx/
解析:由於沒有index.html及默認頁,全部打印當前目錄下的全部資源文件,但不包括隱藏文件,所以.aa.txt並無被打印。
#同時爲了防止curl抓取內容,刪除全部用戶的r及讀權限
[root@meng ~]# chmod -r /var/www/html/xx/.aa.txt
#只是經過curl命令來經過web讀取資源,就不行了
[root@meng ~]# curl http://10.1.249.185/.aa.txt <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL /.aa.txt was not found on this server.</p> <hr> <address>Apache/2.2.3 (Red Hat) Server at 10.1.249.185 Port 80</address> </body></html>
說明:curl是須要是一個二進制執行程序,默認有x及執行權限,而對應的文件沒有讀權限,所以此curl獲取資源源碼失效。
#固然若是使用root用戶直接在本地讀取此文本仍是能夠的,只是對web作了限制
[root@meng ~]# whoami root [root@meng ~]# cat /var/www/html/xx/.aa.txt aa
2、Options FollowSymLinks 容許符號連接
說明:容許Directory定義指定目錄下建立符號連接來訪問其餘路徑文件。
功能展現
#給/var/www/html默認文檔路路徑對應的Directory標籤中添加此選項:
<Directory 「/var/ww/html> Options FollowSymLinks ..........
#在根目錄下建立一個目錄 :
[root@meng ~]# mkdir /xx
#在xx目錄下預習創建一個默認頁面
[root@meng ~]# echo echo aa > /xx/index.html
#切換到默認文檔根路徑
[root@meng ~]# cd /var/www/html/
#給建立的默認頁index.html添加httpd服務所需的安全上下文
[root@meng html]# chcon -R -t httpd_sys_content_t /xx/
#在根路徑下建立一個符號連接yy文件執行剛纔的/xx目錄
[root@meng html]# ln -s /xx/ yy
#查看文檔目錄下的全部文件的安全上下文
[root@meng html]# ll -Z -rw-r--r-- root root root:object_r:httpd_sys_content_t index.html drwxr-xr-x root root root:object_r:httpd_sys_content_t xx lrwxrwxrwx root root root:object_r:httpd_sys_content_t yy -> /xx/
#發送 SIGHUP 信號重載Httpd服務配置
[root@meng html]# pkill -HUP 'httpd.*'
#進行站點下的yy服務連接,顯示結果實際爲文件系統根路徑下的xx目錄,及/xx
[root@meng html]# links http://10.1.249.185:80/yy echo aa
說明:這裏顯示的內容並非根據規則目錄標籤裏定義的指定爲/var/www/html目錄下的相對路徑yy,這個yy爲一個軟鏈接,而鏈接的指定的是一個目錄,而目錄裏有index.html則執行的是這個網頁。
3、AllowOverride 訪問控制配置
httpd的訪問控制配置,容許每目錄單獨進行;在每一個目錄下創建一個.htaccess文件;
AllowOverride 表示是否容許目錄中的.htaccess文件中的配置來覆蓋當前配置段中的配置;
具體的參數:
Options 多選項
FileInfo 詳細文件配置,通常用於文件Files標籤配合
AuthConfig 容許使用Auth配置文件來讀取配置設定
Limit 容許限制訪問範圍控制
All 全部設定
None 不使用任何設定