apache-详细配置文件介绍+多种方式虚拟主机配置
grep -v "#" /etc/httpd/conf/httpd.conf
ServerTokens OS ? ?返回Server :Apache/2.0.41(unix)
servertokens 指令?
說明:配置HTTP服務器回應頭,此指令控制了server回送給客戶端的回應頭域是否包含關于服務器OS類型和編譯的模塊描述信息
語法:
servertokens ?major|minor|minimal|productonly|os|full
apache 啟動后有9個進程,一個主進程 8個子進程主進程以root身份運行 進程ID在httpd.pid里 ?子進程以Apache進程運行,子進程是主進程產生的,
Apache ?DSO
Apache是一個模塊化設計的服務,核心只包含主要功能,擴展能通過模塊實現,不同模塊可以被靜態編譯進程序,也可以動態加載
查看模塊 httpd -M
查看靜態編譯的程序的模塊 ?httpd -l
如果加新的功能就需要重新編譯,但是DSO不需要,可以通過Apache自帶的apxs
apache MPM(multi process modules)
mpm負責實現網絡監聽,請求處理等功能,mpm有很多種,目的是為了在不同平臺環境實現最優化的性能及穩性。
通過以下命令可以看出Apache所使用的MPM
httpd -l
httpd ?-V ? m默認是prefork
線程與進程的區別:
線程是指進程內的一個執行單元,也是進程內的可調度實體.
與進程的區別:
(1)地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;
(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
(3)線程是處理器調度的基本單位,但進程不是.
4)二者均可并發執行.
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的并發性。
進程和線程的區別在于:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.?
線程的劃分尺度小于進程,使得多線程程序的并發性高。?
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。?
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
?從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.?
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點
在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.?
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行.
prefork 與worker
prefork: prefork是非線程的,預生成進程型的MPM,使用多子進程,每個子進程只有一個線程,每個進程在某個時間只能維持一個連接,效率高,但內存占用量較大。。它適合于沒有線程安全庫,需要避免線程兼容性問題的系統
worker:是線程化多進程的MPM,每個子進程可以生成多個線程,每個線程處理一個請求。內存占用率小,適用于流量搞得http服務器。缺點,假如一個線程崩潰,整個進程連同其他任何其中線程一起死掉
Apache 中prefork的最大進程數是 在prefork的配置中
?
Apache三個配置
1 global 1 environment
2 main configuration
3 virtual host
first one class ?1 ?
全局配置影響整個Apache
ServerTokens OS ? ?返回Server的信息 :Apache/2.0.41(unix)
ServerRoot ? ? ? ? "/etc/httpd" ? 服務的主目錄 ? 不能更改,也即是安裝目錄
pidfile ?run/httpd.pid ? ?主進程id的號
timeout ? 連接時間。
keepalived ?off 是否開啟TCP連接請求(是否開啟持久連接功能,即客戶端練到服務器下載數據完成后任然保持連接狀態) ? 開啟效率較好,默認關閉
MaxKeepAliveRequests 100 ? ? ? ? ?一個連接服務的最多請求次數 ? ? ? ?
KeepAliveTimeout 15 ? 一個TCP連接兩次請求時間的間,即連續連接多長時間
LISTEN 80 ?監聽端口號,以及在那個ip上監聽80端口
DSO
include ? conf.d/*.conf ?模塊加載路徑
user
group ?Apache ?指定Apache是以什么身份運行子進程
second ? class ?2?
Apache缺省服務目錄主配置
serveradmin ?管理員郵件地址
servername 服務器域名,也就是網站的域名
UseCanonicalName Off ? 是否嚴格使用合格域名 ? 如果使用虛擬主機,一定要關閉
DocumentRoot "/var/www/html" ?根目錄 ?主站點目錄
<Directory ?/var/www/html> ? 主站點目錄訪問控制 ?,缺省配置
? ? Options FollowSymLinks
? ? AllowOverride None
? ? Order?allow,deny
? ? ?Allow?from?all
</Directory>
Options:配置在特定目錄使用哪些特性,常用的值和基本含義如下:
ExecCGI:?在該目錄下允許執行CGI腳本。
FollowSymLinks:?在該目錄下允許文件系統使用符號連接。
Indexes:?當用戶訪問該目錄時,如果用戶找不到DirectoryIndex指定的主頁文件(例如index.html),則返回該目錄下的文件列表給用戶。 一般不建議使用?
SymLinksIfOwnerMatch: 當使用符號連接時,只有當符號連接的文件擁有者與實際文件的擁有者相同時才可以訪問。
AllowOverride ?None:允許存在于.htaccess文件中的指令類型(.htaccess文件名是可以改變的,其文件名由AccessFileName指令決定)
None:?當AllowOverride被設置為None時。不搜索該目錄下的.htaccess文件(可以減小服務器開銷)
Allow:允許訪問的主機列表(可用域名或子網,例如:Allow?from?192.168.0.0/16)
Deny:拒絕訪問的主機列表
Apache的MPM優化
# prefork MPM
?
<IfModule prefork.c>
StartServers ? ? ? 8 ? ? 啟動Apache時候啟動的httpd進程個數
MinSpareServers ? ?5 ? ? 最小空閑的進程數
MaxSpareServers ? 20 ? ? 最大空閑的進程數
ServerLimit ? ? ?256 ? ??
MaxClients ? ? ? 256 ? ?最大允許連接數,即最大并發數,最大限值由serverlimit 控制
MaxRequestsPerChild ?4000 子進程最大請求數,0表示不限制,推薦位1000
</IfModule>
#worker MPM
?
<IfModule worker.c>
StartServers ? ? ? ? 4 ? 啟動Apache時候啟動的httpd的個數
MaxClients ? ? ? ? 300 ? 最大并發連接數
MinSpareThreads ? ? 25 ? 最小空閑線程數
MaxSpareThreads ? ? 75 ? 最大空閑線程數
ThreadsPerChild ? ? 25 ? 每個子進程產生的線程數
MaxRequestsPerChild ?0 ? 每個子進程被請求的最大次數
</IfModule>
別名設置
對于不在DocumentRoot指定的目錄內的頁面,既可以使用符號連接,也可以使用別名。?
Alias /error/ "/var/www/error/" ? ?訪問時候可以輸入 ?、HTTP://www.node.com/error
<IfModule mod_negotiation.c>
<IfModule mod_include.c>
? ? <Directory "/var/www/error">
? ? ? ? AllowOverride None
? ? ? ? Options IncludesNoExec?
? ? ? ? AddOutputFilter Includes html
? ? ? ? AddHandler type-map var
? ? ? ? Order allow,deny
? ? ? ? Allow from all
? ? ? ? LanguagePriority en es de fr
? ? ? ? ForceLanguagePriority Prefer Fallback
? ? </Directory>
對Apache服務器的根訪問不生成目錄列表,同時指定錯誤頁面
<locationmatch "^/$>
options-indexes
errordocument 403 /error/noindex.html
<locationmatch>
當訪問服務器時候依次訪問頁面 index.html ?index.html.var
directoryindex ? index.html ?index.html.var
DirectoryIndex index.html index.html.var ?不指定任何首頁時候,默認讀取的首頁
指定保護目錄配置文件的名稱
AccessFileName .htaccess ? ? ? ? ? ? ? ? ? 分布式訪問控制文件?
//指定負責處理MIME 對應格式的配置文件的存放位置?
TypesConfig /etc/mime.types?
//指定默認的MIME 文件類型為純文本或HTML 文件?
DefaultType text/plain?
//只記錄連接Apache 服務器的IP 地址,而不記錄主機名
?HostnameLookups Off?
訪問日志設置
ErrorLog logs/error_log ? ? 錯誤日志的位置
?
#LogLevel: ? debug, info, notice, warn, error, crit,
?
LogLevel warn
自定義訪問日志
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?
# "combinedio" includes actual counts of actual bytes received (%I) and sent (%O); this
# requires the mod_logio module to be loaded.
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combined:io
CustomLog logs/access_log common
格式中各個參數如下
%h -客戶端的IP地址或主機名
%l –The 這是由客戶端 identd 判斷的RFC 1413身份,輸出中的符號 "-" 表示此處信息無效。
%u –由HTTP認證系統得到的訪問該網頁的客戶名。有認證時才有效,輸出中的符號 "-" 表示此處信息無效。
%t –服務器完成對請求的處理時的時間。
"%r" –引號中是客戶發出的包含了許多有用信息的請求內容。
%>s –這個是服務器返回給客戶端的狀態碼。
%b –最后這項是返回給客戶端的不包括響應頭的字節數。
"%{Referer}i" –此項指明了該請求是從被哪個網頁提交過來的
"%{User-Agent}i" –此項是客戶瀏覽器提供的瀏覽器識別信息。
用戶認證的配置
<IfModule mod_userdir.c> ? 條件化模塊判斷
如果有這個模塊,默認將使用這個功能
UserDir disabled
#UserDir public_html
</IfModule>
<Files ~ "^\.ht"> ? ? ? ? ? ?文件訪問控制
? ? Order allow,deny
? ? Deny from all
? ? Satisfy All
</Files>
ServerSignature on ? 表示在錯誤頁面中不顯示Apache的版本
servertokens prod ? ? 在錯誤頁面中不顯示操作系統的名稱
+==========================================================================================
虛擬主機
===========================================================================================
虛擬主機(VirtualHost).通常分為這樣3種:
基于域名,基于端口,基于IP,以及它們的混合
下面是每種虛擬主機的配置過程
1.基于域名
這是一種最通用的情況,已經給服務器設置了多個域名,然后希望訪問不同的域名來訪問不同的網站文件.
修改httpd.conf的配置
?Use name-based virtual hosting.
#
NameVirtualHost * ?表示在apache監聽的所有IP和所有端口(此時只有80)上做多域名虛擬主機
<VirtualHost *>
? ? ServerAdmin xxx@xxx.com
? ? DocumentRoot /var/www/html/s1
? ? ServerName s1.domain1.com
? ? ErrorLog logs/ error_log
? ? TransferLog logs/ access_log
</VirtualHost>
?
<VirtualHost *>
? ? ServerAdmin xxx@ixxx.com
? ? DocumentRoot /var/www/html/s2
? ? ServerName ?s2.domain1.com
? ? ErrorLog logs/error_log
? ? TransferLog logs/access_log
</VirtualHost>
2.基于端口
通過訪問同一個IP(或者域名)的不同端口來訪問到不同的文件
對httpd.conf做如下修改
增加監聽口
Listen 80
Listen 81
將之前做的多域名虛擬主機去掉(因為此時是用IP加端口來訪問的),即
# Use name-based virtual hosting.
#
# NameVirtualHost * ? ?注釋掉這句話
以下是虛擬主機配置(注意下面的配置部分我并沒用ServerName字段)
<VirtualHost *:80>
? ? ServerAdmin xxx@xxx.com
? ? DocumentRoot /var/www/html/s1
? ? ErrorLog logs/error_log
? ? TransferLog logs/ access_log
</VirtualHost>
?
<VirtualHost *:81>
? ? ServerAdmin xxx@xxx.com
? ? DocumentRoot /var/www/html/s2
? ? ErrorLog logs/ error_log
? ? TransferLog logs/ access_log
</VirtualHost>
?
混合實驗
看到這里我們就可以做一個稍微復雜的實驗,在不同的端口上做不同域名的訪問.例如
在80上訪問s1.domain1.com和s2.domain1.com
在81上訪問s3.domain2.com和s4.domain2.com當然這樣訪問是要帶端口號的,上面因為是80默認端口所以不需要寫端口號
訪問這四個域名+端口分別訪問到不同的頁面.
配置過程
首先在bind上增加兩個域名指向服務器. s3.domain2.com,s4.domain2.com,增加之后記得要重啟bind.
然后修改httpd.conf文件
增加監聽口
Listen 80
Listen 81
虛擬主機設置
# Use name-based virtual hosting.
#
NameVirtualHost *:80
NameVirtualHost *:81
表示要在本機的所有IP的80和81上面做多域名(NameVirtualHost:即為名稱虛擬主機的意思)
<VirtualHost *:80>
? ? ServerAdmin xxx@xxx.com
? ? DocumentRoot /var/www/html/s1
? ? ServerName s1.domain1.com
? ? ErrorLog logs/ error_log
? ? TransferLog logs/ access_log
</VirtualHost>
?
<VirtualHost *:80>
? ? ServerAdmin xxx@xxx.com
? ? DocumentRoot /var/www/html/s2
? ? ServerName ?s2.domain1.com
? ? ErrorLog logs/ error_log
? ? TransferLog logs/access_log
</VirtualHost>
?
?
<VirtualHost *:81>
? ? ServerAdmin xxx@xxx.com
? ? DocumentRoot /var/www/html/s3
? ? ServerName ?s3.domain2.com
? ? ErrorLog logs/error_log
? ? TransferLog logs/access_log
</VirtualHost>
?
<VirtualHost *:81>
? ? ServerAdmin xxx@xxx.com
? ? DocumentRoot /var/www/html/s4
? ? ServerName ?s4.domain2.com
? ? ErrorLog logs/error_log
? ? TransferLog logs/access_log
</VirtualHost>
?
檢查虛擬主機設置
?
3.基于IP的虛擬主機
將不同的網站掛在不同的IP上,訪問不同的IP,所看到的是不同網站.因為一般服務器沒那么多公網IP,而且大家一般都是用域名訪問的.所以這
個基本沒用.但是可以用來測試和學習.
適用環境:server上沒有配置域名,只能用IP訪問.
為了實驗效果,我們先來停掉DNS服務.
首先為服務器增加一個IP,192.168.0.112
[root@server1 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
[root@server1 network-scripts]# vi ifcfg-eth0:0
DEVICE=eth0:0 ? ? //設備名稱
ONBOOT=yes ? ? ? //隨系統啟動
BOOTPROTO=static
IPADDR=192.168.0.112 //新設的IP
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
激活這個設備
[root@server1 network-scripts]# ifdown eth0;ifup eth0
查看當前ip設置
[root@server1 network-scripts]# ifconfig
eth0 ? ? ?Link encap:Ethernet ?HWaddr 00:0A:EB:XX:XX:XX?
? ? ? ? ? inet addr:192.168.0.111 ?Bcast:192.168.0.255 ?Mask:255.255.255.0
? ? ? ? ?
eth0:0 ? ?Link encap:Ethernet ?HWaddr 00:0A:EB:XX:XX:XX?
? ? ? ? ? inet addr:192.168.0.112 ?Bcast:192.168.0.255 ?Mask:255.255.255.0
? ? ? ? ?
ping這個112確實啟用成功.
這樣增加IP的工作就完成了,下面對httpd.conf做修改
# Use name-based virtual hosting.
#
#NameVirtualHost * ? 去掉基于多域名的主機
?
<VirtualHost 192.168.0.111>
? ? ServerAdmin xxx@xxx.com
? ? DocumentRoot /var/www/html/s1
# ? ?ServerName s1.domain1.com
? ? ErrorLog logs/ error_log
? ? TransferLog logs/ access_log
</VirtualHost>
?
<VirtualHost 192.168.0.112>
? ? ServerAdmin xxx@xxx.com
? ? DocumentRoot /var/www/html/s2
# ? ?ServerName ?ss2.domain1.com
? ? ErrorLog logs/ error_log
? ? TransferLog logs/ access_log
</VirtualHost>
?
注意上面紅色的部分,由于此時沒用多域名所以我將ServerName字段去掉了(在多端口的時候這樣做是可以的).但是出現了下面的錯誤,可以看
到它是把IP作為域名給解析了.
"httpd.conf" 1157L, 38072C written ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
[root@server1 conf]# ../bin/httpd -S
[Mon Jul 30 14:09:06 2007] [error] (EAI 2)Name or service not known: Failed to resolve server name for 192.168.0.112 (check?
DNS) -- or specify an explicit ServerName
[Mon Jul 30 14:09:06 2007] [error] (EAI 2)Name or service not known: Failed to resolve server name for 192.168.0.111 (check?
DNS) -- or specify an explicit ServerName
VirtualHost configuration:
192.168.0.111:* ? ? ? ?bogus_host_without_reverse_dns (/usr/local/apache2/conf/httpd.conf:1065)
192.168.0.112:* ? ? ? ?bogus_host_without_reverse_dns (/usr/local/apache2/conf/httpd.conf:1074)
Syntax OK
?
下面我們將ServerName字段加上去,后面的名稱我們隨意寫
<VirtualHost 192.168.0.111>
? ? ServerAdmin hong.yao@infonaligy.com
? ? DocumentRoot /var/www/html/s1
? ? ServerName s1
? ? ErrorLog logs/dbpi_web-error_log
? ? TransferLog logs/dbpi_web-access_log
</VirtualHost>
?
<VirtualHost 192.168.0.112>
? ? ServerAdmin hong.yao@infonaligy.com
? ? DocumentRoot /var/www/html/s2
? ? ServerName s2
? ? ErrorLog logs/dbpi_web-error_log
? ? TransferLog logs/dbpi_web-access_log
</VirtualHost>
?
然后再來檢查虛擬主機配置
[root@server1 conf]# ../bin/httpd -S
VirtualHost configuration:
192.168.0.111:* ? ? ? ?s1 (/usr/local/apache2/conf/httpd.conf:1065)
192.168.0.112:* ? ? ? ?s2 (/usr/local/apache2/conf/httpd.conf:1075)
Syntax OK
在客戶機上測試訪問192.168.0.111和192.168.0.112成功.
?
個人覺得這應該是一處bug,因為在這種情況下并不需要域名訪問,采用的是完全以實際IP進行訪問.相應的ServerName這個字段應該是沒有意義
的(正如多端口時我們這樣做,完全沒問題).事實也表明了我們任意起名字也是可以通過的.
?
?
最后說一個Apache常常會碰到的問題
啟動apache時會有警告
httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
還是能夠正常的啟動和訪問,只是有這個問題.
解決:
#ServerName [url]www.example.com:80[/url] 將這句話修改如下
ServerName 192.168.0.111 當然根據你的實際情況修改為本機的IP或者域名
轉載于:https://blog.51cto.com/douya/1546599
總結
以上是生活随笔為你收集整理的apache-详细配置文件介绍+多种方式虚拟主机配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么设置环境变量
- 下一篇: Mac 可设置环境变量的位置、查看和添加