CentOS7-Minimal模式下編譯搭建 LAMP / LNMP環境

編譯安裝的目的主要基於如下幾點

  1. 特定版本的軟件包安裝
  2. 包的精簡及參數調優

這裏但願經過編譯安裝方式來實現對PHP運行環境的個性化定製,具體的會按名稱縮寫中的順序來編譯安裝所需的各個組件 apache/nginx -> mysql -> phpphp

編譯過程當中排錯時, 能夠從如下三個維度分析:html

  1. 編譯過程當中的實時報錯信息
  2. 相關程序的運行日誌、訪問日誌、報錯日誌
  3. 查看 systemd 產生的系統日誌,經常使用命令 journalctl -xn

基礎依賴安裝

這些都是在 lamp / lnmp 編譯過程當中報錯提示最低要求必須依賴的包,在此預先準備好mysql

sudo yum install gcc gcc-c++ cmake kernel-devel openssl-devel git ncurses-devel bison wget

關閉安全系統 - 避免各類服務被屏蔽

sudo service firewalld stop  # 關閉防火牆(centos6.5下是iptables服務)
sudo chkconfig firewalld off  # 關閉防火牆的開機啓動
sudo setenforce 0  # 關閉selinux服務
sudo sed -i 's|SELINUX=enforcing|SELINUX=disabled|g' /etc/selinux/config  # 關閉selinux的開機啓動

準備源碼存放目錄

mkdir /tmp/source
cd /tmp/source

Apache編譯安裝 - 以mod-php方式同php協做

163源下默認提供2.4.6版本。這裏咱們仍然採用手工編譯方式來安裝apachelinux

# 安裝pcre依賴 - 提供url-rewrite支持
cd /tmp/source
wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.39/pcre-8.39.tar.gz
tar -zxvf pcre-8.39.tar.gz
cd pcre-8.39/
./configure --prefix=/usr/local/pcre
make 
sudo make install

# 安裝zlib依賴 - 提供gzip壓縮支持
cd /tmp/source
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8/
./configure --prefix=/usr/local/zlib
make
sudo make install

cd /tmp/source
wget http://mirror.bit.edu.cn/apache//apr/apr-1.5.2.tar.gz  # 下載apr依賴 - Apache可移植運行庫
wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.5.4.tar.gz  # 下載apr-util依賴 - 基於apr提供了一系列有用的抽象封裝
wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.23.tar.gz  # 下載apache源碼
tar -zxvf apr-1.5.2.tar.gz
tar -zxvf apr-util-1.5.4.tar.gz
tar -zxvf httpd-2.4.23.tar.gz

# 補全apr系列依賴到httpd的源碼庫中
mv apr-1.5.2 httpd-2.4.23/srclib/apr
mv apr-util-1.5.4 httpd-2.4.23/srclib/apr-util

# 編譯安裝httpd
cd httpd-2.4.23
./configure --prefix=/usr/local/httpd --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc/httpd/conf --enable-so --enable-rewrite --enable-ssl --enable-proxy --with-included-apr --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib
make
sudo make install

# 將httpd註冊爲服務以便於經過service命令管理
sudo cp build/rpm/httpd.init /etc/init.d/httpd
sudo chmod 755 /etc/init.d/httpd
sudo sed -i '2a # chkconfig: - 80 90\n# description: httpd service' /etc/init.d/httpd # 在第二行後追加兩行服務註解(必須)
sudo chkconfig --add httpd  # 編入服務
sudo chkconfig httpd on  # 服務開機啓動

