馬哥教育網絡班22期+第12周課程練習

1、請描述一次完整的http請求處理過程;

	1. 建立或處理連接:接收請求或拒絕請求;

	2. 接收請求:接收來自于網絡上的主機請求報文中對某特定資源的一次請求的過程;

	3. 處理請求:對請求報文進行解析,獲取客戶端請求的資源及請求方法等相關信息;

	4. 訪問資源:獲取請求報文中請求的資源;

	5. 構建響應報文:

	6. 發送響應報文:

	7. 記錄日志:
									
2、httpd所支持的處理模型有哪些,他們的分別使用于哪些環境。

	prefork:多進程模型,每個進程響應一個請求

		一個主進程:負責生成子進程及回收子進程,負責創建套接字,負責接收請求,并將其派發給某子進程進行處理;

		n個子進程:每個子進程處理一個請求

		工作模型:會預先生成幾個空閑進程,隨時等待用于響應用戶請求,最大空閑和最小空閑;

		缺點:一個進程相對占用更多的系統資源,消耗更多的內存。而且,它并不擅長處理高并發請求,在這種場景下,
		它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。

	worker:多進程多線程模型,每線程處理一個用戶請求;

		一個主進程:負責生成子進程,負責創建套接字,負責接收請求,并將其派發給某子進程進行處理;

		多個子進程:每個子進程負責生產多個線程

		每個線程:負責響應用戶請求;

		 并發響應數量:m*n

		 m:子進程數量

		 n:每個子進程所能創建的最大線程數量

		優點:占據更少的內存,高并發下表現更優秀。

		缺點:必須考慮線程安全的問題,因為多個子線程是共享父進程的內存地址的。如果使用keep-alive的長連接方式,某個
		線程會一直被占據,也許中間幾乎沒有請求,需要一直等待到超時才會被釋放。如果過多的線程,被這樣占據,也會導致
		在高并發場景下的無服務線程可用。(該問題在prefork模式下,同樣會發生)

	event:事件驅動模型,多進程模型,每個進程響應多個請求;

		一個主進程:負責生成子進程,負責創建套接字;負責接收請求,并將其派發給某子進程進行處理;

		子進程:基于事件驅動機制直接響應多個請求:

		httpd2.2版本:仍為測試使用模型

		httpd2.4版本:event可生產環境中使用

		它和worker模式很像,最大的區別在于,它解決了keep-alive場景下,長期被占用的線程的資源浪費問題

