編譯搭建LAMP伺服器

技術小胖子發表於2017-11-08

一、為什麼要編譯安裝

   為什麼伺服器軟體需要編譯安裝?一個流傳很廣的說法是編譯安裝效能更好,其實這是個謠言,伺服器CPU事實已經被Intel壟斷了,就那麼幾種型號,編來編去生成的機器碼是一樣的。Intel宣傳自己的編譯工具Intel C++ Compiler 比GCC編譯出來效能要提升10%-20%,這就是一廣告,生產環境很少用人用它,何況它還要收費

    效能真不是問題,比如 strip 命令可以大大減小可執行檔案的size,但是我裝過幾千遍軟體,都沒有見有人在安裝指令碼里面使用。

    軟體需要編譯安裝的真實理由有如下3點:

  • 軟體在編譯期間需要配置:比如說nginx,需要在編譯的時候指定包含哪些module,php,apache 也是一樣。同樣的是資料庫,mysql通過編譯安裝,因為要定製儲存引擎(是否支援innodb .. ),而sqlite卻絕少有人編譯,都是直接下載二進位制檔案來用。

  • 軟體需要統一安裝路徑:每個team都會自己的安裝目錄約定,有些喜歡裝在 /opt/下面,有些喜歡裝在 /usr/local/ ,編譯安裝可以方便的指定這些路徑(configure –prefix=xxx )

  • 需要最新的版本:軟體倉庫的版本一般都比較低,這個理由其實不充分,生產環境傾向保守,不追求最新版本,但是對於某些軟體來說,必須安裝特定的版本,這時候就只能進行編譯安裝。

二、Apache環境準備及安裝

    我使用的搭建環境是Centos6.6 x86-64 mini版的系統;最小版安裝有很多軟體沒有提供,我們可以通過yum軟體庫進行安裝,到現在LAMP伺服器的“L”(linux)我們已經準備好了,那麼下一步我們是需要下載apache的httpd軟體,下載地址是httpd.apache.org,現在apache維護的httpd有2.0,、2.2、2.4幾個分支版本,每個版本的功能官網寫的很清楚,我這裡不再贅述,我所選擇的是httpd的最新版本2.4.10,下面我們進行httpd的編譯過程講解;

    因為httpd可以在各種作業系統,各種硬體架構上執行,是因為httpd執行在apr(Apache Portable Runtime)虛擬機器上面,針對不同平臺和作業系統開發apr,所有首先在我們按照httpd之前應該先安裝apr,我們不使用軟體包自帶的apr軟體,好像是版本有點低,httpd2.4.10需要的apr版本最低是1.4,我們去官網下載最新版本的apr和apr-util,下載地址是apr.apache.org;

1
2
3
4
5
6
wget http://apache.fayea.com//httpd/httpd-2.4.10.tar.bz2
wget http://mirrors.cnnic.cn/apache/apr/apr-1.5.1.tar.bz2
wget http://mirrors.cnnic.cn/apache/apr/apr-util-1.5.4.tar.bz2
tar -xf httpd-2.4.10.tar.bz2
tar -xf apr-1.5.1.tar.bz2
tar -xf apr-util-1.5.4.tar.bz2

    安裝開發庫

1
yum install gcc -y

    進行軟體的編譯 

1
2
3
4
5
6
7
8
9
cd apr-1.5.1
./configure --prefix=/usr/local/apr
make
make install
 
cd apr-util-1.5.4
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install

    因為httpd需要重寫功能,所有需要安裝pcre庫

1
yum install -y pcre-devel

    然而我在編譯的時候出現checking for OpenSSL version >= 0.9.8a… FAILED,是因為我們的mini版本沒有安裝openssl的開發庫,所有要先安裝開發庫

1
yum install openssl-devel.x86_64 -y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd httpd-2.4.10
./configure 
--prefix=/usr/local/apache 
--sysconfdir=/etc/httpd 
--enable-so 
--enable-rewirte 
--enable-ssl 
--enable-cgi 
--enable-cgid 
--enable-modules=most 
--enable-mods-shared=most 
--enable-mpms-shared=all 
--with-apr=/usr/local/apr 
--with-apr-util=/usr/local/apr-util
make
make install

     關閉SELinux

1
setenforce 0
1
2
#把httpd的二進位制執行檔案新增到環境變數裡面
echo "export PATH=$PATH:/usr/local/apache/bin" /etc/profile.d/httpd.sh

    把httpd的man檔案加入系統裡面,首先安裝man工具

