linux第九周微職位

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

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

  1. 創建TCP鏈接mysql

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

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

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

  3. Web瀏覽器發送請求頭信息 正則表達式

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

  4. Web服務器應答 數據庫

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

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

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

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

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

  7. Web服務器關閉TCP鏈接 

      通常狀況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP鏈接,而後若是瀏覽器或者       服務器在其頭信息加入了這行代碼:Connection:keep-alive;

      TCP鏈接在發送後將仍然保持打開狀態,因而,瀏覽器能夠繼續經過相同的鏈接發送請求。保持鏈接       節省了爲每一個請求創建新鏈接所需的時間,還節約了網絡帶寬。

二、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類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又容許它釋放。這樣加強了高併發場景下的請求處理能力。


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

一、編譯安裝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


二、編譯安裝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進行安裝

三、編譯安裝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');便可



四、創建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

五、爲第4題中的第2個虛擬主機提供https服務,使得用戶能夠經過https安全的訪問此web站點;

(1)要求使用證書認證,證書中要求使用的國家(CN)、州(HA)、城市(ZZ)和組織(MageEdu);

(2)設置部門爲Ops,主機名爲www2.stuX.com,郵件爲admin@stuX.com;

一、生成一個自簽署證書

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        #定義證書文件私鑰


六、在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

相關文章
相關標籤/搜索