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