1
2
yum install man -y
vim /etc/man.config

     新增如下內容 

1
MANPATH /usr/local/apache/man

     給httpd新增一個SysV風格的腳步放到/etc/init.d/目錄下面,到此為止httpd安裝完成了;

#cat /etc/rc.d/init.d/httpd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve 
#       HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid
# Source function library.
/etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
        /etc/sysconfig/httpd
fi
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
start() {
        echo -n $"Starting $prog: "
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d 10 $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/nullthen
        RETVAL=$?
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        killproc -p ${pidfile} $httpd -HUP
        RETVAL=$?
    fi
    echo
}
# See how we were called.
case "$1" in
  start)
start
;;
  stop)
stop
;;
  status)
        status -p ${pidfile} $httpd
RETVAL=$?
;;
  restart)
stop
start
;;
  condrestart)
if [ -f ${pidfile} ] ; then
stop
start
fi
;;
  reload)
        reload
;;
  graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
  *)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
exit 1
esac
exit $RETVAL

    而後為此指令碼賦予執行許可權:

1
chmod +x /etc/rc.d/init.d/httpd

    加入服務列表:

1
2
chkconfig --add httpd
chkconfig httpd on

三、Mysql的安裝:

    Mysql的安裝可以rpm安裝,可以使用通用二進位制包安裝,也可以使用原始碼編譯安裝,鑑於原始碼編譯太耗費時間,我們這使用通用二進位制格式包安裝,軟體包可以在搜狐映象網站下載到,我們現在使用的版本是mysql-5.5.20-linux2.6-x86_64.tar.gz。

1
2
3
4
5
6
7
8
9
10
11
#到映象網站下載需要的版本
wget    
#解壓
tar xf mysql-5.5.20-linux2.6-x86_64.tar.gz -C /usr/local
cd /usr/local
ln -s mysql-5.5.20-linux2.6-x86_64 mysql
#新增使用者
groupadd -r mysql
useradd -g mysql -r -s /sbin/nologin mysql
cd mysql
chown -R mysql:mysql *

    建立一個邏輯卷給Mysql資料存放位置。

1
2
3
4
5
6
pvcreate /dev/sda5
vgcreate myvg /dev/sda5
lvcreate -n mysql -L 5G myvg
mkfs.ext4 /dev/myvg/mysql
vim /etc/fstab
mkdir /data

     新增開機自動掛載。 

1
2
#在/etc/fatab新增一行
/dev/myvg/mysql      /data       ext4    defaults        0 0
1
2
3
4
5
6
7
8
9
#掛載
mount -a
mkdir /data/mysql
chown mysql.mysql /data/mysql
chmod o-x /data/mysql
cd /usr/local/mysql
#初始化資料庫
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql/
chown -R root *

    新增二進位制程式環境變數

1
echo "export PATH=$PATH:/usr/local/mysql/bin" /etc/profile.d/mysql.sh

    新增幫助檔案

1
vim /etc/man.config

    新增如下內容 

1
MANPATH /usr/local/mysql/man

    把mysql的庫檔案加入到系統庫檔案目錄搜尋裡面

1
echo "/usr/local/mysql/lib" /etc/ld.so.conf.d/mysql.conf

    新增標頭檔案

1
ln -s /usr/local/mysql/include /usr/include/mysql

    新增啟動指令碼

1
2
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld

    新增配置檔案

1
cp support-files/my-large.cnf /etc/my.cnf

    在配置檔案裡面新增 

1
datadir = /data/mysql

    現在可以啟動Mysql服務了,可以為mysql新增密碼

1
mysqladmin -uroot password `123456`

四、PHP的安裝

    下面我們進行最後一項php的編譯安裝,我們選擇的php版本是5.4.36。

1
wget http://cn2.php.net/distributions/php-5.4.36.tar.bz2

    如果想讓編譯的php支援mcrypt擴充套件,此處還需要下如下兩個rpm包並安裝之:

      libmcrypt-2.5.8-9.el6.rpm

      libmcrypt-devel-2.5.8-9.el6.rpm

    因為這兩個軟體包自帶的軟體庫沒有,所有我們更新增加yum源

1
2
rpm -ivh http://download4.fedora.redhat.com/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install -y libmcrypt libmcrypt-devel gd-devel

說明:

