LAMP之二(PHP-FPM)

linux+httpd+php-fpm+mysqlphp

rpm包的安裝方式html


環境:mysql

系統: CentOS Linux release 7.1.1503 (Core)linux

yum源:epel,cdromweb

主機:sql

httpd
172.16.40.40
php-fpm
172.16.40.41
mysql
172.16.40.42

目的:
數據庫

一、三臺主機實現httpd、php和mysql服務。
二、httpd提供兩個虛擬主機,一個虛擬主機提供phpMyAdmin,另外一個虛擬主機提供wordpress。
三、爲php安裝xcache。apache

四、添加status頁面(包含php的),並使用用戶認證。vim

wKiom1agwq-AKiIlAABb4DA-fWo342.jpg

目錄:後端

1、httpd

2、php

3、mysql

4、安裝phpMyadmin和wordpress

5、添加status頁面。


全部主機selinux,iptables關閉狀態。


1、httpd.

[root@localhost ~]# yum install httpd -y
[root@localhost ~]# mkdir -pv /web/vhosts/{blog,phpmyadm}
[root@localhost ~]# mkdir -pv /var/log/httpd/{blog,phpmyadm}
[root@localhost ~]# cd /etc/httpd
[root@localhost httpd]# vim conf/httpd.conf 
#DocumentRoot "/var/www/html"                #關閉中心主機
DirectoryIndex index.php index.html          #修改默認文檔查找次序

添加虛擬主機:

[root@localhost httpd]# vim conf.d/vhosts.conf

<VirtualHost *:80>
        ServerName www.star.com
        DocumentRoot /web/vhosts/blog
        CustomLog "/var/log/httpd/blog/access_log" combined
        ErrorLog "/var/log/httpd/blog/error_log"
        <Directory "/web/vhosts/blog">
                Options None
                Require all granted
        </Directory>
</VirtualHost>

<VirtualHost *:80>
        ServerName myadm.star.com
        DocumentRoot /web/vhosts/phpmyadm
        CustomLog "/var/log/httpd/phpmyadm/access_log" combined
        ErrorLog "/var/log/httpd/phpmyadm/error_log"
        <Directory "/web/vhosts/phpmyadm">
                Options None
                Require all granted
        </Directory>
</VirtualHost>

來兩個網頁文件測試下:

[root@localhost httpd]# vim /web/vhosts/phpmyadm/index.html
<h1>myadm.star.com</h1>
[root@localhost httpd]# vim /web/vhosts/blog/index.html
<h1>www.star.com</h1>
[root@localhost httpd]# systemctl restart httpd

測試沒問題。

指定.php頁面的處理方式。

[root@localhost httpd]# vim conf/httpd.conf 
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

wKiom1ag3V_BEa8VAABqcQu-6Xg086.jpg


修改vhosts.conf文件

ProxyRequests Off  #關閉正向代理

<VirtualHost *:80>
        ServerName www.star.com
        DocumentRoot /web/vhosts/blog
        CustomLog "/var/log/httpd/blog/access_log" combined
        ErrorLog "/var/log/httpd/blog/error_log"
        ProxyPassMatch ^/(.*\.php)$     fcgi://172.16.40.41:9000/web/php/blog/$1  #匹配頁面代理至後端。
        <Directory "/web/vhosts/blog">
                Options None
                Require all granted
        </Directory>
</VirtualHost>

<VirtualHost *:80>
        ServerName myadm.star.com
        DocumentRoot /web/vhosts/phpmyadm
        CustomLog "/var/log/httpd/phpmyadm/access_log" combined
        ErrorLog "/var/log/httpd/phpmyadm/error_log"
        ProxyPassMatch ^/(.*\.php)$     fcgi://172.16.40.41:9000/web/php/phpmyadm/$1
        <Directory "/web/vhosts/phpmyadm">
                Options None
                Require all granted
        </Directory>
</VirtualHost>
[root@localhost httpd]# systemctl reload httpd

注意上面傳給php的路徑不用與本地httpd的路徑相同。只要在那個路徑能夠找到應該找到的php文件便可。

只要是php文件,都會轉給php-fpm服務器。而其它靜態資源都會由httpd來響應。因此這是兩臺相互獨立的服務器(資源也是獨立的)。 不過由於咱們這裏的應用也不必再把資源切分開,因此就直接複製到php主機一份了。

只不過在httpd主機上只會拿這個應用中的靜態資源。 在php上只會拿php資源。


2、php