# 調整服務配置文件
cd /etc/httpd/conf
sudo sed -i '/<IfModule mime_module>/a\    Addtype application/x-httpd-php .php' httpd.conf  # 添加php的minetype
sudo sed -i 's|DirectoryIndex index.html|DirectoryIndex index.php index.html index.htm|g' httpd.conf  # 默認頁配置
sudo sed -i 's|#LoadModule rewrite_module|LoadModule rewrite_module|g' httpd.conf  # 啓用url重寫模塊
sudo sed -i 's|#Include /etc/httpd/conf/extra/httpd-vhosts.conf|Include /etc/httpd/conf/extra/httpd-vhosts.conf|g' httpd.conf  # 啓用虛擬主機配置文件
sudo sed -i '/^ServerRoot/a\PidFile /var/run/httpd.pid' httpd.conf  # 更改服務進程pid文件寫入路徑(解決路徑報錯)
sudo sed -i '/<VirtualHost \*:80>/,$s|^|#|' extra/httpd-vhosts.conf  # 註釋掉預置的測試站點(解決測試站點不存在報錯)
sudo mkdir /var/log/httpd
sudo chown httpd:httpd /var/log/httpd
sudo sed -i 's|CustomLog "logs/access_log" common|CustomLog "/var/log/httpd/access_log" common|g' httpd.conf  # 更改訪問日誌目錄
sudo sed -i 's|ErrorLog "logs/error_log"|ErrorLog "/var/log/httpd/error_log"|g' httpd.conf  # 更改報錯日誌目錄

# httpd用戶組管理
sudo useradd -s /sbin/nologin -r httpd # 建立系統帳戶類型的非登陸帳戶
sudo sed -i 's|User daemon|User httpd|g' /etc/httpd/httpd.conf  # 設定服務啓動帳戶
sudo sed -i 's|Group daemon|Group httpd|g' /etc/httpd/httpd.conf  # 設定服務啓動用戶組

Nginx編譯安裝 - 以fastcgi方式同php協做

epel源下已有最新穩定版1.10.1。但這裏咱們仍然採用手工編譯方式來安裝nginxnginx

cd /tmp/source
wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.39/pcre-8.39.tar.gz  # 下載pcre依賴 - 提供url-rewrite支持
wget http://zlib.net/zlib-1.2.8.tar.gz  # 下載zlib依賴 - 提供gzip壓縮支持
wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz  # 下載openssl依賴
wget http://nginx.org/download/nginx-1.10.1.tar.gz  # 下載nginx源碼
tar -zxvf pcre-8.39.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
tar -zxvf openssl-1.0.2j.tar.gz
tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1

./configure --prefix=/usr/local/nginxd --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/sbin/nginx --with-http_ssl_module --with-http_realip_module --without-http_uwsgi_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_autoindex_module --with-http_stub_status_module --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/run/nginx/nginx.lock --error-log-path=/var/log/nginxd/error.log --http-log-path=/var/log/nginxd/access.log --with-pcre=/tmp/source/pcre-8.39 --with-zlib=/tmp/source/zlib-1.2.8 --with-openssl=/tmp/source/openssl-1.0.2j

make
sudo make install

# 將nginxd註冊爲服務以便於經過service命令管理
# 首先建立/etc/init.d/nginxd文件爲 `https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/` 頁面內容
cd /etc/init.d/
sudo sed -i 's|/var/run/nginx.pid|/var/run/nginx/nginx.pid|g' nginxd
sudo sed -i 's|/var/lock/subsys/nginx|/var/run/nginx/nginx.lock|g' nginxd
sudo chmod 755 nginxd
sudo chkconfig --add httpd  # 編入服務
sudo chkconfig nginxd on  # 服務開機啓動

# nginxd用戶組管理
sudo useradd -s /sbin/nologin -r nginxd # 建立系統帳戶類型的非登陸帳戶
sudo sed -i 's|#user  nobody;|user  nginxd;|g' /etc/nginx/nginx.conf  # 設定服務啓動帳戶

sudo chown nginxd:nginxd /var/run/nginxd
sudo chown nginxd:nginxd /var/log/nginxd
sudo sed -i 's|/scripts$fastcgi_script_name|$document_root$fastcgi_script_name|g' /etc/nginx/nginx.conf  # 修復一個變量配置報錯

Mysql編譯安裝

mysql官方對發行包有着極好的支持,基本上大多數版本都提供了對應預編譯好的rpm包,咱們能夠直接下載安裝。另外,較新的幾個版本還提供了yum源。但這裏,咱們依然是採用手工編譯。 留意,163源下默認提供5.5.50版本的MariaDB數據庫c++