3、源碼編譯安裝LAMP環境(基于wordpress程序),并寫出詳細的安裝、配置、測試過程。

	httpd-2.4.23 + mysql-5.5.52-linux2.6-x86_64 + php-5.5.38編譯安裝過程:

	一、編譯安裝apache

		yum groupinstall "Development Tools" "Server platform Development"

		yum install mode_ssl openssl-devel pcre-devel

		1、解決依賴關系

			(1) 編譯安裝apr

				# tar xf apr-1.5.2.tar.gz
				# cd apr-1.5.2
				# ./configure --prefix=/usr/local/apr
				# make && make install

			(2) 編譯安裝apr-util

				# tar xf apr-util-1.5.4.tar.gz
				# cd apr-util-1.5.4
				# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
				# make && make install

		2、編譯安裝httpd-2.4.23

			# wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.23.tar.gz
			# tar xf httpd-2.4.23.tar.gz 
			# cd httpd-2.4.23

			# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event
			# make && make install


		3、修改httpd的主配置文件,設置其Pid文件的路徑

			編輯/etc/httpd24/httpd.conf,添加如下行即可:
			PidFile  "/var/run/httpd.pid"

		4、提供SysV服務腳本/etc/rc.d/init.d/httpd,內容如下:(文字所限,此處省略)

			
			為此腳本賦予執行權限:
			# chmod +x /etc/rc.d/init.d/httpd

			加入服務列表:
			# chkconfig --add httpd

			修改PATH環境變量,讓系統可以直接使用http的相關命令
			 # vim /etc/profile.d/http.sh   
			 # export PATH=/usr/local/apache/bin:$PATH   
			 # source /etc/profile.d/http.sh

			啟動服務進行測試
			 # service httpd start

	二、安裝mysql-5.5.52

		1、準備數據存放目錄

			# mkdir -pv /mydata/data

		2、新建用戶以安全方式運行進程:

			# groupadd -r mysql
			# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
			# chown -R mysql:mysql /mydata/data

		3、安裝并初始化mysql-5.5.52

			# cd /usr/local/
			# wget http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.5/mysql-5.5.52-linux2.6-x86_64.tar.gz
			# tar xf mysql-5.5.52-linux2.6-x86_64.tar.gz 
			# ln -sv mysql-5.5.52-linux2.6-x86_64 mysql
			# cd mysql 
			# chown -R mysql:mysql  .
			# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
			# chown -R root  .

		4、為mysql提供主配置文件:

			# cd /usr/local/mysql
			# cp support-files/my-large.cnf  /etc/my.cnf
			# vim /etc/my.cnf

			并修改此文件中thread_concurrency的值為你的CPU個數乘以2
			thread_concurrency = 2

			指定mysql數據文件的存放位置:
			datadir = /mydata/data

		5、為mysql提供sysv服務腳本:

			# cp support-files/mysql.server  /etc/rc.d/init.d/mysqld
			# chmod +x /etc/rc.d/init.d/mysqld

			添加至服務列表:
			# chkconfig --add mysqld
			# chkconfig mysqld on

			啟動服務測試


		6、輸出mysql的man手冊至man命令的查找路徑:

			編輯/etc/man.config,添加如下行即可:
			MANPATH  /usr/local/mysql/man

		7、輸出mysql的頭文件至系統頭文件路徑/usr/include:

			這可以通過簡單的創建鏈接實現:
			# ln -sv /usr/local/mysql/include  /usr/include/mysql

		8、輸出mysql的庫文件給系統庫查找路徑:

			# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf

			而后讓系統重新載入系統庫:
			# ldconfig

		9、修改PATH環境變量,讓系統可以直接使用mysql的相關命令。具體實現過程這里不再給出。

		 	vim /etc/profile.d/mysql.sh   
		    export PATH=/usr/local/mysql/bin:$PATH   
		    # source /etc/profile.d/mysql.sh

	三、編譯安裝php-5.5.38

		1、解決依賴關系:

			請配置好yum源(系統安裝源及epel源)后執行如下命令:
			# yum -y groupinstall "Desktop Platform Development" 
			# yum -y install bzip2-devel libmcrypt-devel libxml2-devel php-mysql


		2、編譯安裝php-5.5.38

			# cd /usr/local/
			wget -c http://cn2.php.net/get/php-5.5.38.tar.gz/from/this/mirror -O php-5.5.38.tar.gz
			# tar tar xf php-5.5.38.tar.gz
			# cd php-5.5.38
			# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2  --enable-maintainer-zts
			# make
			# make test
			# make intall

			為php提供配置文件:
			# cp php.ini-production /etc/php.ini

		3、 編輯apache配置文件httpd.conf,以apache支持php
		 
			# vim /etc/httpd24/httpd.conf
			 1、添加如下二行
			   AddType application/x-httpd-php  .php
			   AddType application/x-httpd-php-source  .phps

			 2、定位至DirectoryIndex index.html 
			   修改為:
			    DirectoryIndex  index.php  index.html

			而后重新啟動httpd,或讓其重新載入配置文件即可測試php是否已經可以正常使用。
			service httpd restart

			# vim /usr/local/apache/htdocs/index.php
			測試頁面index.php示例如下:
			<?php
			        $conn = mysql_connect('127.0.0.1','root','');
			        if ($conn)
			                echo "OK";
			        else
			                echo "Failure";
			?>

	四、安裝wordpress-4.5.3

		1、創建數據庫并授權

			# mysql
			mysql> CREATE DATABASE wpdb
			mysql> GRANT ALL ON wpdb.* TO wpuser@'192.168.%.%' IDENTIFIED BY 'wppass';

		2、安裝wordpress-4.5.3

			# cd /usr/local/apache/htdocs/
			# wget https://cn.wordpress.org/wordpress-4.5.3-zh_CN.zip
			# unzip wordpress-4.5.3-zh_CN.zip 
			# cd wordpress
			# cp wp-config-sample.php wp-config.php
			# vim wp-config.php 
			/** WordPress數據庫的名稱 */
			define('DB_NAME', 'wpdb');

			/** MySQL數據庫用戶名 */
			define('DB_USER', 'wpuser');

			/** MySQL數據庫密碼 */
			define('DB_PASSWORD', 'wppass');

			/** MySQL主機 */
			define('DB_HOST', '192.168.2.14');

			在瀏覽器中輸入http://192.168.2.14/wordpress,輸入相應文字完成安裝

