centos7安裝LNMP

簡要介紹:

一般來說,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平臺就搭建好了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容