linux第九周微職位

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

HTTP通信機制是在一次完整的HTTP通信過程中,Web瀏覽器與Web服務器之間將完成下列7個步驟:

  1. 建立TCP連接

    在HTTP工作開始之前,Web瀏覽器首先要通過網絡與Web服務器建立連接,該連接是通過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,因此Internet又被稱作是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議建立之後才能進行更高層協議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號是80;

  2. Web瀏覽器向Web服務器發送請求命令 

    一旦建立了TCP連接,Web瀏覽器就會向Web服務器發送請求命令。例如:GET/sample/hello.jsp HTTP/1.1;

  3. Web瀏覽器發送請求頭信息 

    瀏覽器發送其請求命令之後,還要以頭信息的形式向Web服務器發送一些別的信息,之後瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。

  4. Web服務器應答 

    客戶機向服務器發出請求後,服務器會客戶機回送應答, HTTP/1.1 200 OK ,應答的第一部分是協議的版本號和應答狀態碼;

  5. Web服務器發送應答頭信息 

    正如客戶端會隨同請求發送關於自身的信息一樣,服務器也會隨同應答向用戶發送關於它自己的數據及被請求的文檔;

  6. Web服務器向瀏覽器發送數據

    Web服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此爲結束,接着,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據;

  7. 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代表提示沒有安裝的)

wKiom1miQ7Wx2XGwAAAnJnR5BYI844.png

如上圖提示錯誤:解決辦法如下

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

wKiom1miinGAU7kMAABS-XFZr_k802.jpg

或者在如下虛擬機配置中添加也可以

wKioL1miffjwxa-xAABZKWcD_6E643.jpg

6)修改配置文件vim /etc/httpd/httpd.conf 

wKiom1mif3ew2cgmAAA_Xw6mEz0498.jpg

7)配置服務,cp /usr/local/apache/bin/apachectl /etc/init.d/httpd

重啓apache服務 service restart httpd

8)訪問結果

wKioL1migRDiiboyAAA58c2tOdo326.jpg

wKiom1migSCgTmykAAAzd6r52uY085.jpg


安全訪問


wKioL1mihe7jE2fRAABlQSyIq0U703.jpg

wKioL1mijVLwXdJWAAEYb_YhKsU785.jpg

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)

wKiom1mioVmxjHmuAACDoNyYD0s392.jpg

爲CA服務器建立一個自己的簽名證書

wKioL1miodTygTAjAABlqRUQkiU005.jpg

在安裝有apache服務的也安裝個CA證書,在/etc/httpd/目錄下創建ssl目錄

wKioL1mio7ywHqloAACZ-Wwgj5E084.jpg然後在CA服務器上把客戶端的發送過來的證書進行簽名

wKiom1mipgzCQTk0AACAzgfT4K0898.jpg

wKioL1mipx3QjjCzAABshDFjDcU399.jpg如上圖中,簽名後CA目錄發生變化,其中serial內容由01變成02


wKiom1miqHbivP2GAABKrUClcME953.jpgwKiom1miqVHxVd7cAACCM40u0Dk334.jpgwKiom1miqf7T14OsAAAYJlqKiPs922.jpg

添加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

wKioL1mivSKwNNJQAAAa09FKFR0155.jpg

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










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章