[root@localhost ~]# yum install php-fpm php-mysql
[root@localhost ~]# rpm -ql php-fpm
/etc/logrotate.d/php-fpm         #日誌滾動配置
/etc/php-fpm.conf                #php-fpm主配置文件
/etc/php-fpm.d                      #
/etc/php-fpm.d/www.conf          #附加配置文件
/etc/sysconfig/php-fpm
/run/php-fpm
/usr/lib/systemd/system/php-fpm.service    #unit文件(啓動服務文件)
/usr/lib/tmpfiles.d/php-fpm.conf
/usr/sbin/php-fpm               
.....

/etc/php.ini是由php-common包帶的。

php.ini是php解釋器環境的配置,通常不用管。

php-fpm配置文件纔是來管理php-fpm進程的。

修改/etc/php-fpm.d/www.conf

;listen = 127.0.0.1:9000
listen = 172.16.40.41:9000        #監聽端口, 必須修改

;listen.allowed_clients = 127.0.0.1
listen.allowed_clients = 172.16.40.40    #容許172.16.40.40主機fcgi鏈接。必須修改

user = apache                                           #進程運行用戶,默認。
group = apache
pm = dynamic                                           #動態生成子進程方式
pm.max_children = 50                            #最大子進程
pm.start_servers = 5                                #服務剛啓動時生成幾個子進程
pm.min_spare_servers = 5                      #最少空閒子進程,進程空閒時會慢慢回收,這是最低要保留子進程數。
pm.max_spare_servers = 35                   #最大空閒子進程。上限。
;pm.max_requests = 500                          #每一個子進程最多響應多少個請求。超過請求,此子進程回收。

;pm.status_path = /status                         #只要訪問指定的路徑,就返回狀態信息。狀態模塊

;ping.path = /ping                                      #提供ping模塊,用來遠程檢測php是否在線。訪問指定的路徑,返回ping.response指定的值。
;ping.response = pong                              #與png.path成對出現。   

php_admin_flag = on                                #php日誌中與管理相關的標誌是否打開。

php_value[session.save_handler] = files                                    #session存儲方式
php_value[session.save_path] = /var/lib/php/session             #session存儲路徑

上面只有兩個地址修改了,其它的都是默認值,看狀況修改吧。

建立測試文件:

[root@localhost ~]# mkdir /web/php/{blog,phpmyadm} -pv
[root@localhost ~]# vim /web/php/blog/index.php

<h1>www.star.com</h1>
<?php
        phpinfo();
?>

[root@localhost ~]# vim /web/php/phpmyadm/index.php 

<h1>myadm.star.com</h1>
<?php
        phpinfo();
?>

啓動php-fpm.

[root@localhost ~]# systemctl start php-fpm

訪問http://myadm.star.com/index.php

wKiom1ag702SZAHUAAA1G8eyCnA047.jpg

另外一個也正常。


xcache:

安裝環境:

[root@localhost php]# yum install php-devel

xcache目錄:

