linux+httpd+php-fpm+mysql
編譯安裝
環境:
iptables、selinux關閉狀态
系統: CentOS release 6.7 (Final)
yum源:epel,cdrom
軟體:
php-5.6.17
下載下傳頁面:http://php.net/downloads.php
httpd 2.4.18
下載下傳頁面:http://httpd.apache.org/download.cgi#apache24
mariadb 前面有專門編譯的了,這裡就直接yum安裝了。
編譯安裝mariadb5.5: http://fanqie.blog.51cto.com/9382669/1708239
主機:
httpd | 172.16.40.20 |
php-fpm | 172.16.40.21 |
mysql | 172.16.40.22 |

一、http
二、php
三、Mysql(rpm安裝的)
四、安裝phpMydmin和wordpress
五、為phpMyadmin添加https。
一、http:
httpd2.4依賴于apr1.4,而我們系統上面自帶的apr是1.3.9的版本。是以我們要自己來編譯新版本的apr工具。
apr是httpd程式代碼跨平台的基礎。不然還要為各個系統上運作的httpd來編寫不同的庫函數。
提供了一個對httpd統一的環境,而不用再操心為各個系統再編寫适用的底層庫。
網摘:
APR(Apache portable Run-time
libraries,Apache可移植運作庫)主要為上層的應用程式提供一個可以跨越多作業系統平台使用的底層支援接口庫。在早期
的Apache版本中,應用程式本身必須能夠處理各種具體作業系統平台的細節,并針對不同的平台調用不同的處理函數。
apr下載下傳位址(apr、apr-utils):
http://apr.apache.org/download.cgi
http://mirrors.hust.edu.cn/apache//apr/apr-1.5.2.tar.gz
http://mirrors.hust.edu.cn/apache//apr/apr-util-1.5.4.tar.gz
這裡是新裝的系統,缺少開發工具和開發庫。簡單點可以直接安裝開發包組。
yum groupinstall "Development tools" #開發工具
yum groupinstall "Server Platform Development" #伺服器開發庫
apr:
[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.5.2]# make
[root@localhost apr-1.5.2]# make install
apr-utils:
[root@localhost apr-util-1.5.4]# ./configure --prefix=/usr/local/apr/ --with-apr=/usr/local/apr
[root@localhost apr-util-1.5.4]# make && make install
httpd:
所依賴的包。
[root@localhost httpd-2.4.18]# yum install pcre-devel openssl-devel -y
pcre 提供perl 相容的正規表達式庫,httpd、php還有nginx中用的都是這種正規表達式。
http://baike.baidu.com/view/3963592.htm
安裝httpd:
[root@localhost httpd-2.4.18]# ./configure --prefix=/usr/local/httpd24 --sysconfdir=/etc/httpd24 --enable-modules=most --enable-so --enable-ssl --enable-mpms-shared=all --enable-cgid --enable-rewrite --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --with-pcre --with-mpm=event
[root@localhost httpd-2.4.18]# make && make install
--prefix=/usr/local/httpd24 #安裝位置
--sysconfdir=/etc/httpd24 #配置檔案位置。
--enable-modules=most #要啟用的子產品,就是會編譯成子產品的, 可不是要自動挂載的。對應的還有:
#--enable-mods-shared 要啟用的共享子產品。
#--enable-mods-static 要啟用的靜态子產品。
--enable-so #啟用動态裝載(DSO)功能。也就是動态裝載子產品的功能。
--enable-ssl #啟用ssl子產品。不知道在上面的most裡面有沒有包括這個,沒有嘗試過。
--enable-mpms-shared=all #各mpm功能以子產品的形式存在。可以通過挂載不同的mpm子產品來使用不同的功能模型。prefork,event,worker
--enable-cgid #cgi腳本功能,這裡要用event模型,線程模型用這個來開啟。非線程模型用--enabl-cgi來開啟。
--enable-rewrite #URL重寫的基本定義規則。可以說就是位址重寫的功能了。
--with-pcre #使用外部的pcre庫。
--with-mpm=event #預設event模型
服務腳本我們可以把系統自帶的http腳本複制一份改一下就可以,也省得麻煩自己寫了。
[root@localhost httpd24]# cp /root/httpd /etc/init.d/httpd24 #我這裡就是從别處複制來的。
[root@localhost httpd24]# chkconfig --add httpd24 #添加進chkconfig控制。
[root@localhost httpd24]# chkconfig httpd24 on #設定開機啟動
[root@localhost httpd24]# chkconfig --list httpd24 #檢視狀态。
httpd24 0:off 1:off 2:on 3:on 4:on 5:on 6:off
修改一下腳本,主要改的也就幾個:
apachectl=/usr/local/httpd24/bin/apachectl
httpd=/usr/local/httpd24/bin/httpd
prog=httpd
pidfile=/var/run/httpd24/httpd.pid #這個路徑也可以直接指到預設的pid所在的位置,安裝目錄的logs/httpd.pid。不然就要在httpd的配置檔案中修改pid檔案所在位置,
lockfile=/var/lock/subsys/httpd24
我這裡的設定,為了用系統上的httpd區分開(有時候可能一些軟體依賴,httpd會自動安裝上的),是以pidfile用了httpd24的目錄。建立所必須的目錄即可。
修改pid檔案位置。添加一條PidFile指令即可。
啟動:
[root@localhost httpd24]# service httpd24 start
Starting httpd: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
[ OK ]
這個錯誤是因為沒有設定ServerName,然後反解IP位址失敗,或者反解名稱與主機名不一樣導緻的。設定上ServerName就可以了。如:
ServerName www.star.com
編譯安裝的2.4個人感覺與rpm安裝還容易配置,配置檔案非常的有條理。用什麼功能,就配置對應的配置檔案就行。
虛拟主機設定:
因為在前二篇裡已經反複寫過兩次配置過程了。這裡就簡略的寫了。
加載子產品,加載子配置檔案。
[root@localhost httpd24]# pwd
/etc/httpd24
[root@localhost httpd24]# vim extra/httpd-vhosts.conf
41 <VirtualHost *:80>
42 ServerName www.star.com
43 DocumentRoot "/web/vhosts/www"
44 CustomLog "/var/log/httpd24/www/access_log" combined
45 ErrorLog "/var/log/httpd24/www/error_log"
46 <Directory "/web/vhosts/www">
47 Options None
48 Require all granted
49 </Directory>
50 </VirtualHost>
51
52
53
54 <VirtualHost *:80>
55 ServerName myadm.star.com
56 DocumentRoot "/web/vhosts/myadm"
57 CustomLog "/var/log/httpd24/myadm/access_log" combined
58 ErrorLog "/var/log/httpd24/myadm/error_log"
59 <Directory "/web/vhosts/myadm">
60 Options None
61 Require all granted
62 </Directory>
63 </VirtualHost>
關閉中心中機,注釋DocumentRoot:
[root@localhost star]# vim /etc/httpd24/httpd.conf
#DocumentRoot "/usr/local/httpd24/htdocs
建立所需目錄:
[root@localhost httpd24]# mkdir /web/vhosts/{www,myadm} -pv
[root@localhost httpd24]# mkdir /var/log/httpd24/{www,myadm} -pv
把httpd的執行檔案添加進PATH變量,也可以用符号連結的方式:
[root@localhost star]# vim /etc/profile.d/httpd24.sh
export PATH=/usr/local/httpd24/bin:$PATH
[root@localhost star]# . /etc/profile.d/httpd24.sh
[root@localhost star]# echo $PATH
/usr/local/httpd24/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
測試并重新開機httpd(重載也可以):
[root@localhost star]# httpd -t
Syntax OK
[root@localhost star]# service httpd24 restart
Stopping httpd: [ OK ]
Starting httpd: [ OK ]
[root@localhost star]#
測試頁面,内容就朋友們自定吧:
[root@localhost star]# vim /web/vhosts/www/index.html
[root@localhost star]# vim /web/vhosts/myadm/index.html
本地測試可以在hosts檔案中添加主機名來完成域名解析:
windows主機在system32/driver/etc/hosts檔案中修改
linux主機在/etc/hosts中。
如我這裡的:
star@sst-pp:/mnt/g/soft$ sudo vim /etc/hosts
.....
172.16.40.20 www.star.com myadm.star.com
.....
測試沒有問題,html服務工作正常 。
現在我們再添加反向代理的條目,php頁面都代理至後端的php伺服器。并且在DirectoryIndex後面加入預設文檔index.php。我們測試這裡首頁面都是php的,是以要在index.html前面。
主配置檔案啟用代理子產品,有兩個, 一個是總代理子產品,一個是fcgi功能子產品。
[root@localhost httpd24]# pwd
/etc/httpd24
[root@localhost httpd24]# vim httpd.conf
添加代理指令:
現在的httpd-vhosts配置檔案:
AddType application/x-httpd-php .php #添加或覆寫mime類型。
#現在.php的mime就是application/x-httpd-php。 主類型/次類型
ProxyRequests Off #關閉正向代理
<VirtualHost *:80>
ServerName www.star.com
DocumentRoot "/web/vhosts/www"
CustomLog "/var/log/httpd24/www/access_log" combined
ErrorLog "/var/log/httpd24/www/error_log"
ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.40.21:9000/web/php/www/$1 #代理至
<Directory "/web/vhosts/www">
Options None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName myadm.star.com
DocumentRoot "/web/vhosts/myadm"
CustomLog "/var/log/httpd24/myadm/access_log" combined
ErrorLog "/var/log/httpd24/myadm/error_log"
ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.40.21:9000/web/php/myadm/$1 #代理至
<Directory "/web/vhosts/myadm">
Options None
Require all granted
</Directory>
</VirtualHost>
上面的AddType定義mime,可以把反向代理關閉以後,在浏覽器中打開一個.php頁面試一下。
不過因為浏覽器無法識别此mime,是以會下載下傳此檔案。
擴充一點:浏覽器能做的就是隻顯示文本而已,而其它的資料都是通過mime類型來加載對應的插件或軟體來處理的。
預設文檔:
dir子產品預設都是啟用的,是以裡面的指令是生效的。
[root@localhost httpd24]# service httpd24 reload
Reloading httpd:
[root@localhost httpd24]#
現在預設網頁就已經不能打開了,php給轉到了後端,而後端不會傳回資料。
二、php:
[root@localhost php-5.6.17]# ./configure --prefix=/usr/local/php --enable-fpm --with-fpm-user=php --with-fpm-group=php --with-config-file-path=/etc/ --with-config-file-scan-dir=/etc/php.d/ --with-openssl --with-zlib --with-bz2 --with-jpeg-dir --with-png-dir --enable-mbstring --with-mcrypt --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-sockets --with-freetype-dir
[root@localhost php-5.6.17]# make install
make test 實在是太耗時間了,這裡就不試了。生産環境最好還是跑一下。
報錯資訊:
configure: error: xml2-config not found. Please check your libxml2 installation.
[root@localhost php-5.6.17]# yum install libxml2-devel -y
configure: error: Cannot find OpenSSL's <evp.h>
[root@localhost php-5.6.17]# yum install openssl-devel -y
configure: error: Please reinstall the BZip2 distribution
[root@localhost php-5.6.17]# yum install -y bzip2-devel
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
[root@localhost php-5.6.17]# yum install libmcrypt-devel -y
參數介紹:
--enable-fpm #啟用fpm。 不能與做為httpd子產品的方式并存。也就是--with-apxs2
--with-fpm-user=php #指定程式運作的使用者
--with-fpm-group=php #指定程式運作的使用者組
--with-config-file-path=/etc/ #指定php編譯器環境配置檔案。與php-fpm不一樣。php-fpm隻是提供對外連接配接接口的。編譯器才是真正來編譯php程式的。
--with-config-file-scan-dir=/etc/php.d/ #php編譯器的擴充配置檔案所在目錄。如把對于xcache的配置檔案放在裡面。
--with-openssl #openssl支援。
--with-zlib #zlib是提供資料壓縮用的函式庫。它不能建立gzip壓縮檔案,但可以讀取和在gzip壓縮檔案中寫入資料。
--with-bz2 #bzip2庫函式。可以透明地讀寫 bzip2(.bz2)壓縮檔案。
--with-jpeg-dir #輸出圖象到浏覽器或檔案,動态繪圖功能。
--with-png-dir #也一樣。
--enable-mbstring # 多位元組字元支援,如漢字。
--with-mcrypt #提供多種加密算法支援的庫
--with-mysql=mysqlnd #指定mysql連接配接器,mysqlnd是php内置的連接配接mysql系列資料庫的連接配接器。
--with-mysqli=mysqlnd #指定mysqli連接配接器
-with-pdo-mysql=mysqlnd #指定mysql-pdo連接配接器。
--enable-sockets #啟用socket通迅,BSD-socket。 也就是遠端網絡通信了。本地檔案通信是unix-socket.
--with-freetype-dir #字型引擎。
額外的參數:
--with-apxs2=FILE #編譯成httpd的子產品,指定httpd的apxs工具所在位置。如果在PATH變量中可以找到apxs,後面的FILE可以省略。不過請注意此apxs是否是想要運作的httpd的apxs。
--sysconfdir=DIR #這個是fpm的配置檔案所在位置,一般不用配置,預設在安裝目錄下的etc下。
--with-mhas #基于離散數學原理的不可逆向的php加密方式擴充庫
--enable-zip #透明地讀寫ZIP壓縮文檔以及它們裡面的檔案。現在好像不怎麼用zip壓縮了吧。
編譯核心配置選項清單
http://cn2.php.net/manual/zh/configure.about.php
FPM配置選項
http://cn2.php.net/manual/zh/install.fpm.configuration.php
針對各資料庫系統對應的擴充
http://php.net/manual/zh/refs.database.vendors.php
連接配接器mysql,mysqli,mysql-pdo介紹
http://php.net/manual/zh/mysqli.overview.php
其它資訊可以檢視php手冊或google。
php手冊,可以在右上角搜尋資訊。
http://php.net/manual/zh/index.php
接着來配置我們的php。
php編譯器配置檔案。
[root@localhost php-5.6.17]# cp php.ini-production /etc/php.ini
[root@localhost php-5.6.17]# mkdir /etc/php.d
php-fpm服務腳本。注意這是在php代碼的目錄。
[root@localhost php-5.6.17]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@localhost php-5.6.17]# chmod +x /etc/init.d/php-fpm
[root@localhost php-5.6.17]# chkconfig --add php-fpm
[root@localhost php-5.6.17]# chkconfig php-fpm on
[root@localhost php-5.6.17]# chkconfig --list php-fpm
php-fpm 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉
[root@localhost php-5.6.17]#
注意不要複制錯了,不要複制成init.d.php-fpm.in了,這個檔案是php安裝之前的檔案,而init.d.php-fpm是安裝以後生成的。
fpm配置檔案:
[root@localhost php]# pwd
/usr/local/php
[root@localhost php]# ls
bin etc include lib php sbin var
[root@localhost php]# cd etc
[root@localhost etc]# ls
pear.conf php-fpm.conf.default
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
編輯配置檔案:
[root@localhost etc]# vim php-fpm.conf
listen = 172.16.40.21:9000
listen.allowed_clients = 172.16.40.20
注要就這兩項,其它的暫時也不用修改。
啟動php-fpm:
[root@localhost local]# service php-fpm start
Starting php-fpm [28-Jan-2016 22:58:53] ERROR: [pool www] cannot get uid for user 'php'
[28-Jan-2016 22:58:53] ERROR: FPM initialization failed
failed
額,忘了建立php使用者了。
[root@localhost local]# useradd -r -s /sbin/nologin php
[root@localhost local]# service php-fpm start
Starting php-fpm done
[root@localhost local]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 172.16.40.21:9000 *:*
安裝xcache。
[root@localhost star]# tar -xf xcache-3.2.0.tar.gz
[root@localhost star]# cd xcache-3.2.0
[root@localhost xcache-3.2.0]# /usr/local/php/bin/p
pear peardev pecl phar phar.phar php php-cgi php-config phpize
[root@localhost xcache-3.2.0]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
phpize和php-config工具都是用來為php安裝第三方擴充子產品用的。
缺少autoconf. 用來生成config配置檔案的。
[root@localhost xcache-3.2.0]# yum install autoconf -y
[root@localhost xcache-3.2.0]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20131106
Zend Module Api No: 20131226
Zend Extension Api No: 220131226
[root@localhost xcache-3.2.0]#
[root@localhost xcache-3.2.0]# ./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
[root@localhost xcache-3.2.0]# make
[root@localhost xcache-3.2.0]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
這個路徑是xcache子產品的存放路徑,如果php識别不出來,就要自己手動指定extension了,而且要完整路徑。不過現在一般都可以識别出來的。
複制xcache中的配置檔案到/etc/php.d/。 用來讓php識别此擴充子產品。
[root@localhost xcache-3.2.0]# cp xcache.ini /etc/php.d/
測試:
建立php下網頁檔案存放目錄。此目錄就是前面httpd用fcgi協定發過來的目錄。
[root@localhost star]# mkdir /web/php/{www,myadm} -pv
mkdir: created directory `/web'
mkdir: created directory `/web/php'
mkdir: created directory `/web/php/www'
mkdir: created directory `/web/php/myadm'
建立網頁測試:
[root@localhost star]# vim /web/php/www/index.php
<h1>www.star.com</h1>
<?php
phpinfo();
?>
[root@localhost star]# vim /web/php/myadm/index.php
<h1>myadm.star.com</h1>
<?php
phpinfo();
?>
重新開機php-fpm。打開網頁完成測試。
[root@localhost xcache-3.2.0]# service php-fpm restart
三、mysql:
安裝,為wordpress建立資料庫并授權使用者。建立遠端管理使用者root。 這裡就不做其它操作了。
[root@localhost ~]# yum install mysql-server -y
[root@localhost ~]# service mysqld start
[root@localhost ~]# mysql
mysql> CREATE DATABASE wordpress;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL ON wordpress.* TO wpuser@'172.16.40.21' IDENTIFIED BY 'abcdefg';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL ON *.* TO root@'172.16.40.21' IDENTIFIED BY 'abcdefg';
Query OK, 0 rows affected (0.00 sec)
四、安裝phpMyAdmin,WordPress。
php主機:
phpMyAdmin:
[root@localhost star]# unzip phpMyAdmin-4.5.3.1-all-languages.zip
[root@localhost star]# mv phpMyAdmin-4.5.3.1-all-languages/* /web/php/myadm/
mv: overwrite `/web/php/myadm/index.php'? y
wordpress:
[root@localhost star]# unzip wordpress-4.4.1-zh_CN.zip
[root@localhost star]# mv wordpress/* /web/php/www/
mv: overwrite `/web/php/www/index.php'? y
[root@localhost star]#
[root@localhost star]# cd /web/php/www
[root@localhost www]# cp wp-config-sample.php wp-config.php
[root@localhost www]# vim wp-config.php
修改上述資訊為所定義的資料庫和所授權的資料庫使用者。
[root@localhost www]# cd ../myadm/
[root@localhost myadm]# cp config.sample.inc.php config.inc.php
[root@localhost myadm]# openssl rand -base64 15
3Wvh8YWSRv0RxKYfvinv
[root@localhost myadm]# vim config.inc.php
添加随機碼和目标資料庫。
httpd主機:
[root@localhost star]# mv phpMyAdmin-4.5.3.1-all-languages/* /web/vhosts/myadm/
[root@localhost star]# mv wordpress/* /web/vhosts/www/
mv: overwrite `/web/vhosts/www/index.php'? y
[root@localhost star]#
那個php檔案是剛才我這裡測試的時候建立的。
現在我們來測試一下,這兩個php應用能正常打開不。
注意防火牆。
都工作正常。
提示MySQL版本太低了。額。
我這裡用centos7做資料庫看一下。
修改一下phpMyAdmin配置檔案對資料庫的指向。 隻要修改php主機上的就可以了。 我們知道 httpd是不會執行php檔案的。
$cfg['Servers'][$i]['host'] = '172.16.40.12';
久違的頁面終于出來了。
這裡就不寫怎麼建立私有CA了,前面都寫了兩遍,看的也眼花不是。隻來過一下怎麼開啟吧。
httpd主機, php主機休息了。
挂載子產品,和開啟ssl的配置檔案:
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include /etc/httpd24/extra/httpd-ssl.conf
證書和私鑰放到了配置目錄的ssl目錄下了。
[root@localhost httpd24]# ls
extra httpd.conf magic mime.types original ssl
[root@localhost httpd24]# ls ssl
myadm.crt myadm.key
[root@localhost httpd24]#
現在對于myadm.star.com虛拟主機的配置,www.star.com的虛拟主機沒有修改,這裡就不帖了。
<VirtualHost *:443>
ServerName myadm.star.com
DocumentRoot "/web/vhosts/myadm"
CustomLog "/var/log/httpd24/myadm/access_log" combined
ErrorLog "/var/log/httpd24/myadm/error_log"
ProxyPassMatch ^/(.*\.php)$ fcgi://172.16.40.21:9000/web/php/myadm/$1
SSLEngine on
SSLCertificateFile "/etc/httpd24/ssl/myadm.crt"
SSLCertificateKeyFile "/etc/httpd24/ssl/myadm.key"
<Directory "/web/vhosts/myadm">
Options None
Require all granted
</Directory>
</VirtualHost>
要注意SSLEngine on在現在這種狀态隻能放在虛拟主機裡面,隻在這個虛拟主機中啟用ssl。不然會因為另一個虛拟主機沒有證書而報錯的。
[Fri Jan 29 11:59:27.191067 2016] [ssl:emerg] [pid 1216:tid 140707884644096] AH02572: Failed to configure at least one certificate and key for www.star.com:443
[Fri Jan 29 11:59:27.191204 2016] [ssl:emerg] [pid 1216:tid 140707884644096] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[Fri Jan 29 11:59:27.191212 2016] [ssl:emerg] [pid 1216:tid 140707884644096] AH02312: Fatal error initialising mod_ssl, exiting.
AH00016: Configuration Failed
因為是私有CA,是以要手動的把CA的根證書導入浏覽器。 讓浏覽器信任由此CA所頒發的證書。
看一下現在的浏覽器。