cd /tmp/source
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.13.tar.gz  # 下載mysql源碼
tar -zxvf mysql-5.7.13.tar.gz
cd mysql-5.7.13

# cmake編譯配置,你也能經過`sudo ccmake .`命令來人性化交互式配置
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DINSTALL_BINDIR=/usr/bin -DINSTALL_SBINDIR=/usr/sbin -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp/source -DWITH_DEBUG=OFF -DENABLE_DEBUG_SYNC=OFF -DWITH_UNIT_TESTS=OFF  -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

make # 這一步時間很長,虛機配置3g內存、兩核四中心 跑了50分鐘
sudo make install

# mysqld用戶組管理
sudo useradd -s /sbin/nologin -r mysqld  # 新增mysqld用戶
sudo mkdir /srv/mysql
sudo chown mysqld:mysqld /srv/mysql
sudo mysqld --initialize --user=mysqld --datadir=/srv/mysql  # MySQL 5.7.6+初始化操做並生成my.cnf配置。!!這一步務必記錄下回顯信息最後一行給出的mysql管理員初始密碼,如`root@localhost: PFUtsbtpf5+N`!!

sudo mkdir /var/log/mariadb /var/run/mariadb
sudo chown mysqld:mysqld /var/log/mariadb /var/run/mariadb
sudo sed -i 's|datadir=/var/lib/mysql|datadir=/srv/mysql|g' /etc/my.cnf  # 修正配置文件中的數據目錄
sudo sed -i 's|socket=/var/lib/mysql/mysql.sock|socket=/var/run/mariadb/mysql.sock|g' /etc/my.cnf  # 修正配置文件中的套接字文件路徑
sudo sed -i '/\[mysqld\]/a\pid-file=/var/run/mariadb/mysqld.pid' /etc/my.cnf  # 指定pid文件路徑
sudo sed -i '/\[mysqld\]/a\user=mysqld' /etc/my.cnf  # 指定服務啓動帳號
sudo mysql_ssl_rsa_setup  # MySQL 5.7.6+鏈路加密配置初始化

# 將mysqld註冊爲服務以便於經過service命令管理
sudo cp support-files/mysql.server /etc/init.d/mysqld
sudo sed -i 's|/var/lock/subsys|/var/run/mariadb|g' /etc/init.d/mysqld  # 修正lock文件目錄錯誤
sudo sed -i 's|$lockdir/mysql|$lockdir/mysql.lock|g' /etc/init.d/mysqld  # 修正lock文件路徑錯誤
sudo chmod 755 /etc/init.d/mysqld
sudo chkconfig --add /etc/init.d/mysqld 
sudo chkconfig mysqld on  # 服務開機啓動

# mysql初始化
mysql -uroot -p  #利用上面記錄的root密碼登入mysql終端,並執行下面一條sql操做語句
set Password=PASSWORD('1qaz2wsx3edc');  #首次安裝mysql強制要求你更新密碼才能運行
flush privileges;

PHP編譯安裝

163源下默認提供5.4.16版本。這裏咱們仍然採用手工編譯方式來安裝phpgit

關於這裏的php編譯安裝, 須要瞭解這些github

  • 這種方式下,php拓展是靜態編譯入php的,編譯導出的是 .o 靜態連接庫文件。
  • 經過 yum包 及 phpize 方式安裝的php拓展,則是動態編譯入php的,編譯導出的文件是 .so 動態連接庫文件,並安裝在 extension_dir 目錄下。
  • 若是要靜態編譯入php拓展,必須對php全量編譯。然後期的增長拓展,則只能是動態編譯出 連接庫 並載入到php中。

