1、請描述一次完整的http請求處理過程;
HTTP通信機制是在一次完整的HTTP通信過程中,Web瀏覽器與Web服務器之間將完成下列7個步驟:
建立TCP連接
在HTTP工作開始之前,Web瀏覽器首先要通過網絡與Web服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之後才能進行更高層協議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80;
Web瀏覽器向Web服務器發送請求命令
一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令。例如:GET/sample/hello.jsp HTTP/1.1;
Web瀏覽器發送請求頭信息
瀏覽器發送其請求命令之後,還要以頭信息的形式向Web服務器發送一些別的信息,之後瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。
Web服務器應答
客戶機向服務器發出請求後,服務器會客戶機回送應答, HTTP/1.1 200 OK ,應答的第一部分是協議的版本號和應答狀態碼;
Web服務器發送應答頭信息
正如客戶端會隨同請求發送關於自身的信息一樣,服務器也會隨同應答向用戶發送關於它自己的數據及被請求的文檔;
Web服務器向瀏覽器發送數據
Web服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此爲結束,接着,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據;
Web服務器關閉TCP連接
一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,然後如果瀏覽器或者 服務器在其頭信息加入了這行代碼:Connection:keep-alive;
TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接 節省了爲每個請求建立新連接所需的時間,還節約了網絡帶寬。
2、httpd所支持的處理模型有哪些,他們的分別使用於哪些環境。
Apache有兩種工作模型,一種是基於進程的preforker模型,一種是基於線程和進程混合的Worker模型
1)prefork模式
prefork模式可以算是很古老但是非常穩定的Apache模式。Apache在啓動之初,就預先fork一些子進程,然後等待請求進來。之所以這樣做,是爲了減少頻繁創建和銷燬進程的開銷。每個子進程只有一個線程,在一個時間點內,只能處理一個請求;
優點:成熟穩定,兼容所有新老模塊。同時,不需要擔心線程安全的問題。(我們常用的mod_php,PHP的拓展不需要支持線程安全);
缺點:一個進程相對佔用更多的系統資源,消耗更多的內存。而且,它並不擅長處理高併發請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。
2)worker模式
worker模式比起上一個,是使用了多進程和多線程的混合模式。它也預先fork了幾個子進程(數量比較少),然後每個子進程創建一些線程,同時包括一個監聽線程。每個請求過來,會被分配到1個線程來服務。線程比起進程會更輕量,因爲線程通常會共享父進程的內存空間,因此,內存的佔用會減少一些。在高併發的場景下,因爲比起prefork有更多的可用線程,表現會更優秀一些。
有些人會覺得奇怪,那麼這裏爲什麼不完全使用多線程呢,還要引入多進程?
原因主要是需要考慮穩定性,如果一個線程異常掛了,會導致父進程連同其他正常的子線程都掛了(它們都是同一個進程下的)。爲了防止這場異常場景出現,就不能全部使用線程,使用多個進程再加多線程,如果某個線程出現異常,受影響的只是Apache的一部分服務,而不是整個服務。
優點:佔據更少的內存,高併發下表現更優秀。
缺點:必須考慮線程安全的問題,因爲多個子線程是共享父進程的內存地址的。如果使用keep-alive的長連接方式,某個線程會一直被佔據,也許中間幾乎沒有請求,需要一直等待到超時纔會被釋放。如果過多的線程,被這樣佔據,也會導致在高併發場景下的無服務線程可用。
3)EVENT模式
這個是Apache中最新的模式,在現在版本里的已經是穩定可用的模式。它和worker模式很像,最大的區別在於,它解決了keep-alive場景下,長期被佔用的線程的資源浪費問題(某些線程因爲被keep-alive,空掛在哪裏等待,中間幾乎沒有請求過來,甚至等到超時)。event
MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又允許它釋放。這樣增強了高併發場景下的請求處理能力。
3、源碼編譯安裝LAMP環境(基於wordpress程序),並寫出詳細的安裝、配置、測試過程。
1、編譯安裝httpd-2.4.9
1)編譯安裝apr-1.5.0.tar.bz2
]# tar xvjf apr-1.5.0.tar.bz2
]# cd apr-1.5.0
]# ./configure --prefix=/usr/local/apr
]# make && make install
2)編譯安裝apr-util-1.5.2.tar.bz2
]# tar xjf apr-util-1.5.2.tar.bz2
]# cd apr-util-1.5.2
]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
]# make && make install
3)編譯安裝pcre-8.38.tar.gz
]# tar xzf pcre-8.38.tar.gz
]# cd pcre-8.38
]# ./configure --prefix=/usr/local/pcre
]# make && make install
4)創建系統組和用戶
#] groupadd -r apache
#] useradd -r -g apache apache
編譯安裝httpd
]# tar xjf httpd-2.4.9.tar.bz2
]# cd httpd-2.4.9
]# ./configure --prefix=/usr/local/apache \
> --sysconfdir=/etc/httpd \ # 指定配置文件路徑
> --enable-so \ # 支持動態加載DSO模塊
> --enable-ssl \ # 開啓SSL功能,支持https
> --enable-cgi \ # 啓用與外部應用程序的cgi接口功能
> --enable-rewrite \ # 支持url重寫
> --with-zlib \ # 支持web頁面壓縮傳送
> --with-pcre=/usr/local/pcre \ # 增強型的正則表達式分析工具,nginx等程序依賴,依賴於pcre-devel開發包
> --with-apr=/usr/local/apr \ # 指定高版本apr程序路徑,不指定則會自動指定系統默認版本
> --with-apr-util=/usr/local/apr-util \ # 指定apr-util路徑
> --enable-mpms-shared=all \ # 支持動態裝卸載所有mpm
> --with-mpm=prefork \ # mpm默認使用prefork
> --enable-modules=all # all爲安裝所有模塊,most爲安裝常用模塊(安裝不代表啓用)
]# make && make install
2、編譯安裝mysql
1)添加組 ,添加用戶
[root@www mysql]# groupadd -r -g 306 mysql
[root@www mysql]# useradd -g 306 -r -u 306 mysql
[root@www mysql]# chown -R mysql.mysql /usr/local/mysql/* #更改mysql目錄下的屬組和屬主
創建用戶存儲數據庫的目錄mkdir /mydata/data -pv
更改目錄的屬組和屬主 ]# chown -R mysql.mysql /mydata/data/
2)解壓]# tar xzf mysql-5.6.13.tar.gz
3)安裝編譯代碼所需要的包]# yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio
4)編譯 ]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ [MySQL安裝的根目錄]
-DMYSQL_DATADIR=/mydata/mysql/data \ [MySQL數據庫文件存放目錄]
-DSYSCONFDIR=/etc \ [MySQL配置文件所在目錄]
-DMYSQL_USER=mysql \ [MySQL用戶名]
-DWITH_MYISAM_STORAGE_ENGINE=1 \ [MySQL的數據庫引擎]
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ [MySQL的數據庫引擎]
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ [MySQL的數據庫引擎]
-DWITH_MEMORY_STORAGE_ENGINE=1 \ [MySQL的數據庫引擎]
-DWITH_READLINE=1 \ [MySQL的readline library]
-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock \ [MySQL的通訊目錄]
5)然後 #] make && make install進行安裝
3、編譯安裝php
1)#] tar xjf php-5.4.26.tar.bz2 解壓
2)配置 #] cd php-5.4.26
[root@www php-5.4.26]# ./configure --enable-opcache --prefix=/etc/local/php \
> --with-config-file-path=/usr/local/php/etc \
> --with-mysql=/usr/local/mysql \
> --with-mysqli=/usr/local/mysql/bin/mysql_config \
> --enable-mbstring=all \
> --with-pdo-mysql \
> --enable-sockets \
> --enable-mbstring \
> --enable-fpm \
> --with-curl \
> --with-iconv-dir=/usr/local \
> --with-freetype-dir \
> --with-jpeg-dir \
> --with-png-dir \
> --with-zlib \
> --enable-xml \
> --with-gd \
> --with-libxml-dir=/usr \
> --with-openssl \
> --with-iconv
我這裏編譯報錯libxml2沒有找到,可以使用yum install libxml2-devel -y 即可解決,
一般報錯某某包沒有找到,就使用yum install xxx.devel -y安裝即可(xxx代表提示沒有安裝的)
如上圖提示錯誤:解決辦法如下
centos32位系統:
yum install libjpeg libpng freetype libjpeg-devel libpng-devel freetype-devel -y
若是64位系統
解決方法:
yum install libjpeg.x86_64 libpng.x86_64 freetype.x86_64 libjpeg-devel.x86_64 libpng-devel.x86_64 freetype-devel.x86_64 -y
執行make && make install 即可
#] scripts/mysql_install_db--user=mysql--datadir=/mydata/data/(初始化mysql)
chown -R root /usr/local/mysql/*(萬一有人攻破mysql進程,則不安全,所以改爲root用戶)
但要注意實際data目錄要mysql.mysql。現在data目錄我們設爲/mydata/data,所以此目錄裏的所屬用戶爲root也沒事兒,不影響。ls/etc/init.d/(無mysqld)
cp support-files/mysql.server /etc/init.d/mysqld
ll/etc/init.d/mysqld
chkconfig--addmysqld(爲系統增加mysql服務)chkconfig--listmysqld(看看默認是否會啓用,3,4,5是“on”狀態即可)
下面添加mysql配置文件:
安裝包給我們提供的也有配置文件,也在support-files下
mv/etc/my.cnf/etc/my.cnf.bak將原來的配置文件重命名(讓它不起作用)
service mysqld start
netstat-tnlp
發現3306已啓動
ls/usr/local/mysql/bin/發現客戶端已安裝
vim/etc/profile.d/mysql.sh
寫入:export PATH=$PATH:/usr/local/mysql/bin
註銷root重新登錄
mysql(即可進入mysql)\q退出mysql。
爲保證在一定條件能正確使用mysql庫文件,就要將mysql庫文件輸出。將mysql庫文件輸出的方法如下:
vim /etc/ld.so.conf.d/mysql.conf添加如下內容
/usr/local/mysql/lib
ldconfig -v使其生效
同時應將mysql的include也在/usr/include/下做個鏈接,確保完美運行。方法如下:
ln -sv /usr/local/mysql/include /usr/include/mysql
ls /usr/include/mysql/
補充個小知識:
CentOS系統中那麼忘記了mysql的登錄密碼,怎麼辦?使用安全模式吧.
首先需要在CentOS系統中停止mysql:
#service mysqld stop
#/usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
下面在CentOS系統繼續輸入:
msql> mysql -u root -p
下面的密碼直接鍵入回車即可.
下面既是在CentOS系統重新設置密碼:
mysql> update mysql.user set password=password("新密碼") where user="root";
刷新權限
mysql>flush privileges;
退出
mysql>exit;
啓動mysql,繼續以往的登錄動作即可.
# /rc.d/init.d/mysqld start
重啓如果提示:
2017-08-27T14:33:49.450752Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
需要使用 ]# ps aux |grep mysql* 查看有沒有mysqld_safe相關的進程,有就使用kill -9 進程號
# mysql -u root -p
進去mysql裏面如果提示密碼簡單,那就在myslq命令行重新設置下密碼>SET PASSWORD=PASSWORD('123456');即可
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)編譯安裝apr-1.5.0.tar.bz2
]# tar xvjf apr-1.5.0.tar.bz2
]# cd apr-1.5.0
]# ./configure --prefix=/usr/local/apr
]# make && make install
2)編譯安裝apr-util-1.5.2.tar.bz2
]# tar xjf apr-util-1.5.2.tar.bz2
]# cd apr-util-1.5.2
]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
]# make && make install
3)編譯安裝pcre-8.38.tar.gz
]# tar xzf pcre-8.38.tar.gz
]# cd pcre-8.38
]# ./configure --prefix=/usr/local/pcre
]# make && make install
4)創建系統組和用戶
#] groupadd -r apache
#] useradd -r -g apache apache
編譯安裝httpd
]# tar xjf httpd-2.4.9.tar.bz2
]# cd httpd-2.4.9
]# ./configure --prefix=/usr/local/apache \
> --sysconfdir=/etc/httpd \ # 指定配置文件路徑
> --enable-so \ # 支持動態加載DSO模塊
> --enable-ssl \ # 開啓SSL功能,支持https
> --enable-cgi \ # 啓用與外部應用程序的cgi接口功能
> --enable-rewrite \ # 支持url重寫
> --with-zlib \ # 支持web頁面壓縮傳送
> --with-pcre=/usr/local/pcre \ # 增強型的正則表達式分析工具,nginx等程序依賴,依賴於pcre-devel開發包
> --with-apr=/usr/local/apr \ # 指定高版本apr程序路徑,不指定則會自動指定系統默認版本
> --with-apr-util=/usr/local/apr-util \ # 指定apr-util路徑
> --enable-mpms-shared=all \ # 支持動態裝卸載所有mpm
> --with-mpm=prefork \ # mpm默認使用prefork
> --enable-modules=all # all爲安裝所有模塊,most爲安裝常用模塊(安裝不代表啓用)
]# make && make install
5)配置虛擬主機
我們需要對www1.stuX.com的狀態信息網頁進行用戶訪問控制:
創建虛擬用戶]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd status(status用戶)
查看編譯有沒有狀態信息模塊:
]# ls /usr/local/apache/modules/ |grep mod_status
我們需要在網頁查看apache的狀態信息,apache狀態信息模塊是默認開啓的
]# vim /etc/httpd24/httpd.conf
LoadModule status_modulemodules/mod_status.so
或者在如下虛擬機配置中添加也可以
6)修改配置文件vim /etc/httpd/httpd.conf
7)配置服務,cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
重啓apache服務 service restart httpd
8)訪問結果
安全訪問
5、爲第4題中的第2個虛擬主機提供https服務,使得用戶可以通過https安全的訪問此web站點;
(1)要求使用證書認證,證書中要求使用的國家(CN)、州(HA)、城市(ZZ)和組織(MageEdu);
(2)設置部門爲Ops,主機名爲www2.stuX.com,郵件爲[email protected];
1、生成一個自簽署證書
1)先查看有沒有安裝openssl,rpm -ql openssl
2)切換到cd /etc/pki/CA ,然後運行 (umask 0755; openssl genrsa -out private/cakey.pem 2048)
爲CA服務器建立一個自己的簽名證書
在安裝有apache服務的也安裝個CA證書,在/etc/httpd/目錄下創建ssl目錄
如上圖中,簽名後CA目錄發生變化,其中serial內容由01變成02
添加httpd中ssl配置
]# vim /etc/httpd/conf.d/httpd_ssl.conf #編輯ssl配置文件
LoadModule ssl_module modules/mod_ssl.so #添加需要加載的模塊
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
ServerName www2.stuX.com
DocumentRoot "/vhosts/www2.stuX.com"
<Directory "/vhosts/www2.stuX.com">
<RequireAll>
Require all granted
</RequireAll>
</Directory>
SSLCertificateFile "/etc/httpd/ssl/httpd.crt" #定義證書文件路徑
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key #定義證書文件私鑰
6、在LAMP架構中,請分別以php編譯成httpd模塊形式和php以fpm工作爲獨立守護進程的方式來支持httpd,列出詳細的過程
1.編譯安裝php
1)#] tar xjf php-5.4.26.tar.bz2 解壓
2)配置 #] cd php-5.4.26
[root@www php-5.4.26]# ./configure --enable-opcache --prefix=/etc/local/php \
> --with-config-file-path=/usr/local/php/etc \
> --with-mysql=/usr/local/mysql \
> --with-mysqli=/usr/local/mysql/bin/mysql_config \
> --enable-mbstring=all \
> --with-pdo-mysql \
> --enable-sockets \
> --enable-mbstring \
> --enable-fpm \
> --with-curl \
> --with-iconv-dir=/usr/local \
> --with-freetype-dir \
> --with-jpeg-dir \
> --with-png-dir \
> --with-zlib \
> --enable-xml \
> --with-gd \
> --with-libxml-dir=/usr \
> --with-openssl \
> --with-iconv
我這裏編譯報錯libxml2沒有找到,可以使用yum install libxml2-devel -y 即可解決,
一般報錯某某包沒有找到,就使用yum install xxx.devel -y安裝即可(xxx代表提示沒有安裝的)
]# make && make install
[root@localhost php-5.4.26]# cp /opt/php-5.4.26/php.ini-development /etc/local/php/etc/php.ini
[root@localhost php-5.4.26]# cd /etc/local/php/etc/
[root@localhost etc]# ls
pear.conf php-fpm.conf.default php.ini
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
]# vim /etc/httpd/httpd.conf #編輯配置文件,添加下面三行使httpd支持php
DirectoryIndex index.php index.html
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
2.php編譯fpm模式
]#./configure –prefix=/usr/local/php5 –with-mysql=mysqlnd –with-openssl
–with-mysqli=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-mcrypt –with-config-file-path=/etc
–with-config-file-scan-dir=/etc/php.d –with-bz2
]# make && make install
]# cp php.ini-production /etc/php.ini #拷貝配置文件至/etc目錄
]# cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf
]# vim /usr/local/php5/etc/php-fpm.conf
pid = /usr/local/php5/var/run/php-fpm.pid #取消pid選項的註釋
]# cp init.d.php-fpm /etc/rc.d/init.d/php-fp #添加服務腳本
]# chmod +x /etc/rc.d/init.d/php-fpm
]# chkconfig –add php-fpm
]# service php-fpm start #啓動php-fpm
]# vim /etc/httpd/httpd.conf
LoadModule proxy_module modules/mod_proxy.so #啓用這兩個模塊
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
AddType application/x-httpd-php .php #添加文件類型
AddType application/x-httpd-php-source .phps
ProxyRequests Off #添加php文件的訪問通過fpm
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache24/htdocs/$1