4、建立httpd服務器(基于編譯的方式進行),要求:
     提供兩個基于名稱的虛擬主機:
    (a)www1.stuX.com,頁面文件目錄為/web/vhosts/www1;錯誤日志為/var/log/httpd/www1.err,訪問日志為/var/log/httpd/www1.access;
    (b)www2.stuX.com,頁面文件目錄為/web/vhosts/www2;錯誤日志為/var/log/httpd/www2.err,訪問日志為/var/log/httpd/www2.access;
    (c)為兩個虛擬主機建立各自的主頁文件index.html,內容分別為其對應的主機名;
    (d)通過www1.stuX.com/server-status輸出httpd工作狀態相關信息,且只允許提供帳號密碼才能訪問(status:status);

	1、創建虛擬主機目錄與index.html文件

		mkdir -pv /web/vhosts/www{1,2}
		echo "www1.stuX.com" >  /web/vhosts/www1/index.html
		echo "www2.stuX.com" >  /web/vhosts/www2/index.html

	2、創建虛擬主機日志文件

		mkdir /var/log/httpd
		touch /var/log/httpd/www{1,2}.{err,access}

	3、主配置文件包含虛擬主機配置文件

		vim /etc/httpd24/httpd.conf
		#Include /etc/httpd24/extra/httpd-vhosts.conf   刪除前面的#號

	4、編輯虛擬主機配置文件

		vim /etc/httpd24/extra/httpd-vhosts.conf
		<VirtualHost *:80>
		    DocumentRoot "/web/vhosts/www1"
		    ServerName www1.stuX.com
		    ErrorLog "/var/log/httpd/www1.err"
		    CustomLog "/var/log/httpd/www1.acess" common
		    <Directory "/web/vhosts/www1">
		        Options None
		        AllowOverride None
		        Require all granted
		    </Directory>
		</VirtualHost>

		<VirtualHost *:80>
		    DocumentRoot "/web/vhosts/www2"
		    ServerName www2.stuX.com
		    ErrorLog "/var/log/httpd/www2.err"
		    CustomLog "/var/log/httpd/www2.acess" common
		    <Directory "/web/vhosts/www2">
		        Options None
		        AllowOverride None
		        Require all granted
		    </Directory>
		</VirtualHost>

	5、通過www1.stuX.com/server-status輸出httpd工作狀態相關信息配置

		vim /etc/httpd24/extra/httpd-vhosts.conf
		<VirtualHost *:80>
		    DocumentRoot "/web/vhosts/www1"
		    ServerName www1.stuX.com
		    ErrorLog "/var/log/httpd/www1.err"
		    CustomLog "/var/log/httpd/www1.acess" common
		    <Directory "/web/vhosts/www1">
		        Options None
		        AllowOverride None
		        Require all granted
		    </Directory>
		    <Location /server-status>
		       SetHandler server-status
		       AuthType Basic
		       AuthName "Web Auth Server-status"
		       AuthUserFile "/etc/httpd24/extra/.htpasswd"
		       Require user status
		    </location>
		</VirtualHost>


	6、生成.htpasswd 文件 及status 帳號密碼

		htpasswd -c -m /etc/httpd24/extra/.htpasswd status

		重啟httpd服務
		service httpd restart

	7、在瀏覽器輸入http://www1.stux.com/server-status 進行測試