這些沒有自帶的包我們也可以到網站去查詢下載地址,比如:http://rpmfind.net;在裡面我們可以查詢到支援各種硬體平臺的rpm軟體包。    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cd php-5.4.36
#下面開始進行編譯
./configure 
--prefix=/usr/local/php 
--with-mysql=/usr/local/mysql 
--with-openssl 
--with-mysqli=/usr/local/mysql/bin/mysql_config 
--enable-mbstring 
--with-freetype-dir 
--with-jpeg-dir 
--with-png-dir 
--with-zlib 
--with-libxml-dir=/usr 
--enable-xml  
--enable-sockets 
--with-apxs2=/usr/local/apache/bin/apxs 
--with-mcrypt  
--with-config-file-path=/etc 
--with-config-file-scan-dir=/etc/php.d 
--with-bz2  
--enable-maintainer-zts

說明:

1、這裡為了支援apache的worker或event這兩個MPM,編譯時使用了–enable-maintainer-zts選項。

2、–with-apxs2=/usr/local/apache/bin/apxs 這裡是讓php以httpd的模組模式執行,如果使用FastCGI模式執行的話需改為 –enable-fpm,如果httpd是rpm安裝的話,使用apxs需要安裝http-devle軟體包

3、如果使用PHP5.3以上版本,為了連結MySQL資料庫,可以指定mysqlnd,這樣在本機就不需要先安裝MySQL或MySQL開發包了。mysqlnd從php 5.3開始可用,可以編譯時繫結到它(而不用和具體的MySQL客戶端庫繫結形成依賴),但從PHP 5.4開始它就是預設設定了。

# ./configure –with-mysql=mysqlnd –with-pdo-mysql=mysqlnd –with-mysqli=mysqlnd

4、此時如果編譯的東西不適合您的需要,您可以新增需要編譯的模組引數,也可以就此這樣安裝,後面我們可以動態安裝需要的模組,安裝方法和我後面為php安裝xcache的方法是一樣的。

注意:

    我在編譯中出現了一個錯誤configure: error: xml2-config not found. Please check your libxml2 installation.

    在這裡我們首先應該提交安裝libxml2,然後再進行編譯;

1
yum install libxml2 libxml2-devel -y

    緊接著又出現錯誤,出現這麼多錯誤的原因是因為我們安裝的linux是mini版,好多軟體並沒有預裝的,安裝之前我們也不知道哪些軟體存在,哪些軟體不存在,只能出現一個問題解決一個問你

錯誤:configure: error: Please reinstall the BZip2 distribution

1
yum install bzip2-devel.x86_64 -y

    後面一切順利,直接到編譯配置結束,

1
2
make
make install

    為php提供好配置檔案,在php原始檔目錄下面

1
cp php.ini-production /etc/php.ini

    編輯apache配置檔案httpd.conf,以apache支援php,而後重新啟動httpd,或讓其重新載入配置檔案即可測試php是否已經可以正常使用。

1
2
3
4
5
6
7
vim /etc/httpd/httpd.conf
1、新增如下二行
   AddType application/x-httpd-php  .php
   AddType application/x-httpd-php-source  .phps
2、定位至DirectoryIndex index.html 
   修改為:
   DirectoryIndex  index.php  index.html

   具體apache的配置我們這裡不在陳述,可以更改中心主機的路徑,配置虛擬主機,載入需要的模組等等;

   到現在為止LAMP環境是搭建好了,下面我們進行測試,看看我們的php是否可以連線資料庫;在index.php裡面填寫上如下內容:   

1
2
3
4
5
6
7
8
<?php
   $conn=mysql_connect(`localhost`,`root`,`123456`);
   if ($conn)
      echo "Success.....";
   else
      echo "Failure.....";
phpinfo();
?>

    當資料庫開啟的時候顯示Success….,資料庫關閉的時候顯示Failure…。

五、安裝加速器XCache

    XCache 是一個開源的 php的opcode 快取器/優化器, 這意味著他能夠提高您伺服器上的 PHP 效能. 他通過把編譯 PHP 後的資料緩衝到共享記憶體從而避免重複的編譯過程, 能夠直接使用緩衝區已編譯的程式碼從而提高速度. 通常能夠提高您的頁面生成速率 2 到5 倍, 降低伺服器負載.

1
2
3
4
wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz
tar xf xcache-3.2.0.tar.gz
cd xcache-3.2.0
/usr/local/php/bin/phpize

    然後卻出現了錯誤:

1
2
 Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

    原因是因為我還是有軟體包沒有安裝