關於iconv庫的幾點說明redis

  • Centos7最小化安裝 已默認在/usr/local/lib下安裝有一份libiconv庫,咱們無需像網上教程說的那樣特地去下載安裝libiconv庫
  • 不作特殊處理,則咱們在 configuresudo make 後會產生iconv相關報錯。
    **緣由:**原本make編譯時符號表裏的iconv相關函數符號默認是鏈接到linux自帶的libc標準庫(libc標準庫支持iconv實現)而不是libiconv庫,但是頭文件 /usr/local/include/iconv.h 中將iconv相關函數篡改加了lib前綴,致使libc標準庫不識別符號表中的個別lib前綴的iconv函數。
    **解決辦法:**經過 configure 時添加 LIBS="-liconv" 鏈接提示來明確告訴鏈接器應該連接libiconv庫(支持lib前綴的iconv函數)而不是libc標準庫。
    **不可取解決辦法:**許多網上教程是經過 ZEND_EXTRA_LIBS='-liconv' 參數來解決php編譯安裝過程當中的iconv報錯,但這種處理的思路是提示編譯器不安裝iconv庫。這實際上是創造了新的問題,而不是解決問題。由於平常開發中iconv函數仍是比較經常使用的,因此iconv庫是有必要安裝上的。
cd /tmp/source
wget http://cn2.php.net/distributions/php-5.6.24.tar.gz #下載php源碼
tar -zxvf php-5.6.24.tar.gz
cd php-5.6.24

# 編譯安裝php,這裏啓用的php拓展模塊都是咱們平常開發中常常用到的
# 其中 `--with-apxs2=/usr/local/httpd/bin/apxs` 參數僅在安裝了apache服務器時才使用
./configure --prefix=/usr/local/php --enable-fpm --enable-pdo --enable-xml --enable-zip --enable-opcache --enable-sockets --enable-mbstring --enable-gd-native-ttf --with-mysql --with-mysqli --with-pdo-mysql --with-mysql-sock --with-gd --with-curl --with-zlib --with-openssl --with-gettext --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-apxs2=/usr/local/httpd/bin/apxs --with-libxml-dir=/usr/lib64 --with-mcrypt=/usr/lib64 --with-freetype-dir=/usr/lib64 --with-jpeg-dir=/usr/lib64 --with-png-dir=/usr/lib64 --with-iconv-dir=/usr/local/lib  LIBS="-liconv"

make
sudo make install

# 啓用配置文件
sudo mkdir /etc/php.d
sudo chmod 777 /etc/php.d
sudo cp /tmp/source/php-5.6.24/php.ini-production /etc/php.ini  # 啓用生產環境模式下的php配置文件
sudo cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf  # 啓用fpm默認配置文件
sudo ln -s /usr/local/etc/php-fpm.conf /etc/php-fpm.conf

# 啓用opcache拓展(即使是靜態編譯安裝php,opcache也是以動態連接庫載入到php的,因此這裏須要手工配置其啓用)
sudo sed -i '/\[opcache\]/a\zend_extension=opcache.so' /etc/php.ini

# 將php-fpm註冊爲服務以便於經過service命令管理
sudo cp /tmp/source/php-5.6.24/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
cd /etc/init.d/
sudo chmod 755 php-fpm
sudo sed -i '2a # chkconfig: - 80 90\n# description: php-fpm service' php-fpm  # 在第二行後追加兩行服務註解(必須)
sudo chkconfig --add php-fpm  # 編入服務
sudo chkconfig php-fpm on  # 服務開機啓動

# php-fpm服務用戶組管理
sudo useradd -s /sbin/nologin -Mr phpfpm  #新增phpfpm用戶
sudo sed -i 's|user = nobody|user = phpfpm|g' /etc/php-fpm.conf
sudo sed -i 's|group = nobody|group = phpfpm|g' /etc/php-fpm.conf

PHP後期增長拓展

# 以安裝phpredis拓展爲例
cd /tmp/source
git clone https://github.com/phpredis/phpredis.git  # 下載phpredis源碼
cd phpredis/
phpize
./configure
sudo make
sudo make install
sudo cp rpm/redis.ini /etc/php.d/redis.ini

清理下載的源碼

sudo rm -rf /tmp/source
相關文章
相關標籤/搜索