5、為第4題中的第2個虛擬主機提供https服務,使得用戶可以通過https安全的訪問此web站點;
   (1)要求使用證書認證,證書中要求使用的國家(CN)、州(HA)、城市(ZZ)和組織(MageEdu);
   (2)設置部門為Ops,主機名為www2.stuX.com,郵件為admin@stuX.com;

	1.構建私有CA
 
        生成私鑰
        # (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4906)
 
        生成自簽證書
        # openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
 
        為CA提供所需的目錄及文件
        # mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
        # touch /etc/pki/CA/{serial,index.txt}
        # cd /etc/pki/CA
        # echo 01 > /etc/pki/CA/serial 
 
    2.要用到證書進行安全通信的服務器,向CA請求簽署證書
 
        用到證書的主機生成私鑰
        # mkdir  /etc/httpd/ssl
        # mkdir -pv /etc/httpd/ssl
        # cd /etc/httpd/ssl
        # (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
 
        # 生成證書簽署請求
        openssl req -new -key /etc/httpd24/ssl/httpd.key -out /etc/httpd24/ssl/httpd.csr -days 365
		Country Name (2 letter code) [XX]:CN 
		State or Province Name (full name) []:HA
		Locality Name (eg, city) [Default City]:ZZ
		Organization Name (eg, company) [Default Company Ltd]:MageEdu
		Organizational Unit Name (eg, section) []:Ops
		Common Name (eg, your name or your server's hostname) []:www2.stuX.com
		Email Address []:admin@stuX.com


        在CA主機上簽署證書

  		# openssl ca -in /etc/httpd24/ssl/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365


	3.修改主配置文件,加載相關模塊

		# vim /etc/httpd24/httpd.conf
		LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
		LoadModule ssl_module modules/mod_ssl.so
		Include /etc/httpd24/extra/httpd-ssl.conf

		修改http-ssl.conf

		 <VirtualHost 192.168.2.14:443>
		DocumentRoot "/web/vhosts/www2"
		ServerName www2.stuX.com:443
		ServerAdmin admin@magedu.com
		ErrorLog "/usr/local/apache/logs/error_log"
		TransferLog "/usr/local/apache/logs/access_log"
		<Directory "/web/vhosts/www2">
		                Options None
		                AllowOverride None
		                Require all granted
		</Directory>
		SSLCertificateFile "/etc/httpd24/ssl/httpd.crt"
		SSLCertificateKeyFile "/etc/httpd24/ssl/httpd.key"
		</VirtualHost>
   
6、在LAMP架構中,請分別以php編譯成httpd模塊形式和php以fpm工作為獨立守護進程的方式來支持httpd,列出詳細的過程。

 1.php編譯成httpd模塊形式(請看第3題)

 2.編譯安裝fpm方式工作的php

	yum groupinstall -y "Desktop Platform Development" 
	yum install -y libmcrypt-devel
	yum install -y bzip2-devel

	cd /usr/local/
	tar xf php-5.5.38.tar.gz
	cd php-5.5.38
	./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml  --enable-sockets --enable-fpm --with-mcrypt  --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2
	其中—enable-fpm  選項指定php為使用fpm工作方式
	make
	make intall

	(1)配置php-fpm 

		為php-fpm提供SysV init腳本,并將其添加至服務列表:
		cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm
		給腳本執行權限
		chmod +x /etc/rc.d/init.d/php-fpm
		將腳本加入運行級別并設置為開機啟動
		chkconfig --add php-fpm
		chkconfig php-fpm on

		為php-fpm提供配置文件:
		cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

		編輯php-fpm的配置文件:
		vim /usr/local/php/etc/php-fpm.conf
		pm.max_children = 50
		pm.start_servers = 5
		pm.min_spare_servers = 2
		pm.max_spare_servers = 8
		pid = /usr/local/php/var/run/php-fpm.pid 

		啟動php-fpm:
		service php-fpm start

	(2)配置httpd-2.4.9

		 # vim /etc/httpd/httpd.conf
		 1、加載proxy_module,proxy_fcgi_module模塊,刪除如下兩行前面的#號
			LoadModule proxy_module modules/mod_proxy.so
			LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

		 2、使apache支持php文件,添加如下兩行,
			AddType application/x-httpd-php  .php
			AddType application/x-httpd-php-source  .phps

		3、修改DirectoryIndex為:
			DirectoryIndex  index.php  index.html

		4、添加php頁面重定向,使得php頁面的請求都轉到php-fpm服務
			ProxyRequests Off
			ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/$1

		5、在創建index.php文件進行測試
			vim /usr/local/apache/htdocs/index.php
			<?php
			    phpinfo();
			?>

原創文章,作者:N22_上海_長清,如若轉載,請注明出處:http://www.www58058.com/60501

(0)
N22_上海_長清N22_上海_長清
上一篇 2016-11-28
下一篇 2016-11-28

相關推薦

  • 程序包管理之YUM解析

    前言:    yum是rpm的前端程序,用來解決軟件包相關依賴性,可以在多個庫之間定位軟件包,如果直接使用rpm直接安裝程序包也可以,但是需要自己手工解決程序包依賴性的問題,可能程序包的依賴性非常復雜,那么直接使用rpm安莊,就會非常麻煩,而使用YUM安裝就會自動解決依賴性的問題。大大簡化了安裝過程。  YUM客戶端配置文件: …

    Linux干貨 2016-08-24
  • 文件系統自動掛載

    什么是文件系統自動掛載?          利用mount在shell終端進行掛載的時,開機自動啟動文件文件系統不會自動掛載,我們需要開機的時候自動掛載文件系統,稱為文件系統自動掛載 實現Linux自動掛載文件:/etc/fstab Linux中掛載注意事項:  &nb…

    Linux干貨 2016-08-29
  • lvs 基本概念

    LVS(linux virtual machine) 的簡寫,是一個虛擬的服務器集群系統,主要用于4層負載均衡。 宗旨: 使用集群技術和Linux操作系統實現一個高性能、高可用的服務器. 很好的可伸縮性(Scalability) 很好的可靠性(Reliability),應該還是高可用吧 很好的可管理性(Manageability…

    Linux干貨 2015-09-14
  • nginx負載均衡搭建

    組 網絡拓撲圖 nginx負載均衡服務器搭建 首先準備三臺機器 主機A(nginx負載均衡器) 主機B 主機C 主機A需兩塊網卡(一塊外網,一塊內網) 主機B和主機C各一塊 (各一塊內網的IP,如果主機B C和主機A內網網卡在一個網段就不需要配置網關地址了。 規劃好網絡后,nginx負載主機分別ping下各rs主機是否可通 主機A打開核心轉發功能 #echo…

    Linux干貨 2017-05-17
  • 8.1作業

    創建用戶gentoo,附加組為bin和root,默認shell為/bin/csh,注釋信息為“Gentoo Distribution” [root@localhost wang]# useradd -G bin,root -s /bin/csh -c "Gentoo&n…

    Linux干貨 2016-08-02
  • grep正則表達式及sort、diff等相關命令

    Linux文本處理三劍客: grep:文本過濾工具(模式:patter) sed:stream editor 流編輯器,文本編輯工具 awk:linux上的實現gawk,文本報告生成器(格式化文本) * 正則表達式:Regular Expression,REGEXP,由一類特殊字符及文本字符所編寫的模式,其中有些字符其不表達字面意義,而是…

    Linux干貨 2016-12-29

評論列表(1條)

  • luoweiro
    luoweiro 2016-11-29 22:02

    整體實戰部分寫的不錯,另外在描述http請求的過程中,最好和tcp/ip協議一起串起來,這部分是息息相關的,知識需要拓展后才能掌握的更全面。

欧美性久久久久