一、講述httpd工做原理以rpm包的方式安裝LAMP,配置基於域名的虛擬機主機並部署PhpMyAdmin、WordPress(提供https)、discuzphp
http協議介紹html
http/0.9:1991,原型版本,功能簡陋,只有一個命令GET。GET /index.html ,服務器只能迴應HTML格式字符串,不能迴應別的格式mysql
http/1.0: 1996年5月,支持cache, MIME, methodlinux
每一個TCP鏈接只能發送一個請求,發送數據完畢,鏈接就關閉,若是還要請求其餘資源,就必須再新建一個鏈接web
引入了POST命令和HEAD命令sql
頭信息是 ASCII 碼,後面數據可爲任何格式。服務器迴應時會告訴客戶端,數據是什麼格式,即Content-Type字段的做用。這些數據類型總稱爲MIME 多用途互聯網郵件擴展,每一個值包括一級類型和二級類型,預約義的類型,也可自定義類型, 常見Content-Type值:text/xml image/jpeg audio/mp3數據庫
http/1.1:1997年1月apache
引入了持久鏈接(persistent connection),即TCP鏈接默認不關閉,能夠被多個請求複用,不用聲明Connection: keep-alive。對於同一個域名,大多數瀏覽器容許同時創建6個持久鏈接vim
引入了管道機制(pipelining),即在同一個TCP鏈接裏,客戶端能夠同時發送多個請求,進一步改進了HTTP協議的效率windows
新增方法:PUT、PATCH、OPTIONS、DELETE
同一個TCP鏈接裏,全部的數據通訊是按次序進行的。服務器只能順序處理迴應,前面的迴應慢,會有許多請求排隊,形成"隊頭堵塞"(Head-of-line blocking)
爲避免上述問題,兩種方法:一是減小請求數,二是同時多開持久鏈接。網頁優化技巧,如合併腳本和樣式表、將圖片嵌入CSS代碼、域名分片(domain sharding)等
HTTP 協議不帶有狀態,每次請求都必須附上全部信息。請求的不少字段都是重複的,浪費帶寬,影響速度
一、創建鏈接:接收或拒絕鏈接請求
二、接收請求:接收客戶端請求報文中對某資源的一次請求的過程
Web訪問響應模型(Web I/O)
單進程I/O模型:啓動一個進程處理用戶請求,並且一次只處理一個,多個請求被串行響應
多進程I/O模型:並行啓動多個進程,每一個進程響應一個鏈接請求
複用I/O結構:啓動一個進程,同時響應N個鏈接請求
實現方法:多線程模型和事件驅動
多線程模型:一個進程生成N個線程,每線程響應一個鏈接請求
事件驅動:一個進程處理N個請求
複用的多進程I/O模型:啓動M個進程,每一個進程響應N個鏈接請求,同時接收M*N個請求
三、處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理
元數據:請求報文首部
<method> <URL> <VERSION>
HEADERS 格式 name:value
<request body>
示例:
Host: www.magedu.com 請求的主機名稱
Server: Apache/2.4.7
HTTP經常使用請求方式,Method
GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
四、訪問資源:
服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
資源放置於本地文件系統特定的路徑:DocRoot
DocRoot /var/www/html
/var/www/html/images/logo.jpg
http://www.magedu.com/images/logo.jpg
web服務器資源路徑映射方式:
(a) docroot
(b) alias
(c) 虛擬主機docroot
(d) 用戶家目錄docroot
五、構建響應報文:
一旦Web服務器識別除了資源,就執行請求方法中描述的動做,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,若是生成了響應主體的話,還包括響應主體
1)響應實體:若是事務處理產生了響應主體,就將內容放在響應報文中回送過去。響應報文中一般包括:
描述了響應主體MIME類型的Content-Type首部
描述了響應主體長度的Content-Length
實際報文的主體內容
2)URL重定向:web服務構建的響應並不是客戶端請求的資源,而是資源另一個訪問路徑
永久重定向:http://www.360buy.com
臨時重定向:http://www.taobao.com
六、發送響應報文
Web服務器經過鏈接發送數據時也會面臨與接收數據同樣的問題。服務器可能有不少條到各個客戶端的鏈接,有些是空閒的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄鏈接的狀態,還要特別注意對持久鏈接的處理。對非持久鏈接而言,服務器應該在發送了整條報文以後,關閉本身這一端的鏈接。對持久鏈接來講,鏈接可能仍保持打開狀態,在這種狀況下,服務器要正確地計算Content-Length首部,否則客戶端就沒法知道響應何時結束了
七、記錄日誌
最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務
http mpm三種工做模型
prefork:多進程I/O模型,每一個進程響應一個請求,默認模型
一個主進程:生成和回收n個子進程,建立套接字,不響應請求
多個子進程:工做work進程,每一個子進程處理一個請求;系統初始時,預先生成多個空閒進程,等待請求,最大不超過1024個
worker:複用的多進程I/O模型,多進程多線程,IIS使用此模型
一個主進程:生成m個子進程,每一個子進程負責生個n個線程,每一個線程響應一個請求,併發響應請求:m*n
event:事件驅動模型(worker模型的變種)
一個主進程:生成m個子進程,每一個進程直接響應n個請求,併發響應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又容許釋放。這樣加強了高併發場景下的請求處理能力
httpd-2.2:event 測試版,centos6默認
httpd-2.4:event 穩定版,centos7默認
實現步驟
安裝lamp包 httpd php,php-mysql mariadb-server
yum install httpd, php, php-mysql, mariadb-server
systemctl start httpd.service
systemctl start mariadb.service
https://www.phpmyadmin.net/files/4.0.10.20/ 下載phpmyadmin
解壓並進入目錄 將範例文件改名 ,默認密碼修改爲隨機的密碼,將phpmyadmin解壓至httpd根目錄而且爲了方便進入更改目錄名
mv phpMyAdmin-4.0.10.20-source pma #更改目錄名
mv config.sample.inc.php config.inc.php #將範例文件改名
啓動數據庫,生成口令
systemctl restart mariadb
mysql_secure_installation #執行mysql安全腳本生成口令
yum install php-mbstring 安裝phpmyadmin的依賴包
systemctl restart httpd #從新啓動httpd服務
登陸數據庫名爲root,密碼爲運行安全腳本時本身設置的密碼。
建立wordpress數據庫給wordpress使用,並建立用戶
修改wpuser權限,能夠管理wordpress庫
https://cn.wordpress.org/download/ 下載wordpress 注意。使用rpm方式實現lamp架構由於httpd php等版本更新較慢。下載wordpress時須要注意版本兼容問題。建議rpm安裝時下載舊版wordpress
unzip wordpress-4.9.4-zh_CN.zip 解壓wordpress安裝包
cd wordpress/
cp wp-config-sample.php wp-config.php
修改配置文件,添加數據庫帳號 vim wp-config.php
訪問成功
實現discuz 論壇
可在論壇中下載http://www.discuz.net/forum.php
unzip Discuz_X3.3_SC_UTF8.zip 解壓包
解壓完成進入upload目錄中可發現直接又install的目錄。
http://192.168.64.136/upload/install/ 在遊覽器中直接輸入開始安裝
有些目錄須要設置寫權限。須要配置權限
setfacl -R -m u:apache:rw ./upload/
安裝完成
實現虛擬主機使用域名解析
搭建wordpress
寫入/etc/hosts 文件。加入域名
vim /etc/httpd/conf.d/test.conf 增長配置文件。
<virtualhost *:80>
DocumentRoot "/var/www/html/wordpress"
servername "www.a.com"
<directory /var/www/html/wordpress>
Require all granted
</directory>
</virtualhost>
添加以上字段。若是實現discurz論壇則須要修改discuz的目錄
將documentroot 指向discuz的目錄
curl www.a.com | less 測試鏈接成功
實現https 訪問
利用mod_ssl實現加密功能
yum install mod_ssl
安裝完成以後會自動生成公鑰和私鑰對,就自動完成了https加密的過程
搭建私有ca生成https功能
cd /etc/pki/CA目錄
(umask 066;openssl genrsa -out private/cakey.pem 2048)生成私鑰文件
生成自簽名證書並簽名
openssl req -new -x509 -key private/cakey.pem -out cacert.pem
建立ca的證書編號文件
touch index.txt
echo 01 > serial
客戶機生成私鑰,及證書申請文件,(我這裏是在本機操做)
(umask 077;openssl genrsa -out httpd.key 1024)
openssl req -new -key httpd.key -out httpd.csr
給生成的證書申請簽名
openssl ca -in /etc/httpd/conf.d/ssl/httpd.csr -out certs/httpd.crt -days 365
將生成證書和ca公鑰頒發,(這裏是拷貝,由於一臺機器。)
cp certs/httpd.crt /etc/httpd/conf.d/ssl
cp /etc/pki/CA/cacert.pem /etc/httpd/conf.d/ssl/
修改mod_ssl模塊的配置文件
vim /etc/httpd/conf.d/ssl.conf
修改證書文件路徑。和key路徑
和ca的公鑰路徑
到此就能夠利用https訪問網站了。
windows由於沒有域名因此只能實現ip訪問
在虛擬機中能夠實現域名訪問
二、編譯安裝LAMP且PHP以FASTCGI的方式工做並使用XCache爲php加速
下載httpd,php,mariadb,源碼包,由於新版httpd包不支持老版本的apr包因此還須要下載apr 和aprutil包
解壓縮
[root@centos7 ~]# tar xf apr-1.6.5.tar.bz2
[root@centos7 ~]# tar xf apr-util-1.6.1.tar.bz2
[root@centos7 ~]# tar xf httpd-2.4.37.tar.bz2
將新版apr複製到httpd目錄而且改名
[root@centos7 ~]# cp -r apr-1.6.5 httpd-2.4.37/srclib/apr
[root@centos7 ~]# cp -r apr-util-1.6.1 httpd-2.4.37/srclib/apr-util
下載開發包組用於編譯安裝
yum groupinstall "Development Tools" -y
安裝依賴包
yum install pcre-devel openssl-devel expat-devel
進入httpd目錄開始編譯安裝cd httpd-2.4.37/
./configure --prefix=/app/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork \
--with-included-apr
make && make install
解壓數據庫到/usr/local目錄中,建立軟鏈接,建立帳號及數據庫目錄
tar -xvf mariadb-10.2.15-linux-x86_64.tar.gz -C /usr/local/
ln -s mariadb-10.2.15-linux-x86_64/ mysql
useradd -s /sbin/nologin -r mysql -d /data/mysql
chown -R root.root mariadb-10.2.15-linux-x86_64/
mkdir /data/mysql
chown mysql.mysql /data/mysql
進入/usr/local/mysql/目錄執行初始化安裝腳本。生成數據庫文件
scripts/mysql_install_db --user=mysql --datadir=/data/mysql
自定義一個數據庫配置文件,而且修改數據庫路徑
mkdir /etc/mysql/
cp support-files/my-huge.cnf /etc/mysql/my.cnf
mysqld下加入一行datadir=/data/mysql
將啓動腳本設置爲開機自啓動
加入環境變量
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
建立數據庫並受權wordpress用戶,若是鏈接拒絕,也可使用root用鏈接。
編譯安裝php
須要安裝依賴包
yum install libxml2-devel bzip2-devel libmcrypt-devel (epel)
解壓縮php。進入php目錄
tar xf php-7.1.18.tar.bz2
./configure --prefix=/app/php \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-openssl \
--with-pdo-mysql=mysqlnd \
--enable-mbstring \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--enable-sockets \
--enable-fpm \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d \
--enable-maintainer-zts \
--disable-fileinfo
make && make sintall
生成配置文件和啓動腳本
cp php.ini-production /etc/php.ini
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
cd /app/php/etc #進入php編譯完成後的目錄
cp php-fpm.conf.default php-fpm.conf #將範例文件名修改爲配置文件
cp php-fpm.d/www.conf.default php-fpm.d/www.conf
更改apache配置文件,使其可以支持php
vim /app/httpd24/conf/httpd.conf
取消下面兩行的註釋
LoadModule proxy_module modules/mod_proxy.so #開啓代理功能模塊
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
在末尾加入
ProxyRequests Off #//是否開啓正向代理
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/app/httpd24/htdocs/$1 ##//開啓FCGI反向代理,//前面的/相對於後面的/var/www/html而言,後面的$1是指前面的/(.*\.php)
wordpress安裝
unzip wordpress-4.9.4-zh_CN.zip
將wordpress目錄中的文件移動至httpd的首頁目錄/app/httpd24/htdocs/
生成配置文件並修改配置文件的數據庫內容
mv wp-config-sample.php wp-config.php
運行mysql_secure_installation安全腳本生成密碼
寫入wordpress配置文件中。庫名和帳戶密碼。及主機
搭建成功