一、講述httpd工做原理以rpm包的方式安裝LAMP,配置基於域名的虛擬機主機並部署PhpMyAdmin、WordPress(提供https)、discuzphp
http協議介紹html
http/0.9:1991,原型版本,功能簡陋,只有一個命令GET。GET /index.html ,服務器只能迴應HTML格式字符串,不能迴應別的格式 http/1.0: 1996年5月,支持cache, MIME, method 每一個TCP鏈接只能發送一個請求,發送數據完畢,鏈接就關閉,若是還要請求其餘資源,就必須再新建一個鏈接 引入了POST命令和HEAD命令 頭信息是 ASCII 碼,後面數據可爲任何格式。服務器迴應時會告訴客戶端,數據是什麼格式,即Content-Type字段的做用。這些數據類型總稱爲MIME 多用途互聯網郵件擴
展,每一個值包括一級類型和二級類型,預約義的類型,也可自定義類型, 常見Content-Type值:text/xml image/jpeg audio/mp3 http/1.1:1997年1月 引入了持久鏈接(persistent connection),即TCP鏈接默認不關閉,能夠被多個請求複用,不用聲明Connection: keep-alive。對於同一個域名,大多數瀏覽器容許
同時創建6個持久鏈接 引入了管道機制(pipelining),即在同一個TCP鏈接裏,客戶端能夠同時發送多個請求,進一步改進了HTTP協議的效率 新增方法:PUT、PATCH、OPTIONS、DELETE 同一個TCP鏈接裏,全部的數據通訊是按次序進行的。服務器只能順序處理迴應,前面的迴應慢,會有許多請求排隊,形成"隊頭堵塞"(Head-of-line blocking) 爲避免上述問題,兩種方法:一是減小請求數,二是同時多開持久鏈接。網頁優化技巧,如合併腳本和樣式表、將圖片嵌入CSS代碼、域名分片(domain sharding)等 HTTP 協議不帶有狀態,每次請求都必須附上全部信息。請求的不少字段都是重複的,浪費帶寬,影響速度
1、創建鏈接:接收或拒絕鏈接請求 2、接收請求:接收客戶端請求報文中對某資源的一次請求的過程 Web訪問響應模型(Web I/O) 單進程I/O模型:啓動一個進程處理用戶請求,並且一次只處理一個,多個請求被串行響應 多進程I/O模型:並行啓動多個進程,每一個進程響應一個鏈接請求 複用I/O結構:啓動一個進程,同時響應N個鏈接請求 實現方法:多線程模型和事件驅動 多線程模型:一個進程生成N個線程,每線程響應一個鏈接請求 事件驅動:一個進程處理N個請求 複用的多進程I/O模型:啓動M個進程,每一個進程響應N個鏈接請求,同時接收M*N個請求 3、處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理 元數據:請求報文首部 <method> <URL> <VERSION> HEADERS 格式 name:value <request body> 示例: Host: www.magedu.com 請求的主機名稱 Server: Apache/2.4.7 HTTP經常使用請求方式,Method:標明客戶端但願服務器對資源執行的動做
GET:從服務器獲取一個資源
HEAD:只從服務器獲取文檔的響應首部
POST:向服務器輸入數據,一般會再由網關程序繼續處理,常見爲提交表單
PUT:將請求的主體部分存儲在服務器中,如上傳文件
DELETE:請求刪除服務器上指定的文檔
TRACE:追蹤請求到達服務器中間通過的代理服務器
OPTIONS:請求服務器返回對指定資源支持使用的請求方法
status:狀態碼
1xx:100-101 信息提示
2xx:200-206 成功
3xx:300-305 重定向
4xx:400-415 錯誤類信息,客戶端錯誤
5xx:500-505 錯誤類信息,服務器端錯誤
200:成功,請求數據經過響應報文的entity-body部分發送;OK
301:請求的URL執行的資源已經被刪除;但在響應報文中經過首部LOCATION指明瞭資源如今所處的新位置;Moved Permanently
302:響應報文Location指明資源臨時新位置;Moved Temporarily
304:客戶端發出了條件式請求,但服務器上的資源不曾發生改變,則經過響應此響應狀態碼通知客戶端;Not Modified
401:須要輸入帳號和密碼認證方能訪問資源:Unauthorized
403:請求被禁止;Forbidden
404:服務器沒法找到客戶端請求的資源;Not Found
500:服務器內部錯誤;Internal Server Error
502:代理服務器從後端服務器收到了一條僞響應,如沒法鏈接到網關;Bad Gateway
503:服務不可用,臨時服務器維護或過載,服務器沒法處理請求
504:網關超時mysql
4、訪問資源: 服務器獲取請求報文中請求的資源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 5、構建響應報文: 一旦Web服務器識別除了資源,就執行請求方法中描述的動做,並返回響應報文。響應報文中 包含有響應狀態碼、響應首部,若是生成了響應主體的話,還包括響應主體 1)響應實體:若是事務處理產生了響應主體,就將內容放在響應報文中回送過去。響應報文中一般包括: 描述了響應主體MIME類型的Content-Type首部 描述了響應主體長度的Content-Length 實際報文的主體內容 2)URL重定向:web服務構建的響應並不是客戶端請求的資源,而是資源另一個訪問路徑 永久重定向301:http://www.360buy.com 臨時重定向302:http://www.taobao.com 6、發送響應報文 Web服務器經過鏈接發送數據時也會面臨與接收數據同樣的問題。服務器可能有不少條到各個客戶端的鏈接,有些是空閒的,有些在向服務器發送數據,還有一些在向客戶端回送響
應數據。服務器要記錄鏈接的狀態,還要特別注意對持久鏈接的處理。對非持久鏈接而言,服務器應該在發送了整條報文以後,關閉本身這一端的鏈接。對持久鏈接來講,鏈接可能
仍保持打開狀態,在這種狀況下,服務器要正確地計算Content-Length首部,否則客戶端就沒法知道響應何時結束了 7、記錄日誌 最後,當事務結束時,Web服務器會在日誌文件中添加一個條目,來描述已執行的事務
httpd 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默認
以rpm包的方式安裝LAMP,配置基於域名的虛擬機主機並部署PhpMyAdmin、WordPress(提供https)、discuzlinux
快速部署LAMP CentOS 7: Modules:httpd, php, php-mysql, mariadb-server FastCGI:httpd, php-fpm, php-mysql, mariadb-server CentOS 6: Modules:httpd, php, php-mysql, mysql-server FastCGI:默認不支持 安裝LAMP CentOS 6: yum install httpd, php, mysql-server, php-mysql service httpd start service mysqld start CentOS 7: yum install httpd, php, php-mysql, mariadb-server systemctl start httpd.service systemctl start mariadb.service 注意:要使用prefork模型
部署phpMyadmin yum -y install httpd mariadb-server php php-mysql systemctl start httpd systemctl start mariadb mysql_secure_installation 下載:https://www.phpmyadmin.net/downloads/ tar xvf phpMyAdmin-4.0.10.20-all-languages.tar.xz -C /var/www/html
mv phpMyAdmin-4.0.10.20-source pma cd pma/ cp config.sample.inc.php config.inc.php vim config.ini.php 修改默認密碼 $cfg['blowfish_secret'] = 'a8b7c6d'; $cfg['Servers'][$i]['host'] = '192.168.242.129'; # 地址 $cfg['Servers'][$i]['connect_type'] = 'tcp'; # 類型 $cfg['Servers'][$i]['compress'] = false; # 壓縮 yum -y install php-mbstring systemctl reload httpd
建立wordpress數據庫給wordpress使用,並建立用戶
修改wpuser權限,能夠管理wordpress庫
部署WordPress 下載wordpress https://cn.wordpress.org/download/ 注意。使用rpm方式實現lamp架構由於httpd php等版本更新較慢。下載wordpress時須要注意版本兼容問題。建議rpm安裝時下載舊版wordpress unzip wordpress-4.9.4-zh_CN.zip -C /var/www/html 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 -C /var/www/html解壓包 解壓完成進入upload目錄中可發現直接又install的目錄。 http://192.168.64.136/upload/install/ 在遊覽器中直接輸入開始安裝
有些目錄須要設置寫權限。須要配置權限web
setfacl -R -m u:apache:rw ./upload/sql
安裝完成數據庫
搭建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 訪問apache
利用mod_ssl實現加密功能
yum install mod_ssl
安裝完成以後會自動生成公鑰和私鑰對,就自動完成了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的證書編號文件vim
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訪問網站了。
二、編譯安裝LAMP且PHP以FASTCGI的方式工做並使用XCache爲php加速
建議安裝順序httpd->mysql->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配置文件中。庫名和帳戶密碼。及主機
搭建成功