Apache 配置詳解(最好的APACHE配置教程)
Apache的配置
Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改。
主站點(diǎn)的配置(基本配置)
(1) 基本配置:
ServerRoot "/mnt/software/apache2" #你的apache軟件安裝的位置。其它指定的目錄如果沒有指定絕對(duì)路徑,則目錄是相對(duì)于該目錄。
PidFile logs/httpd.pid #第一個(gè)httpd進(jìn)程(所有其他進(jìn)程的父進(jìn)程)的進(jìn)程號(hào)文件位置。
Listen 80 #服務(wù)器監(jiān)聽的端口號(hào)。
ServerName www.clusting.com:80 #主站點(diǎn)名稱(網(wǎng)站的主機(jī)名)。
ServerAdmin admin@clusting.com #管理員的郵件地址。
DocumentRoot "/mnt/web/clusting" #主站點(diǎn)的網(wǎng)頁(yè)存儲(chǔ)位置。
以下是對(duì)主站點(diǎn)的目錄進(jìn)行訪問(wèn)控制:
<Directory "/mnt/web/clusting">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
在上面這段目錄屬性配置中,主要有下面的選項(xiàng):
Options:配置在特定目錄使用哪些特性,常用的值和基本含義如下:
ExecCGI: 在該目錄下允許執(zhí)行CGI腳本。
FollowSymLinks: 在該目錄下允許文件系統(tǒng)使用符號(hào)連接。
Indexes: 當(dāng)用戶訪問(wèn)該目錄時(shí),如果用戶找不到DirectoryIndex指定的主頁(yè)文件(例如index.html),則返回該目錄下的文件列表給用戶。
SymLinksIfOwnerMatch: 當(dāng)使用符號(hào)連接時(shí),只有當(dāng)符號(hào)連接的文件擁有者與實(shí)際文件的擁有者相同時(shí)才可以訪問(wèn)。
其它可用值和含義請(qǐng)參閱:http://www.clusting.com/Apache/ApacheManual/mod/core.html#options
AllowOverride:允許存在于.htaccess文件中的指令類型(.htaccess文件名是可以改變的,其文件名由AccessFileName指令決定):
None: 當(dāng)AllowOverride被設(shè)置為None時(shí)。不搜索該目錄下的.htaccess文件(可以減小服務(wù)器開銷)。
All: 在.htaccess文件中可以使用所有的指令。
其他的可用值及含義(如:Options FileInfo AuthConfig Limit等),請(qǐng)參看: http://www.clusting.com/Apache/ApacheManual/mod/core.html#AllowOverride
Order:控制在訪問(wèn)時(shí)Allow和Deny兩個(gè)訪問(wèn)規(guī)則哪個(gè)優(yōu)先:
Allow:允許訪問(wèn)的主機(jī)列表(可用域名或子網(wǎng),例如:Allow from 192.168.0.0/16)。
Deny:拒絕訪問(wèn)的主機(jī)列表。
更詳細(xì)的用法可參看:http://www.clusting.com/Apache/ApacheManual/mod/mod_access.html#order
DirectoryIndex index.html index.htm index.php #主頁(yè)文件的設(shè)置(本例將主頁(yè)文件設(shè)置為:index.html,index.htm和index.php)
(2) 服務(wù)器的優(yōu)化 (MPM: Multi-Processing Modules)
apache2主要的優(yōu)勢(shì)就是對(duì)多處理器的支持更好,在編譯時(shí)同過(guò)使用--with-mpm選項(xiàng)來(lái)決定apache2的工作模式。如果知道當(dāng)前的apache2使用什么工作機(jī)制,可以通過(guò)httpd -l命令列出apache的所有模塊,就可以知道其工作方式:
prefork:如果httpd -l列出prefork.c,則需要對(duì)下面的段進(jìn)行配置:
<IfModule prefork.c>
StartServers 5 #啟動(dòng)apache時(shí)啟動(dòng)的httpd進(jìn)程個(gè)數(shù)。
MinSpareServers 5 #服務(wù)器保持的最小空閑進(jìn)程數(shù)。
MaxSpareServers 10 #服務(wù)器保持的最大空閑進(jìn)程數(shù)。
MaxClients 150 #最大并發(fā)連接數(shù)。
MaxRequestsPerChild 1000 #每個(gè)子進(jìn)程被請(qǐng)求服務(wù)多少次后被kill掉。0表示不限制,推薦設(shè)置為1000。
</IfModule>
在該工作模式下,服務(wù)器啟動(dòng)后起動(dòng)5個(gè)httpd進(jìn)程(加父進(jìn)程共6個(gè),通過(guò)ps -ax|grep httpd命令可以看到)。當(dāng)有用戶連接時(shí),apache會(huì)使用一個(gè)空閑進(jìn)程為該連接服務(wù),同時(shí)父進(jìn)程會(huì)fork一個(gè)子進(jìn)程。直到內(nèi)存中的空閑進(jìn)程達(dá)到MaxSpareServers。該模式是為了兼容一些舊版本的程序。我缺省編譯時(shí)的選項(xiàng)。
worker:如果httpd -l列出worker.c,則需要對(duì)下面的段進(jìn)行配置:
<IfModule worker.c>
StartServers 2 #啟動(dòng)apache時(shí)啟動(dòng)的httpd進(jìn)程個(gè)數(shù)。
MaxClients 150 #最大并發(fā)連接數(shù)。
MinSpareThreads 25 #服務(wù)器保持的最小空閑線程數(shù)。
MaxSpareThreads 75 #服務(wù)器保持的最大空閑線程數(shù)。
ThreadsPerChild 25 #每個(gè)子進(jìn)程的產(chǎn)生的線程數(shù)。
MaxRequestsPerChild 0 #每個(gè)子進(jìn)程被請(qǐng)求服務(wù)多少次后被kill掉。0表示不限制,推薦設(shè)置為1000。
</IfModule>
該模式是由線程來(lái)監(jiān)聽客戶的連接。當(dāng)有新客戶連接時(shí),由其中的一個(gè)空閑線程接受連接。服務(wù)器在啟動(dòng)時(shí)啟動(dòng)兩個(gè)進(jìn)程,每個(gè)進(jìn)程產(chǎn)生的線程數(shù)是固定的(ThreadsPerChild決定),因此啟動(dòng)時(shí)有50個(gè)線程。當(dāng)50個(gè)線程不夠用時(shí),服務(wù)器自動(dòng)fork一個(gè)進(jìn)程,再產(chǎn)生25個(gè)線程。
perchild:如果httpd -l列出perchild.c,則需要對(duì)下面的段進(jìn)行配置:
<IfModule perchild.c>
NumServers 5 #服務(wù)器啟動(dòng)時(shí)啟動(dòng)的子進(jìn)程數(shù)
StartThreads 5 #每個(gè)子進(jìn)程啟動(dòng)時(shí)啟動(dòng)的線程數(shù)
MinSpareThreads 5 #內(nèi)存中的最小空閑線程數(shù)
MaxSpareThreads 10 #最大空閑線程數(shù)
MaxThreadsPerChild 2000 #每個(gè)線程最多被請(qǐng)求多少次后退出。0不受限制。
MaxRequestsPerChild 10000 #每個(gè)子進(jìn)程服務(wù)多少次后被重新fork。0表示不受限制。
</IfModule>
該模式下,子進(jìn)程的數(shù)量是固定的,線程數(shù)不受限制。當(dāng)客戶端連接到服務(wù)器時(shí),又空閑的線程提供服務(wù)。 如果空閑線程數(shù)不夠,子進(jìn)程自動(dòng)產(chǎn)生線程來(lái)為新的連接服務(wù)。該模式用于多站點(diǎn)服務(wù)器。
(3) HTTP返頭回信息配置:
ServerTokens Prod #該參數(shù)設(shè)置http頭部返回的apache版本信息,可用的值和含義如下:
Prod:僅軟件名稱,例如:apache
Major:包括主版本號(hào),例如:apache/2
Minor:包括次版本號(hào),例如:apache/2.0
Min:僅apache的完整版本號(hào),例如:apache/2.0.54
OS:包括操作系統(tǒng)類型,例如:apache/2.0.54(Unix)
Full:包括apache支持的模塊及模塊版本號(hào),例如:Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7g
ServerSignature Off #在頁(yè)面產(chǎn)生錯(cuò)誤時(shí)是否出現(xiàn)服務(wù)器版本信息。推薦設(shè)置為Off
(4) 持久性連接設(shè)置
KeepAlive On #開啟持久性連接功能。即當(dāng)客戶端連接到服務(wù)器,下載完數(shù)據(jù)后仍然保持連接狀態(tài)。
MaxKeepAliveRequests 100 #一個(gè)連接服務(wù)的最多請(qǐng)求次數(shù)。
KeepAliveTimeout 30 #持續(xù)連接多長(zhǎng)時(shí)間,該連接沒有再請(qǐng)求數(shù)據(jù),則斷開該連接。缺省為15秒。
別名設(shè)置
對(duì)于不在DocumentRoot指定的目錄內(nèi)的頁(yè)面,既可以使用符號(hào)連接,也可以使用別名。別名的設(shè)置如下:
Alias /download/ "/var/www/download/" #訪問(wèn)時(shí)可以輸入:http://www.custing.com/download/
<Directory "/var/www/download"> #對(duì)該目錄進(jìn)行訪問(wèn)控制設(shè)置
Options Indexes MultiViews
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>
CGI設(shè)置
ScriptAlias /cgi-bin/ "/mnt/software/apache2/cgi-bin/" # 訪問(wèn)時(shí)可以:http://www.clusting.com/cgi-bin/ 。但是該目錄下的CGI腳本文件要加可執(zhí)行權(quán)限!
<Directory "/usr/local/apache2/cgi-bin"> #設(shè)置目錄屬性
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
個(gè)人主頁(yè)的設(shè)置 (public_html)
UserDir public_html (間用戶的主頁(yè)存儲(chǔ)在用戶主目錄下的public_html目錄下 URL http://www.clusting.com/~bearzhang/file.html 將讀取 /home/bearzhang/public_html/file.html 文件)
chmod 755 /home/bearzhang #使其它用戶能夠讀取該文件。
UserDir /var/html (the URL http://www.clusting.com/~bearzhang/file.html 將讀取 /var/html/bearzhang/file.html)
UserDir /var/www/*/docs (the URL http://www.clusting.com/~bearzhang/file.html 將讀取 /var/www/bearzhang/docs/file.html)
日志的設(shè)置
(1)錯(cuò)誤日志的設(shè)置
ErrorLog logs/error_log #日志的保存位置
LogLevel warn #日志的級(jí)別
顯示的格式日下:
[Mon Oct 10 15:54:29 2005] [error] [client 192.168.10.22] access to /download/ failed, reason: user admin not allowed access
(2)訪問(wèn)日志設(shè)置
日志的缺省格式有如下幾種:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common #common為日志格式名稱
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log common
格式中的各個(gè)參數(shù)如下:
%h --客戶端的ip地址或主機(jī)名
%l --The 這是由客戶端 identd 判斷的RFC 1413身份,輸出中的符號(hào) "-" 表示此處信息無(wú)效。
%u --由HTTP認(rèn)證系統(tǒng)得到的訪問(wèn)該網(wǎng)頁(yè)的客戶名。有認(rèn)證時(shí)才有效,輸出中的符號(hào) "-" 表示此處信息無(wú)效。
%t --服務(wù)器完成對(duì)請(qǐng)求的處理時(shí)的時(shí)間。
"%r" --引號(hào)中是客戶發(fā)出的包含了許多有用信息的請(qǐng)求內(nèi)容。
%>s --這個(gè)是服務(wù)器返回給客戶端的狀態(tài)碼。
%b --最后這項(xiàng)是返回給客戶端的不包括響應(yīng)頭的字節(jié)數(shù)。
"%{Referer}i" --此項(xiàng)指明了該請(qǐng)求是從被哪個(gè)網(wǎng)頁(yè)提交過(guò)來(lái)的。
"%{User-Agent}i" --此項(xiàng)是客戶瀏覽器提供的瀏覽器識(shí)別信息。
下面是一段訪問(wèn)日志的實(shí)例:
192.168.10.22 - bearzhang [10/Oct/2005:16:53:06 +0800] "GET /download/ HTTP/1.1" 200 1228
192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] "GET /icons/blank.gif HTTP/1.1" 304 -
192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] "GET /icons/back.gif HTTP/1.1" 304 -
各參數(shù)的詳細(xì)解釋,請(qǐng)參閱:http://www.clusting.com/Apache/ApacheManual/logs.html
用戶認(rèn)證的配置
(1)in the httpd.conf:
AccessFileName .htaccess
.........
Alias /download/ "/var/www/download/"
<Directory "/var/www/download">
Options Indexes
AllowOverride AuthConfig
</Directory>
(2) create a password file:
/usr/local/apache2/bin/htpasswd -c /var/httpuser/passwords bearzhang
(3)onfigure the server to request a password and tell the server which users are allowed access.
vi /var/www/download/.htaccess:
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /var/httpuser/passwords
Require user bearzhang
#Require valid-user #all valid user
虛擬主機(jī)的配置
(1)基于IP地址的虛擬主機(jī)配置
Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot /www/example1
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot /www/example2
ServerName www.example2.org
</VirtualHost>
(2) 基于IP和多端口的虛擬主機(jī)配置
Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080
<VirtualHost 172.20.30.40:80>
DocumentRoot /www/example1-80
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
DocumentRoot /www/example1-8080
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.50:80>
DocumentRoot /www/example2-80
ServerName www.example1.org
</VirtualHost>
<VirtualHost 172.20.30.50:8080>
DocumentRoot /www/example2-8080
ServerName www.example2.org
</VirtualHost>
(3)單個(gè)IP地址的服務(wù)器上基于域名的虛擬主機(jī)配置:
# Ensure that Apache listens on port 80
Listen 80
# Listen for virtual host requests on all IP addresses
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example1.com
ServerAlias example1.com. *.example1.com
# Other directives here
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example2.org
# Other directives here
</VirtualHost>
(4)在多個(gè)IP地址的服務(wù)器上配置基于域名的虛擬主機(jī):
Listen 80
# This is the "main" server running on 172.20.30.40
ServerName server.domain.com
DocumentRoot /www/mainserver
# This is the other address
NameVirtualHost 172.20.30.50
<VirtualHost 172.20.30.50>
DocumentRoot /www/example1
ServerName www.example1.com
# Other directives here ...
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot /www/example2
ServerName www.example2.org
# Other directives here ...
</VirtualHost>
(5)在不同的端口上運(yùn)行不同的站點(diǎn)(基于多端口的服務(wù)器上配置基于域名的虛擬主機(jī)):
Listen 80
Listen 8080
NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080
<VirtualHost 172.20.30.40:80>
ServerName www.example1.com
DocumentRoot /www/domain-80
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example1.com
DocumentRoot /www/domain-8080
</VirtualHost>
<VirtualHost 172.20.30.40:80>
ServerName www.example2.org
DocumentRoot /www/otherdomain-80
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example2.org
DocumentRoot /www/otherdomain-8080
</VirtualHost>
(6)基于域名和基于IP的混合虛擬主機(jī)的配置:
Listen 80
NameVirtualHost 172.20.30.40
<VirtualHost 172.20.30.40>
DocumentRoot /www/example1
ServerName www.example1.com
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot /www/example2
ServerName www.example2.org
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot /www/example3
ServerName www.example3.net
</VirtualHost>
SSL加密的配置
首先在配置之前先來(lái)了解一些基本概念:
證書的概念:首先要有一個(gè)根證書,然后用根證書來(lái)簽發(fā)服務(wù)器證書和客戶證書,一般理解:服務(wù)器證書和客戶證書是平級(jí)關(guān)系。SSL必須安裝服務(wù)器證書來(lái)認(rèn)證。 因此:在此環(huán)境中,至少必須有三個(gè)證書:根證書,服務(wù)器證書,客戶端證書。 在生成證書之前,一般會(huì)有一個(gè)私鑰,同時(shí)用私鑰生成證書請(qǐng)求,再利用證書服務(wù)器的根證來(lái)簽發(fā)證書。
SSL所使用的證書可以自己生成,也可以通過(guò)一個(gè)商業(yè)性CA(如Verisign 或 Thawte)簽署證書。
簽發(fā)證書的問(wèn)題:如果使用的是商業(yè)證書,具體的簽署方法請(qǐng)查看相關(guān)銷售商的說(shuō)明;如果是知己簽發(fā)的證書,可以使用openssl自帶的CA.sh腳本工具。
如果不為單獨(dú)的客戶端簽發(fā)證書,客戶端證書可以不用生成,客戶端與服務(wù)器端使用相同的證書。
(1) conf/ssl.conf 配置文件中的主要參數(shù)配置如下:
Listen 443
SSLPassPhraseDialog buildin
#SSLPassPhraseDialog exec:/path/to/program
SSLSessionCache dbm:/usr/local/apache2/logs/ssl_scache
SSLSessionCacheTimeout 300
SSLMutex file:/usr/local/apache2/logs/ssl_mutex
<VirtualHost _default_:443>
# General setup for the virtual host
DocumentRoot "/usr/local/apache2/htdocs"
ServerName www.example.com:443
ServerAdmin you@example.com
ErrorLog /usr/local/apache2/logs/error_log
TransferLog /usr/local/apache2/logs/access_log
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
CustomLog /usr/local/apache2/logs/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x "%r" %b"
</VirtualHost>
(2) 創(chuàng)建和使用自簽署的證書:
a.Create a RSA private key for your Apache server
/usr/local/openssl/bin/openssl genrsa -des3 -out /usr/local/apache2/conf/ssl.key/server.key 1024
b. Create a Certificate Signing Request (CSR)
/usr/local/openssl/bin/openssl req -new -key /usr/local/apache2/conf/ssl.key/server.key -out /usr/local/apache2/conf/ssl.key/server.csr
c. Create a self-signed CA Certificate (X509 structure) with the RSA key of the CA
/usr/local/openssl/bin/openssl req -x509 -days 365 -key /usr/local/apache2/conf/ssl.key/server.key -in /usr/local/apache2/conf/ssl.key/server.csr -out /usr/local/apache2/conf/ssl.crt/server.crt
/usr/local/openssl/bin/openssl genrsa 1024 -out server.key
/usr/local/openssl/bin/openssl req -new -key server.key -out server.csr
/usr/local/openssl/bin/openssl req -x509 -days 365 -key server.key -in server.csr -out server.crt
(3) 創(chuàng)建自己的CA(認(rèn)證證書),并使用該CA來(lái)簽署服務(wù)器的證書。
mkdir /CA
cd /CA
cp openssl-0.9.7g/apps/CA.sh /CA
./CA.sh -newca
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.csr newreq.pem
./CA.sh -sign
cp newcert.pem /usr/local/apache2/conf/ssl.crt/server.crt
cp server.key /usr/local/apache2/conf/ssl.key/
gzip配置:
LoadModule deflate_module modules/mod_deflate.so
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-javascript
訪問(wèn)控制:
Order deny,allow
Deny from all
Allow from 192.168.0.0/8
流量控制:
<Location /a>
Bandwidth all 51200
MaxConnection all 30
BandWidthError 510
</Location>
設(shè)置proxy,將請(qǐng)求轉(zhuǎn)發(fā):
ProxyRequests Off
ProxyPass /a/ http://bwl.com/a/
ProxyPassReverse /a/ http://bwl.com/a/
VirtualHost配置實(shí)例:
<VirtualHost *>
ServerName a.bwl.com
ServerAlias b.bwl.com
DocumentRoot "/search/a"
DirectoryIndex abc.html
</VirtualHost>
相關(guān)文章
php自動(dòng)識(shí)別文件編碼并轉(zhuǎn)換為UTF-8的方法
PHP轉(zhuǎn)換文件編碼是一個(gè)比較簡(jiǎn)單的事情,但是難的是傳遞中文參數(shù)的時(shí)候,有時(shí)候不知道是什么編碼,結(jié)果造成了亂碼的現(xiàn)象。這篇文章主要介紹了php自動(dòng)識(shí)別編碼并轉(zhuǎn)換為UTF-8的方法,需要的朋友可以參考下2014-06-06一個(gè)簡(jiǎn)潔的PHP可逆加密函數(shù)(分享)
本篇文章是對(duì)一個(gè)簡(jiǎn)潔的PHP可逆加密函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Linux系統(tǒng)下使用XHProf和XHGui分析PHP運(yùn)行性能
這篇文章主要介紹了Linux系統(tǒng)下使用XHProf和XHGui分析PHP運(yùn)行性能的方法,該方案支持Apache與Nginx服務(wù)器及多種數(shù)據(jù)庫(kù)環(huán)境,需要的朋友可以參考下2015-12-12thinkphp autoload 命名空間自定義 namespace
這篇文章主要介紹了thinkphp autoload 命名空間自定義 namespace的相關(guān)資料,需要的朋友可以參考下2015-07-07php實(shí)現(xiàn)跨域提交form表單的方法【2種方法】
這篇文章主要介紹了php實(shí)現(xiàn)跨域提交form表單的方法,結(jié)合實(shí)例形式分析了curl及ajax兩種方法進(jìn)行跨域提交的操作技巧,需要的朋友可以參考下2016-10-10Admin generator, filters and I18n
You need to modify your EntityFormFilter (where Entity is your object class - Article, Book, etc.).2011-10-10