簡要介紹:
一般來說,LNMP是Linux+Nginx+MySQL+PHP的簡稱,是一種用于替代LAMP的解決方案。在本文檔中,我使用CentOS 7來搭建LNMP平臺,其中,PHP采用FastCGIserver方式部署。此外,還介紹了如何部署Memcached和phpMyadmin。
CentOS系統安裝時選擇的是basic server版本,詳細版本號為CentOS 7.0.1406,核心版本號為3.10.0-123.el7.x86_64。系統安裝在虛擬機上,IP為172.31.2.3,其可與物理機和外界網絡正常通信。如未特別說明,本文檔所涉及的所有操作均使用root賬號進行。
安裝Nginx
默認情況下,centos中的yum庫并沒有提供nginx的源,所以沒有辦法直接安裝nginx。不過,nginx官網上有提供可以更新yum庫的軟件包,可以到nginx官網http://nginx.org/en/linux_packages.html下載該軟件包,或者直接使用下面的命令將該軟件包下載下來,并安裝它:
[root@www ~]#wget?http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@www ~]#?rpm?-ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm
(這部分可略過)然后,到nginx官網下載它提供的GPG數字簽名,或直接使用下面的命令:
[root@www ~]#wget?http://nginx.org/keys/nginx_signing.key
導入該GPG數字簽名文件:
[root@www ~]#rpmkeys?–import?nginx_signing.key
再修改/etc/yum.repos.d/nginx.repo文件中下面這一項:
vi?/etc/yum.repos.d/nginx.repo
gpgcheck=1
這樣以后使用nginx.repo這個yum庫來安裝軟件時就會檢查軟件的GPG簽名了。剛剛下載的那個用于更新yum庫的軟件包,也可以使用下面的命令來檢查它的GPG簽名:
[root@www ~]#rpmkeys?-K?nginx-release-centos-7-0.el7.ngx.noarch.rpm
然后就可以安裝nginx了:
[root@www ~]#yum install nginx
安裝的nginx版本是1.6.3版,是目前穩定版的最新版本。
啟動nginx服務并將其設為開機啟動:
[root@www ~]#systemctl start nginx
[root@www ~]#systemctl enable nginx
然后,檢查nginx服務狀態:
[root@localhost ~]#systemctl status nginx.service??????
假設我們以后的網頁數據都放置在/data/www目錄下,那么,需要在nginx的配置文件/etc/nginx/nginx.conf的http區塊中加入下面內容(include/etc/nginx/conf.d/*.conf;語句前):
vi?/etc/nginx/conf.d/default.conf
server{
location / {
root /data/www;
index index.php index.html index.htm;
}
}
Nginx 會在 http 頭,或者出現錯誤頁的時候會有醒目的版本號提示。
為了安全,可以關閉這些信息。
方法很簡單,只需在 nginx.conf 的 http { ?里頭加入 server_tokens 的參數 }
vi?/etc/nginx/nginx.conf
server_tokens?off;???????????
修改完配置文件后,讓nginx重新加載配置以生效:
[root@www ~]#nginx -s reload
創建/data/www目錄:
[root@www ~]#mkdir -p /data/www?????????????
因為SELinux的關系,即便nginx程序有r權限讀取/data/www下的文件,也是會讀取失敗的。我們需要semanage這個工具來更改/data/www目錄的默認SELinux設置,通過命令yum provides semanage查找到這個工具是由policycoreutils-python這個軟件包提供的,因此:
[root@www ~]#yum install policycoreutils-python
將/data/www目錄(及其子目錄和文檔)的默認SELinux類型設定為nginx可以讀取的httpd_sys_content_t:
[root@www ~]#semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
確認上面的規則是否添加成功:
[root@www ~]#semanage fcontext -l | grep '/data/www'
讓/data/www目錄的SELinux類型恢復成上面設定的默認值
[root@www ~]#restorecon -Rv /data/www
確認/data/www目錄的SELinux類型是否的確為httpd_sys_content_t:
[root@www ~]#ls -dZ /data/www
讓防火墻放通tcp的 80端口:
[root@localhost ~]#firewall-cmd --zone=public --add-port=80/tcp --permanent
重啟防火墻以讓更改生效:
[root@localhost ~]#firewall-cmd --reload
使用以下命令確認防火墻配置是否成功:
[root@localhost ~]#firewall-cmd --list-all
在/data/www目錄目錄下創建一個測試頁面index.html:
[root@www ~]#echo “This a test page.” >/data/www/index.html
?如無意外的話,此時使用瀏覽器訪問http://172.31.2.3/index.html應該就可以看到上面的“This is a test page.”文字了:
雖然上面是測試成功了,但此時查看nginx的錯誤日志文件/var/log/nginx/error.log,可以發現有一個找不到favicon.ico的報錯,這個favicon.ico是收藏網頁時網頁標題旁的那個小圖標。要解決這個問題,可以放一個favicon.ico在你所設定的網頁根目錄下面(這里是/data/www),也可以設定nginx讓它不要報這個錯。
備注:
nginx的配置文件為:/etc/nginx/conf.d/default.conf
/etc/nginx/nginx.conf
nginx的錯誤日志為:/var/log/nginx/error.log
nginx的訪問日志為:/var/log/nginx/access.log
nginx的相關文檔:http://nginx.org/en/docs/
設置nginx以支持PHP(FastCGI方式)
為了讓nginx以FastCGI的方式與PHP協同工作,讓nginx將對于.php文件的請求都傳送給PHP進行處理,需要向nginx的配置文件/etc/nginx/nginx.conf中再添加一個location區塊,即,將前面的那個server區塊改成這樣:(?vi?/etc/nginx/conf.d/default.conf?????? )
server{
location / {
root /data/www;
index index.php index.html index.htm;
}
location ~* \.php$ {
root /data/www;
fastcgi_index index.php;
fastcgi_pass? ?127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include?????? fastcgi_params;
}???????????????????????????????????????
}
注意:fastcgi_pass那里使用了127.0.0.1:9000而不是localhost:9000,否則日志中會有upstream: “fastcgi://[::1]:9000″之類的報錯。
修改完成后,讓nginx重新加載配置以生效:
[root@www ~]#nginx -s reload
安裝PHP(FastCGI方式)
要讓PHP以FastCGI的方式與nginx進行交互,需要有PHP-FPM模塊的支持。由于這個模塊需要集成到PHP的核心中,也就是說,在編譯PHP時需要同時將PHP-FPM模塊編譯進去,所以安裝PHP需要從源碼進行安裝。
安裝前.先安裝些軟件和庫文件
因為要編譯PHP源碼,所以需要先安裝必要的編譯器:
PHP編譯時所需用到的支持庫也要安裝:
yum?install -y gcc gcc-c++? make zlib zlib-devel pcre pcre-devel? libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers
PHP的源碼可從PHP官網(http://php.net/downloads.php)獲得,或者也可以直接按照下面的步驟進行(所安裝版本為目前為止最新的穩定版PHP 5.6.14):
如果未安裝bzip2則無法解壓tar.bz2文件:
?yum?install bzip2 bzip2-devel
[root@www ~]#wget?http://cn2.php.net/distributions/php-5.6.14.tar.bz2
[root@www ~]#tar -jx -fphp-5.6.14.tar.bz2
[root@www ~]#cd?./php-5.6.14
[root@www php-5.6.7]# ./configure --enable-fpm --with-mysql --with-mysqli? --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir? --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl? --with-curlwrappers --enable-mbregex --enable-mbstring?? --with-mcrypt ?--with-mhash? --with-gd --enable-gd-native-ttf?? --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-ftp --with-bz2 --without-iconv --with-gettext --with-pear --enable-calendar? --enable-exif
[root@www php-5.6.7]#make
[root@www php-5.6.7]#make install
如果報錯
configure: error: mcrypt.h not found. Please reinstall libmcrypt
wget? -O?libmcrypt-2.5.8?http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz/download?
mkdir?/usr/local/libmcrypt
tar -xf??libmcrypt-2.5.8
cd?libmcrypt-2.5.8
./configure --disable-posix-threads
make && make install
將適用于生產環境的配置文件復制成為PHP的實際配置文件:
[root@www php-5.6.7]#cp php.ini-production /usr/local/lib/php.ini
復制生成PHP-FPM模塊的配置文件:
[root@www php-5.6.7]#cp /usr/local/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf
將PHP-FPM的執行程序復制到/usr/local/bin目錄下:
[root@www php-5.6.7]#cp sapi/fpm/php-fpm /usr/local/bin? ? ? ??
修改配置文件/usr/local/lib/php.ini中cgi.fix_pathinfo這一項,將它前面的分號去掉,并修改它的值(這樣修改的意義是,如果文件不存在,則阻止nginx將請求發送到后端的PHP-FPM模塊,以避免遭受惡意腳本注入的攻擊):?vi?/usr/local/lib/php.ini
cgi.fix_pathinfo=0
創建一個用戶www-data以供php-fpm使用:
[root@www ~]#useradd -s /sbin/nologin www-data
修改配置文件/usr/local/etc/php-fpm.conf中user和group這兩項,讓php-fpm模塊使用www-data用戶和www-data用戶組的身份運行:vi?/usr/local/etc/php-fpm.conf
user= www-data
group= www-data
再來需要將php-fpm程序設為開機啟動,這需要將php-fpm做成系統服務。
首先,修改php-fpm的配置文件/usr/local/etc/php-fpm.conf,找到下面這一項,將它前面的分號去掉:
pid= run/php-fpm.pid
啟動php-fpm程序:
[root@www ~]#/usr/local/bin/php-fpm
在/etc/systemd/system目錄下創建文件php-fpm.service,將它的內容修改成如示:
vi?/etc/systemd/system/php-fpm.service
[Unit]
Description=php-fpm
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=simple
PIDFile=/usr/local/var/run/php-fpm.pid
ExecStart=/usr/local/bin/php-fpm
ExecReload=/bin/kill -s USR2 $MAINPID
ExecStop=/bin/Kill -s QUIT $MAINPID
[Install]
WantedBy=multi-user.target
重新加載systemd管理器配置以使修改生效:
[root@www ~]#systemctl daemon-reload
這樣以后就可以使用systemctl命令來管理php-fpm程序了。將php-fpm設為開機啟動:
[root@www ~]#systemctl enable php-fpm
啟動php-fpm程序:
[root@www ~]#systemctl start php-fpm
如果啟動正常的話,可以看到php-fpm在監聽tcp的9000端口。
到這,PHP就設定好了。接下來就需要進行測試了,在所設置的網頁根目錄下生成phpinfo頁面:
[root@www ~]#echo "<?php phpinfo (); ?>" > /data/www/index.php
使用瀏覽器訪問服務器,如果沒什么問題的話,應該就可以看到下面的頁面了:
備注:
PHP的配置文件為:/usr/local/lib/php.ini
php-fpm的配置文件為:/usr/local/etc/php-fpm.conf
php-fpm的錯誤日志為:/usr/local/var/log/php-fpm.log
php-fpm.conf文件的在線說明文檔:http://php.net/manual/en/install.fpm.configuration.php
安裝MySQL
由于從RHEL 7開始Red Hat公司推薦使用MariaDB替換MySQL,因此默認情況下,并沒有提供MySQL的安裝包,也就是沒辦法直接使用yum命令安裝MySQL軟件。為了要安裝MySQL,我選擇的是去官網http://dev.mysql.com/downloads/repo/yum/下載安裝包,不過在下載之前需要先注冊。因為使用的是CentOS 7系統,所以我下載的是mysql-community-release-el7-5.noarch.rpm這個文件。下載下來后,將它放在/root目錄下,然后使用命令:
[root@localhost ~]#?wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
[root@localhost ~]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
使用上面這個命令可以將MySQL Yum Repository添加到系統的軟件庫列表(repositorylist)。然后可以使用下面的命令檢查添加是否成功:
[root@localhost ~]#yum repolist enabled | grep mysql
然后,使用下面的命令安裝MySQL:
[root@localhost ~]#yum install mysql-community-server
如上圖所示,這個命令會安裝MySQL server,附帶的,它會安裝一些支撐軟件,包括MySQL client、共享客戶端庫(mysql-community-libs)等軟件。注意到,這里安裝的MySQL版本為5.6版。
安裝完成后,啟動mysqld服務并將其設為開機啟動:
[root@localhost ~]#systemctl start mysqld??????
[root@localhost ~]#systemctl enable mysqld
然后,檢查mysqld服務狀態:
[root@localhost ~]#systemctl status mysqld
MySQL偵聽tcp端口3306。但因為防火墻并未放通該端口,所以從其它設備上是無法訪問本服務器的MySQL數據庫的。但因為這里的MySQL也僅是提供給本機的PHP使用的,所以也就不必放通tcp端口3306。如果需要遠程登陸mysql則需要開放tcp端口3306:
讓防火墻放通tcp的 3306端口:
[root@localhost ~]#firewall-cmd --zone=public --add-port=3306/tcp --permanent
重啟防火墻以讓更改生效:
[root@localhost ~]#firewall-cmd --reload
使用以下命令確認防火墻配置是否成功:
[root@localhost ~]#firewall-cmd --list-all
根據MySQL官方手冊,建議安裝完MySQL數據庫后使用下面的命令來增強數據庫的安全性:
[root@localhost ~]#mysql_secure_installation
該命令程序可以協助你設置數據庫root賬號的密碼,移除匿名用戶賬號,是否允許遠程登錄root賬號,移除自帶的test數據庫,最后還會問你是否要重新加載特權表以讓修改生效。我是設置了數據庫root賬號密碼,其它的都選是(Y)。
如果不想使用上面的命令,那可以使用下面的命令來給root賬號設置密碼,回車后它會提示你輸入密碼的:
[root@localhost ~]#mysqladmin -u root password
如果要修改root賬號的密碼,可使用下面的命令,回車后,它會提示你輸入密碼,然后再設置新密碼:
補充說明 :上面那兩個mysqladmin命令其實是有問題的,因為默認的話,mysql數據庫上是有4個root賬號的,分別是’root’@’localhost’,’root’@’localhost.localdomain’,’root’@’127.0.0.1’,’root’@’::1’,而mysqladmin命令對’root’@’127.0.0.1’和’root’@’::1’這兩個root賬號是不生效的。這是我后來看官方文檔才知道的,看來不懂數據庫真的是容易錯漏百出呢。要為所有root賬號設置密碼,可以進入mysql管理后臺后,使用命令UPDATEmysql.user SET Password = PASSWORD(‘新密碼‘) WHERE User = ‘root’;來設置或修改密碼,使用命令SELECT User, Host, Password FROM mysql.user;來查看修改的效果,使用命令flush privileges;來保存修改。這里的補充說明是后來追加上去的,附件的文檔里面并沒有這個說明,注意。
然后進行下面的操作:
[root@localhost~]#mysql -u root -p//以root賬號登入MySQL
Enterpassword:
mysql>create user 'usera'@'localhost' identified by '1234';//新建本地用戶usera,密碼為1234
mysql>create database testdb;//新建數據庫mydb
mysql>grant all privileges on testdb.* to usera@localhost;//將數據庫testdb的所有權限授權給本地用戶usera
mysql>?GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY '123456'? WITH GRANT OPTION;???//用戶root可以遠程連接mysql
mysql>flush privileges;//刷新系統權限表
mysql>use mysql;//進入數據庫mysql(該數據庫為系統自帶)
mysql>select * from user where user = ‘usera’;//查詢數據庫mysql中是否存在用戶usera
mysql>show databases;//顯示所有已有的數據庫
mysql>exit
上面設定好后,就可以使用usera這個賬號登錄MySQL了,并且可以發現該用戶擁有一個數據庫testdb。
備注:
MySQL的配置文件:/etc/my.cnf
MySQL的錯誤日志文件:/var/log/mysqld.log
數據庫實際存放目錄:/var/lib/mysql
測試
為了測試PHP能否連接到MySQL數據庫,在/data/www目錄下新建一個文檔testmysql.php。因為之前已經在MySQL中新建了一個數據庫testdb,并給這個數據庫建了個用戶usera,密碼是1234,所以test.php的內容是這樣的:
vi?/data/www/testmysql.php
<?php
$mydbhost = ‘localhost’;
$mydbuser = ‘usera’;
$mydbpwd = ‘1234’;
$mydbname = ‘testdb’;
$db = mysql_connect($mydbhost,$mydbuser,$mydbpwd) or die(‘cannot find the database.’);
mysql_select_db($mydbname,$db) or die(‘cannot connect the database.’);
?>
Everything is Ok!
上面這個測試頁面的內容純粹是我百度出來的,不過測試后的確有用。在瀏覽器中訪問testmysql.php這個頁面,如果測試失敗的話(可以試著改一下用戶名或數據庫名稱),那么就會顯示Cannot find the database或Cannot connect the database;如果測試成功的話,就會顯示Everythingis OK!。如下所示:
上面的那個測試一開始是失敗的,查看nginx的錯誤日志,發現有報“PHP message: PHP Warning:?mysql_connect(): No such file or directory”這個錯誤。解決辦法是,進入MySQL數據庫的管理后臺,執行命令status;,記下UNIXsocket的值。在這我的是:/var/lib/mysql/mysql.sock 再在PHP的配置文件/usr/local/lib/php.ini中找到pdo_mysql.default_socket、mysql.default_socket、mysqli.default_socket這三項,將它們的值都改成與UNIXsocket的值相同。然后再使用命令systemctl restart php-fpm命令重啟php-fpm程序就可以了。
到這里為止,基本的LNMP平臺就搭建好了。