[root@localhost xcache-3.2.0]# phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
[root@localhost xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/bin/php-config
[root@localhost xcache-3.2.0]# make
[root@localhost xcache-3.2.0]# make install
Installing shared extensions:     /usr/lib64/php/modules/
[root@localhost xcache-3.2.0]# cp xcache.ini /etc/php.d/
[root@localhost xcache-3.2.0]# systemctl restart php-fpm

現來查看網頁,我這裏已現加載xcache了。也能夠用php-fpm -m命令來查看php-fpm加載的全部模塊。

[root@localhost xcache-3.2.0]# php-fpm -m
.....
XCache
XCache Cacher
xml
zip
zlib

[Zend Modules]
XCache
XCache Cacher



3、MySQL

安裝:

[root@localhost ~]# yum install mariadb-server

受權wordpress(phpMyadmin不用受權):

MariaDB [(none)]> CREATE DATABASE wordpress;
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> GRANT ALL ON wordpress.* TO 'wpuser'@'172.16.40.41' IDENTIFIED BY 'abcdefg';
Query OK, 0 rows affected (0.00 sec)


4、安裝phpMyAdmin和wordpress.

httpd:

[root@localhost ~]# cp -rf phpMyAdmin-4.4.15.2-all-languages/* /web/vhosts/phpmyadm/
[root@localhost ~]# cp wordpress/* /web/vhosts/blog/ -rf


php-fpm:

[root@localhost ~]# rm -rf /web/php/phpmyadm/*
[root@localhost ~]# rm -rf /web/php/blog/*
[root@localhost ~]# cp -rf phpMyAdmin-4.4.15.2-all-languages/* /web/php/phpmyadm/
[root@localhost ~]# cp -rf wordpress/* /web/php/blog/
[root@localhost blog]# pwd
/web/php/blog
[root@localhost blog]# cp wp-config-sample.php wp-config.php
[root@localhost blog]# vim wp-config.php

wKiom1ag982BkkO2AABARi2I-rw372.jpg


phpMyadmin:

[root@localhost blog]# cd ../phpmyadm/
[root@localhost phpmyadm]# cp config.sample.inc.php config.inc.php
[root@localhost phpmyadm]# openssl rand -base64 15     #生成隨機碼
EumYt+cNhpOquCvJ1mRN 
[root@localhost phpmyadm]# vim config.inc.php

wKiom1ag-CriaJ_DAACRNXm8ibA550.jpg


填上隨機碼,和目標數據庫。


訪問:www.star.com/

wKiom1anFxPD6HwXAABir03CxJg557.png

wKiom1anF3zBMiJeAABPKtplwf8504.png



訪問:http://myadm.star.com/

wKioL1anGH7hnPHiAAA0m2pVgfM638.png

php主機安裝php-string:

[root@localhost phpmyadm]# yum install php-mbstring

從新加載php配置文件:

[root@localhost phpmyadm]# systemctl reload php-fpm

wKioL1anGQjytF4vAAA4cnx6IrE451.png

不能保存session會話。查看一下運行php-fpm的用戶。

[root@localhost phpmyadm]# ps aux | grep php-fpm

查看配置文件中所指定的session保存位置,用戶是否有寫入權限。

php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session

查看一下所指向的文件:

[root@localhost ~]# ll /var/lib/php
total 0

沒有session目錄,建立目錄,並給於運行php-fpm用戶寫入權限。

[root@localhost ~]# mkdir /var/lib/php/session
[root@localhost ~]# chown -R apache /var/lib/php/session/

wKioL1anHA7wJpCLAABtyF0R01o199.png



對了,咱們這裏尚未建立用於遠程登陸的root用戶。先試一下用wpuser用戶吧。

wKiom1anHRfhU7T8AAAj2y0eteo961.png

wKioL1anHVfxx5kuAAEPHq-HzJM900.png


建立用戶要建立基於php主機IP登陸的。由於是php程序發起的鏈接,而不是咱們。


5、添加status頁面。

一、確認模塊是否加載。

[root@localhost httpd]# pwd
/etc/httpd
[root@localhost httpd]# vim conf.modules.d/00-base.conf
LoadModule status_module modules/mod_status.so

[root@localhost conf.d]# httpd -M                #查看當前加載的動態模塊。

status模塊,會顯示httpd總體的狀態,不管是把指令寫在虛擬主機裏面仍是外面,只要觸發就會顯示總體服務的狀態。

因此能夠創建個新的配置文件,也能夠寫到虛擬主機的裏面,只是寫虛擬主機裏面的話只有訪問對應的主機名才能返回狀態頁。

[root@localhost httpd]# vim conf.d/status.conf

<Location ~ "/status">
        SetHandler server-status
        Require all granted
</Location>
[root@localhost httpd]# systemctl reload httpd

wKioL1anJNaxZMiAAABvU1iNUhY609.png

我這裏用IP地址訪問的,用主機名也是同樣,它如今是公共配置。

可是如今的配置全部人均可以查看,並且用IP控制也不保險。那麼就能夠用用戶名控制了。


首先建立用戶和密碼文件。

htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username
-c:自動建立此處指定的文件,所以,僅應該在此文件不存在時使用;
-m:md5格式加密
-s: sha格式加密
-D:刪除指定用戶


我這裏就在/etc/httpd/conf下面建立了。

[root@localhost conf]# htpasswd -c -m .htpasswd star
New password: 
Re-type new password: 
Adding password for user star
[root@localhost conf]# htpasswd -m .htpasswd tom
New password: 
Re-type new password: 
Adding password for user tom

只有第一次建立文件要用到-c。

[root@localhost conf]# cat .htpasswd 
star:$apr1$vq6uL8/A$c7agaUbQOoBd9Lkj8xrCW.
tom:$apr1$Iawy2r6d$wonFrBM4yIEgBPUwY0ktU/
jerry:$apr1$vdpkCLQV$HSJShQU0yvjna75T8hXqK/
[root@localhost conf]#

若是用戶有不少還能夠有組文件。手動建立就能夠。文件中一行一組。

格式:

group: user1 user2

group2: user1 user 2

[root@localhost conf]# vim .htgroup
mygrp: star tom
grp: jerry zhangsan


修改配置文件:conf.d/status.conf

<Location ~ "/status">
        SetHandler server-status
        AuthType Basic
        AuthName "Enter your Access"
        AuthUserFile "conf/.htpasswd"
        AuthGroupFile "conf/.htgroup"
        Require Group mygrp
</Location>

重載服務。 再來看看。此次訪問www.star.com

wKioL1anKunhWVdyAABMSHO8-Rs213.png

jerry用戶在grp組裏,不能登陸。 只有star和tom能夠登陸。

若是想再加上IP控制的話,就要用上訪問控制的容器了。

只要指令有兩條,都要放到容器裏(包括兩個IP的或一IP一用戶的)

這樣就只有IP是容許的狀況下才能夠到用戶名的部分,
若是ip是拒絕的,根本就不會到用戶名的部分。

這裏不論是用戶仍是IP都是認證。是統一的。因此就算是在上級目錄裏是IP是拒絕的。
在當前的級別只要用戶名能夠經過也是能夠訪問的。
只有真和假的兩種狀況,不論是哪一種認證。
而RequireAll這種容器就是爲了把裏面的多種或多個認證綜合成一個真或假。

注意:必定要加容器,這樣它們都會判斷,而不會發生IP經過,就不判斷用戶的狀況了。

仍是剛纔的配置文件。

<Location ~ "/status">                        #不加~只能是根目錄/status。加上~會來匹配,路徑不是根目錄也不要緊。
        SetHandler server-status
        <RequireAll>
                AuthType Basic                                            #驗證類型,也能夠用digest,不過瀏覽器並不通用。
                AuthName "Enter your Access"                #提示給客戶端的信息。
                AuthUserFile "conf/.htpasswd"                 #存儲用戶名的文件
                AuthGroupFile "conf/.htgroup"                 #存儲組的文件
                Require group mygrp                                  #容許的組
                Require ip 172.16.40.2                                #ip控制,只容許172.16.40.2
        </RequireAll>
</Location>

若是不用組的話,能夠不寫AuthGroupFile,把Requre group 改成Require user便可。Require  valid-user表示文件中的全部用戶。


我這開網頁的主機IP是172.16.40.1。如今打不開了。

wKiom1anLK_BCwZmAAAt4EgC-IQ114.png

改回只讓我這臺主機訪問:

Require ip 172.16.40.1

如今又出來讓輸入用戶碼的窗口了。可是這樣咱們的密碼只是簡單的md5加密傳輸的。

wKioL1anMIKyHmC5AAARlnuAPyY236.png

或是用抓包工具均可以抓到,就算破解不了,但cookie倒是不加密的。


其實這裏想告訴你們,在一些沒有https的網站的表單中填入的密碼和傳輸的信息其實都是明文傳輸的,連md5加密都沒有。要注意密碼安全。如咱們上面登陸phpMyadmin的時候


我這裏用tcpdump抓一下包看看。

star@sst-pp:~/desktop$ sudo tcpdump -X -nn dst host 172.16.40.40 and port 80 -w /tmp/myadm

用vim打開/tmp/myadm搜索user打一下。

wKiom1anPAzCI0_wAAAMuavnt_I898.png

還記得上面咱們所輸入的數據庫的數據嗎。若是是root用戶,你懂的。因此用https是必須的。

上一篇已經寫了,並且基本也都同樣。而不在同一臺主機的CA也只是遠程複製一下文件而已。


php的status

咱們如今的httpd只有.php的頁面會向後轉發,其它頁面是不會轉發的,因此要把php上面的pm.status_path = /status  改一下。若是改爲.php就直接可用了。並且由於咱們上面httpd狀態頁是用~匹配status的,因此也會區配到那個Location裏面,也要經過認證。

而sethandler那裏,我以爲可能過程是:

一、sethandler指令,開始準備數據,生成html文件。

二、數據接着執行,到達虛擬主機那裏,由於是.php的文件,因此轉發到php主機上面。

三、php主機生成數據,html文件。 傳給httpd。

四、httpd上面原來由sethandler生成的數據就被新的數據所覆蓋了。


注意:沒有寫在虛擬主機裏面的是公共部分,在數據到達虛擬主機以前都是會過一遍的。
遇到指令就操做一次。 就好像在有各類機關的房間裏面通過同樣,最終還要再進入不一樣的門。

wKioL1anS06ClJtDAABbWUND6DU649.png


而若是不想用.php這種方式,就要再添加個轉發了。如我這裏想用status-php,如今的status.conf文件。

<Location "/status">
        SetHandler server-status
        <RequireAll>
                AuthType Basic
                AuthName "Enter your Access"
                AuthUserFile "conf/.htpasswd"
                AuthGroupFile "conf/.htgroup"
                Require group mygrp
                Require ip 172.16.40.1
        </RequireAll>
</Location>

ProxyPassMatch ^/status-php$     fcgi://172.16.40.11:9000       #添加一個轉發。轉發只能寫在主服務器或虛擬主機裏。
<Location "/status-php">                                                         #加上用戶認證。
        <RequireAll>
                AuthType Basic
                AuthName "Enter your Access"
                AuthUserFile "conf/.htpasswd"
                AuthGroupFile "conf/.htgroup"
                Require group grp
                Require ip 172.16.40.1
        </RequireAll>
</Location>


php裏面改一下:

pm.status_path = /status-php

wKiom1aotUezi4AJAABrLCvjEVU017.png





這裏再貼一下CA的過程。

私有CA:

ca的配置文件:/etc/pki/tls/openssl.cnf  在lamp1中已經介紹了,這裏就很少說了。

當前目錄:/etc/pki/CA

[root@localhost CA]# (umask 077;openssl genrsa -out private/cakey.pem 4096)    #生成CA的私鑰:
[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem    #生成自簽證書,也作根證書,證書鏈
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BEIJING
Locality Name (eg, city) [Default City]:BEIJING
Organization Name (eg, company) [Default Company Ltd]:LinuxOPS
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.star.com
Email Address []:
[root@localhost CA]# 
[root@localhost CA]# touch serial
[root@localhost CA]# echo 00 > serial 
[root@localhost CA]# touch index.txt


HTTPD:

[root@localhost httpd]# pwd
/etc/httpd
[root@localhost httpd]# mkdir ssl
[root@localhost httpd]# (umask 077;openssl genrsa -out ssl/myadm.key 2048)      #生成私鑰
Generating RSA private key, 2048 bit long modulus
..........................................................................................+++
............................+++
e is 65537 (0x10001)
[root@localhost httpd]# openssl req -new -key ssl/myadm.key -out /tmp/myadm.csr     #生成證書申請
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BEIJING
Locality Name (eg, city) [Default City]:BEIJING
Organization Name (eg, company) [Default Company Ltd]:LinuxOPS
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:myadm.star.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

把證書申請發給CA。

[root@localhost httpd]# scp /tmp/myadm.csr 172.16.40.20:/tmp/
root@172.16.40.20's password: 
myadm.csr                                                  100% 1009     1.0KB/s   00:00    
[root@localhost httpd]#

若是沒有scp命令,要安裝openssh-clients包。兩邊都要有這個命令。


CA:

ca簽署:

[root@localhost CA]# openssl ca -in /tmp/myadm.csr -out certs/myadm.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 0 (0x0)
        Validity
            Not Before: Jan 26 09:38:33 2016 GMT
            Not After : Jan 25 09:38:33 2017 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = BEIJING
            organizationName          = LinuxOPS
            organizationalUnitName    = Ops
            commonName                = myadm.star.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                9D:FD:70:BD:97:BB:BB:E4:61:55:7B:6C:BA:B2:FD:B6:93:DC:8E:EC
            X509v3 Authority Key Identifier: 
                keyid:AA:DA:31:1A:3F:5B:F3:D5:D2:0C:93:4E:37:78:9B:38:E6:C8:FB:26

Certificate is to be certified until Jan 25 09:38:33 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@localhost CA]#

把證書傳回給HTTPD:

[root@localhost CA]# scp certs/myadm.crt  172.16.40.40:/etc/httpd/ssl/
The authenticity of host '172.16.40.40 (172.16.40.40)' can't be established.
RSA key fingerprint is ec:8e:a7:90:97:03:2c:e4:78:d8:04:98:7d:9a:59:1c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.40.40' (RSA) to the list of known hosts.
root@172.16.40.40's password: 
myadm.crt                                                  100% 5714     5.6KB/s   00:00    
[root@localhost CA]#
相關文章
相關標籤/搜索