1
2
3
4
yum install autoconf -y
./configure --enable-xcache --with-php-config=/usr/local/php/bin/php-config
make 
make install

    為xcache提供配置檔案

1
2
mkdir /etc/php.d
cp xcache.ini /etc/php.d/

    到此為止xcache安裝完成


第二部分、配置apache-2.4.10與fpm方式的php-5.4.36


一、apache、MySQL的安裝與前一部分相同;請根據其進行安裝;


二、編譯安裝php-5.4.36


1、解決依賴關係:


如果想讓編譯的php支援mcrypt擴充套件,此處還需要下載如下兩個rpm包並安裝之:

libmcrypt-2.5.7-5.el5.i386.rpm

libmcrypt-devel-2.5.7-5.el5.i386.rpm

mhash-0.9.9-1.el5.centos.i386.rpm

mhash-devel-0.9.9-1.el5.centos.i386.rpm


2、編譯安裝php-5.4.36


首先下載原始碼包至本地目錄,


# tar xf php-5.4.36.tar.bz2

# cd php-5.4.36

# ./configure

–prefix=/usr/local/php

–with-mysql=/usr/local/mysql

–with-openssl

–with-mysqli=/usr/local/mysql/bin/mysql_config

–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 intall


為php提供配置檔案:

# cp php.ini-production /etc/php.ini


3、配置php-fpm

 

為php-fpm提供Sysv init指令碼,並將其新增至服務列表:

# cp sapi/fpm/init.d.php-fpm  /etc/rc.d/init.d/php-fpm

# chmod +x /etc/rc.d/init.d/php-fpm

# chkconfig –add php-fpm

# chkconfig php-fpm on


為php-fpm提供配置檔案:

# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf 


編輯php-fpm的配置檔案:

# vim /usr/local/php/etc/php-fpm.conf

配置fpm的相關選項為你所需要的值,並啟用pid檔案(如下最後一行):

pm.max_children = 50

pm.start_servers = 5

pm.min_spare_servers = 2

pm.max_spare_servers = 8

pid = /usr/local/php/var/run/php-fpm.pid 


接下來就可以啟動php-fpm了:

# service php-fpm start


使用如下命令來驗正(如果此命令輸出有中幾個php-fpm程式就說明啟動成功了):

# ps aux | grep php-fpm


預設情況下,fpm監聽在127.0.0.1的9000埠,也可以使用如下命令驗正其是否已經監聽在相應的套接字。

# netstat -tnlp | grep php-fpm

tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      689/php-fpm 


三、配置httpd-2.4.10


1、啟用httpd的相關模組


在Apache httpd 2.4以後已經專門有一個模組針對FastCGI的實現,此模組為mod_proxy_fcgi.so,它其實是作為mod_proxy.so模組的擴充,因此,這兩個模組都要載入

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so



2、配置虛擬主機支援使用fcgi


在相應的虛擬主機中新增類似如下兩行。

ProxyRequests Off

ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/PATH/TO/DOCUMENT_ROOT/$1


例如:

<VirtualHost *:80>

    DocumentRoot “/www/html”

    ServerName hebrxz.com

    ServerAlias www.hebrxz.com


ProxyRequests Off

ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/www/html/$1


    <Directory “/www/html”>

        Options none

        AllowOverride none

        Require all granted

    </Directory>

</VirtualHost>


ProxyRequests Off:關閉正向代理

ProxyPassMatch:把以.php結尾的檔案請求傳送到php-fpm程式,php-fpm至少需要知道執行的目錄和URI,所以這裡直接在fcgi://127.0.0.1:9000後指明瞭這兩個引數,其它的引數的傳遞已經被mod_proxy_fcgi.so進行了封裝,不需要手動指定。


3、編輯apache配置檔案httpd.conf,讓apache能識別php格式的頁面,並支援php格式的主頁

 

 # vim /etc/httpd/httpd.conf

 1、新增如下二行

   AddType application/x-httpd-php  .php

   AddType application/x-httpd-php-source  .phps


 2、定位至DirectoryIndex index.html 

   修改為:

    DirectoryIndex  index.php  index.html


補充:Apache httpd 2.4以前的版本中,要麼把PHP作為Apache的模組執行,要麼新增一個第三方模組支援PHP-FPM實現。

     本文轉自 wzlinux 51CTO部落格,原文連結:http://blog.51cto.com/wzlinux/1605480,如需轉載請自行聯絡原作者


相關文章