文章目錄
二、Apache web服務
2.1 Apache介紹
Apache Software Fondation基金
httpd是apache的web服務器端軟件
2.2 相比nginx優缺點
2.2.1 缺點
資源佔用高
併發性能差
2.2.2 優點
rewrite,比nginx 的rewrite 強大
模塊多
少bug
穩定
處理動態請求能力優於nginx
2.3 MPM(多處理模塊)
可以通過httpd -V查看
[root@localhost ~]# httpd -V | grep -i "server mpm"
Server MPM: Prefork
prefork(默認) 單進程模型
worker 單線程響應單用戶請求
event 單進程響應多用戶請求
2.3.1 prefork工作模式
(一個進程處理一個客戶端請求)
Apache在啓動之初,就預先fork一些子進程,然後等待請求進來。之所以這樣做,是爲了減少頻繁創建和銷燬進程的開銷。每個子進程只有一個線程,在一個時間點內,只能處理一個請求。
作用:用一個進程處理一個用戶請求。
優點:成熟穩定,兼容所有新老模塊。同時,不需要擔心線程安全的問題。
缺點:一個進程相對佔用更多的系統資源,消耗更多的內存。而且,它並不擅長處理高併發請求。
2.3.2 worker工作模式
(一個進程生成多個線程,一個線程處理一個客戶端請求)
使用了多進程和多線程的混合模式。它也預先fork了幾個子進程(數量比較少),然後每個子進程創建一些線程,同時包括一個監聽線程。每個請求過來,會被分配到1個線程來服務。線程比起進程會更輕量,因爲線程通常會共享父進程的內存空間,因此,內存的佔用會減少一些。在高併發的場景下,因爲比起prefork有更多的可用線程,表現會更優秀一些
作用:一個進程生成多個線程,一個線程處理一個用戶請求
優點:佔據更少的內存,高併發下表現更優秀。
缺點:必須考慮線程安全的問題。
2.3.3 event工作模式
(支持keepalive,數據傳送完畢自動斷開,但是不支持https)
用一個線程處理一個用戶請求。它和worker模式很像,最大的區別在於,它解決了keep-alive場景下,長期被佔用的線程的資源浪費問題。event MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,
將請求傳遞給服務線程,執行完畢後,又允許它釋放。這樣增強了高併發場景下的請求處理能力。
HTTP採用keepalive方式減少TCP連接數量,但是由於需要與服務器線程或進程進行綁定,導致一個繁忙的服務器會消耗完所有的線程。Event MPM是解決這個問題的一種新模型,它把服務進程從連接中分離出來。在服務器處理速度很快,同時具有非常高的點擊率時,可用的線程數量就是關鍵的資源限 制,此時Event MPM方式是最有效的,但不能在HTTPS訪問下工作。
Apache針對不同的操作系統提供了多個不同的MPM模塊,例如:mpm_beos、mpm_event、mpm_netware、mpmt_os2、mpm_prefork、mpm_winnt、mpm_worker。
不同操作系統上默認的MPM模塊 | ||
---|---|---|
操作系統 | MPM模塊 | 描述 |
Windows | mpm_winnt | 它只創建一個單獨的子進程,並在這個子進程中輪流產生多個線程來處理請求。 |
Unix/Linux | mpm_prefork | (一個進程處理一個客戶端請求) |
BeOS | mpm_beos | 由Be公司開發的一種多媒體操作系統,官方版已停止更新。 |
Netware | mpm_netware | 由NOVELL公司推出的一種網絡操作系統 |
OS/2 | mpmt_os2 | 一種最初由微軟和IBM共同開發的操作系統,現由IBM單獨開發(微軟放棄OS/2,轉而開發Windows) |
2.4 相關文件(2.4)
主配置文件: /etc/httpd/conf/httpd.conf 編譯安裝目錄/conf/httpd.conf
其他配置文件:
/etc/httpd/conf.d/*.conf
/etc/httpd/conf.modules.d/*.conf
網頁數據文件: /var/www/html 編譯安裝目錄/html/
2.5 監聽端口
http: tcp 80
https: tcp 443
2.6 主配置文件(httpd2.2)
httpd.apache.org
Section 1: Global Environment
-
ServerTokens OS
-
ServerRoot “/etc/httpd” 服務端相關文件默認目錄
-
PidFile run/httpd.pid 進程運行時將pid寫入文件
-
Listen 80 監聽端口
-
KeepAlive Off 是否開啓持久連接
-
Include conf.d/*.conf 將conf.d目錄下所有.conf結尾文件包含進來(Include conf.modules.d/*.conf)
-
User apache 服務進程(/usr/sbin/httpd)執行者
-
Group apache 服務進程執行組
Section 2: ‘Main’ server configuration 配置主站點
- ServerAdmin root@localhost 網站管理員郵箱
- ServerName www.pl.com 站點名稱
- DocumentRoot “/var/www/html” 站點根目錄
- DirectoryIndex index.html index.html.var 目錄首頁
- ErrorLog logs/error_log 錯誤日誌
- CustomLog logs/access_log combined 用戶訪問日誌
- Alias /icons/ “/var/www/icons/” 別名,當訪問/icons目錄即訪問/var/www/icons(www.pl.com/icon/a.jpg、/var/www/icons/a.jpg)
- 爲指定目錄定義功能
<Directory />
Options FollowSymLinks
#FollowSymLinks 是否允許追蹤符號鏈接
#Indexes 索引,用於基於http協議的文件瀏覽
AllowOverride None
</Directory>
-
訪問控制
Order allow,deny (默認拒絕所有)
Allow from allOrder deny,allow (默認允許所有)
deny from 192.168.1.0/24
allow from all
Section 3: Virtual Hosts
- NameVirtualHost *:80 #開啓虛擬主機
- <VirtualHost *:80>
- DocumentRoot /var/www/html
- ServerName www.pl.com
- ErrorLog logs/www.pl.com-error_log
- CustomLog logs/www.pl.com-custom_log common
- </VirtualHost>
- <VirtualHost *:80>
- DocumentRoot /test
- ServerName www.test.com
- ErrorLog logs/www.test.com-error_log
- CustomLog logs/www.test.com-custom_log common
- <Directory /test/download>
- options indexes #將download目錄作爲文件共享目錄,並生成索引頁面
- </Directory>
web認證功能
<VirtualHost *:80>
<Directory /test/private>
AuthName "Input your username and password,please!"
AuthType Basic
AuthUserFile /etc/httpd/testpasswd
require valid-user
</Directory>
</VirtualHost>
生成用戶認證文件 htpasswd -cm /etc/httpd/testpasswd alice (第一次添加用戶需-c)
1.基於IP的虛擬主機
2.基於端口的虛擬主機
3.基於域名的虛擬主機
2.6.1 基於域名的虛擬主機
配置文件
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory />
AllowOverride none
Require all granted # 修改這個
</Directory>
[root@localhost ~]# vim /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
DocumentRoot "/data/pl"
ServerName www.pl.com
ErrorLog "logs/www.pl.com-error_log"
TransferLog "logs/host.pl.com-access_log"
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/haha"
ServerName www.haha.com
ErrorLog "logs/www.haha.com-error_log"
TransferLog "logs/host.haha.com-access_log"
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/hehe"
ServerName www.hehe.com
ErrorLog "logs/www.hehe.com-error_log"
TransferLog "logs/host.hehe.com-access_log"
</VirtualHost>
創建文件
[root@localhost ~]# mkdir /data
[root@localhost ~]# mkdir /data/{pl,haha,hehe}
[root@localhost ~]# echo "<h>pl</h>" > /data/pl/index.html
[root@localhost ~]# echo "<h>haha</h>" > /data/haha/index.html
[root@localhost ~]# echo "<h>hehe</h>" > /data/hehe/index.html
寫入域名解析
[root@localhost ~]# vim /etc/hosts
192.168.217.155 www.pl.com www.haha.com www.hehe.com
測試
2.6.2 虛擬主機做文件共享以及認證
-
www.pl.com 靜態頁面
-
www.haha.com 文件共享
-
www.hehe.com 認證
-
解析動態php請求
配置
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<Directory />
AllowOverride none
Require all granted # 修改這個
</Directory>
[root@localhost ~]# vim /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
DocumentRoot "/data/pl"
ServerName www.pl.com
ErrorLog "logs/www.pl.com-error_log"
TransferLog "logs/host.pl.com-access_log"
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/haha"
ServerName www.haha.com
ErrorLog "logs/www.haha.com-error_log"
TransferLog "logs/host.haha.com-access_log"
<Directory "/data/haha/share">
Options Indexes
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/hehe"
ServerName www.hehe.com
ErrorLog "logs/www.hehe.com-error_log"
TransferLog "logs/host.hehe.com-access_log"
<Directory "/data/hehe/secert">
AuthName "Input your username and password,please!"
AuthType Basic
AuthUserFile /etc/httpd/testpasswd
require valid-user
</Directory>
</VirtualHost>
文件共享
[root@localhost ~]# rm -rf /data/haha/index.html
[root@localhost ~]# mkdir /data/haha/share
[root@localhost ~]# cp -a /etc/*.conf /data/haha/share/
訪問
認證
[root@localhost ~]# htpasswd -cm /etc/httpd/testpasswd alice
New password:
Re-type new password:
Adding password for user alice
[root@localhost ~]# mkdir /data/hehe/secert
[root@localhost ~]# echo "this is secert" > /data/hehe/secert/index.html
訪問
可以看到
2.7 源碼編譯安裝httpd2.4
0.安裝相關編譯工具
[root@httpd ~]# yum install -y automake make autoconf gcc expat-devel gcc-c++
[root@httpd ~]# wget http://archive.apache.org/dist/apr/apr-1.5.1.tar.gz
[root@httpd ~]# wget http://archive.apache.org/dist/apr/apr-util-1.6.1.tar.gz
[root@httpd ~]# wget http://www.zlib.net/zlib-1.2.11.tar.gz
[root@httpd ~]# wget https://sourceforge.net/projects/pcre/files/pcre/8.38/pcre-8.38.tar.gz
[root@httpd ~]# wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2n.tar.gz
[root@httpd ~]# wget http://archive.apache.org/dist/httpd/httpd-2.4.29.tar.gz
1.下載源碼包
apr-1.5.1.tar.gz
[root@httpd ~]# tar -xzvf apr-1.5.1.tar.gz
[root@httpd ~]# cd apr-1.5.1
[root@httpd apr-1.5.1]# ./configure --prefix=/usr/local/apr
[root@httpd apr-1.5.1]# make && make install
yum -y install libtool libtool-ltdl libtool-ltdl-devel
apr-util-1.6.1.tar.gz
[root@httpd ~]# tar -xzvf apr-util-1.6.1.tar.gz
[root@httpd ~]# cd apr-util-1.6.1
[root@httpd apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@httpd apr-util-1.6.1]# make && make install
zlib-1.2.11.tar.gz
[root@httpd ~]# tar -xzvf zlib-1.2.11.tar.gz
[root@httpd ~]# cd zlib-1.2.11
[root@httpd zlib-1.2.11]# ./configure --prefix=/usr/local/apr
[root@httpd zlib-1.2.11]# make && make install
pcre-8.38.tar.gz
[root@httpd ~]# tar -xzvf pcre-8.38.tar.gz
[root@httpd ~]# cd pcre-8.38
[root@httpd pcre-8.38]# ./configure --prefix=/usr/local/pcre
[root@httpd pcre-8.38]# make && make install
openssl-1.0.2n.tar.gz
[root@httpd ~]# tar -xzvf openssl-1.0.2n.tar.gz
[root@httpd ~]# cd openssl-1.0.2n
[root@httpd openssl-1.0.2n]# ./config -fPIC --prefix=/usr/local/openssl enable-shared
[root@httpd openssl-1.0.2n]# make && make install
httpd-2.4.29.tar.gz
[root@httpd ~]# tar -xzvf httpd-2.4.29.tar.gz
[root@httpd ~]# cd httpd-2.4.29
[root@httpd httpd-2.4.29]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-ssl --with-ssl=/usr/local/openssl --enable-cgi --enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event --with-pcre=/usr/local/pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-expires --enable-deflate
[root@httpd httpd-2.4.29]# make && make install
yum install -y zlib-devel
apr-util版本太高
開啓服務
[root@httpd ~]# /usr/local/httpd/bin/apachectl start
訪問192.168.217.154:80