簡要介紹:
LAMP是Linux+Apache+MySQL+PHP的簡稱,是用於搭建web服務器的一種解決方案。雖然從RHEL 7開始Red Hat公司推薦使用MariaDB而不是MySQL,但在我這篇文章當中,我還是決定繼續使用MySQL。
在本文檔中,我使用CentOS 7來搭建LAMP平臺。系統安裝時選擇的是basic server版本,詳細版本號爲CentOS 7.0.1406,核心版本號爲3.10.0-123.el7.x86_64。CentOS 7系統安裝在虛擬機上,IP爲172.31.2.2,其可與物理機正常通信。本文檔所涉及的所有操作均使用root賬號進行。
這篇文章只是我個人學習的總結,主要參考了鳥哥的Linux私房菜和各軟件的官方文檔,但因爲本人對PHP技術和數據庫技術可以說基本不瞭解,所以裏面可能會有一些設定不很清楚或優化不到位的地方,敬請知曉。
安裝Apache軟件
Apache軟件的軟件包名稱叫做httpd,因此,要安裝Apache軟件,就使用下述命令:
[root@localhost ~]# yum install httpd
如上圖所示,安裝的Apache 軟件版本爲2.4版。根據紅帽官方文檔說明,RHEL 7 (或CentOS 7)上可用的Apache版本正是2.4版的。
安裝完成後,Apache是以httpd服務的形式存在的。因此,要啓動Apache並將其設置爲開機啓動,就使用命令:
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl enable httpd.service
然後,檢查httpd服務狀態:
[root@localhost ~]# systemctl status httpd.service
如上圖所示,“enabled”表示httpd服務已設爲開機啓動,“active(running)”則表示httpd服務正在運行中。
這樣的話,HTTP協議就已被啓動起來了,由於HTTP協議使用到tcp端口80,因此防火牆要放通tcp端口80:
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
重啓防火牆以讓更改立刻生效:
[root@localhost ~]# firewall-cmd --reload
使用以下命令檢查配置是否成功:
[root@localhost ~]# firewall-cmd --list-all
如上圖所示,tcp端口80已放通。
然後這個時候,就可以在物理機上使用瀏覽器來訪問剛剛搭建的web服務器了。不過,因爲這個時候還未創建任何頁面,所以它顯示的是Apache軟件自帶的測試頁面:
設置Apache配置文件
Apache軟件的主配置文件爲/etc/httpd/conf/httpd.conf。關於Apache 2.4版軟件的詳細說明文檔,可在網頁http://httpd.apache.org/docs/2.4/en/中查閱到。特別是,關於主配置文件httpd.conf中各指令的詳細說明,可在網頁http://httpd.apache.org/docs/2.4/mod/directives.html中查閱到。
關於Apache 2.4版軟件的詳細說明文檔,也可以將它安裝在本地Linux主機上面,使用命令yum install httpd-manual即可安裝它。安裝完成後,重啓httpd服務。在web服務運行正常的情況下,可在本地Linux主機上面使用網址http://localhost/manual/來訪問它。在其它設備上面,則使用相應的網址即可,如在本實例中,我可以在物理機上使用網址http://172.31.2.2/manual/來訪問它。
另外還需要知道:/etc/httpd/conf.d目錄下以.conf結尾的配置文件也會被讀取;可加載模塊(如PHP)的配置文件應放置在/etc/httpd/conf.modules.d目錄下,並且也以.conf結尾。
下面介紹一下httpd.conf這個配置文件的內容(少量配置有修改):
ServerRoot "/etc/httpd" //服務器根目錄:本配置文件中沒有使用絕對路徑的地方,都認爲是在該目錄下
Listen 80 //偵聽80端口
Include conf.modules.d/*.conf
//該設定讓/etc/httpd/conf.modules.d目錄下以.conf結尾的配置文件也會被讀取進來。DSO對象的配置文件應放置在此目錄下
User apache
Groupapache
//當你使用瀏覽器訪問web服務器時,會產生相應的httpd進程,該進程所屬的用戶和組就由這裏設定。
//從這裏開始,下面的設定適用於“主”服務器,與虛擬主機區別開來。但如果<VirtualHost>部分未設定這些值,也會使用這些值
ServerAdmin root@localhost //系統管理員的郵箱。改成自己的郵箱即可。
ServerName www.speedsnail.com //設置主機名。生產環境中,該主機名應該是能被正確解析成這臺服務器的IP的。
<Directory />
AllowOverride none
Require all denied
</Directory>
//<Directory 目錄路徑>和</Directory>:用於設定指定目錄(這裏是系統根目錄)的訪問權限。目錄路徑那裏可以使用絕對
//路徑和相對路徑,還可以搭配使用通配符和正則表達式。
//AllowOverride:如果指定目錄下(這裏是系統根目錄)存在一個.htaccess文件,那麼AllowOverride設定的是,該文件裏面的
//設置是否能夠覆蓋<Directory>這部分的設置,或該文件裏面的設置可以覆蓋的是<Directory>這部分的哪些設置。none表示不
//允許進行覆蓋。
//Require:設定哪些用戶可以訪問該目錄(這裏是系統根目錄)。all denied表示不允許訪問該目錄。
DocumentRoot "/var/www/html"
//設定網頁存放目錄。比如說,訪問http://host/index.html實際上就是訪問這個host的/var/www/html/index.html這個文檔。
<Directory "/var/www">
AllowOverride None
Require all granted //all granted表示可無條件訪問該目錄。
</Directory>
<Directory"/var/www/html">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
//Options:用於設定在該目錄中哪些特性可用。FollowSymLinks,讓該目錄下的符號鏈接可以生效。默認這裏還有個Indexes選
//項,建議拿掉。它的作用是,當瀏覽器訪問該目錄(而非該目錄下的某一個檔案)時,如果該目錄下沒有默認網頁(如index.html),
//那麼此時就會返回該目錄下的文件名列表。
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
//<IfModule 模塊>和</IfModule>:如果Apache有加載這裏指定的模塊,那麼Apache就會對它們之間的語句進行處理。
//也可以使用<IfModule!模塊>和</IfModule>,那麼就表示沒有加載指定的模塊時才進行處理。
//這裏的模塊可以是模塊ID(如rewrite_module),也可以是模塊文件名(如mod_rewrite.c)。
//DirectoryIndex:這就是設置默認網頁的,即當瀏覽器訪問某一個目錄時,會返回該目錄下的index.html文件(如果存在的話)。
//也可以接多個檔名,如DirectoryIndexindex.html index.htm index.cgi index.pl,這樣就會返回找到的第一個文件。
<Files ".ht*">
Require all denied
</Files>
//<Files 文件名>和</Files>:對指定文件名的文件應用這裏指定的語句。
//這裏的語句的意思是:任意目錄下,文件名符合.ht*的文件都會被禁止訪問。
ErrorLog "logs/error_log" //錯誤日誌所在文檔爲/etc/httpd/logs/error_log
LogLevel warn //設置日誌記錄級別
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b\"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b\"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined //客戶端訪問服務器的日誌會記在/etc/httpd/logs/access_log
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
//ScriptAlias會將URL路徑映射到指定目錄,並且讓該目錄具有CGI腳本執行權限(因此CGI腳本都可放置在該目錄下)。
//以這裏的設定舉個例子,假如在瀏覽器中輸入http://example.com/cgi-bin/foo,此時就會執行/var/www/cgi-bin/foo這個
//CGI腳本。
<Directory"/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module> //這部分是關於MIME的
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset Off
//AddDefaultCharset會強制客戶端瀏覽器使用指定的字符集編碼方式。這可能會有問題,所以要將它關閉。實際上,所使用的編
//碼方式在網頁裏有聲明。
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on //允許Apache使用系統核心支持的sendfile來傳送文件給客戶端
IncludeOptional conf.d/*.conf //在/etc/httpd/conf.d目錄下以.conf結尾的配置文件也會被讀取
從上面也可以知道,默認情況下,網頁文檔可以放置在/var/www/html目錄下,CGI腳本可以放置在/var/www/cgi-bin目錄下;錯誤日誌在/etc/httpd/logs/error_log,訪問日誌在/etc/httpd/logs/access_log。
設定好配置文件後,要測試配置文件語法有沒有問題,可使用命令:
[root@localhost ~]#apachectl configtest
然後,重啓httpd服務:
[root@localhost ~]# systemctl restart httpd
安裝PHP
使用以下命令安裝PHP軟件:
[root@localhost ~]# yum install php
從上圖可以看到,安裝的PHP版本爲5.4版。
安裝完成後,PHP會生成配置文件/etc/httpd/conf.d/php.conf,因爲該配置文件在/etc/httpd/conf.d目錄下,所以它會被Apache所讀取。PHP還會生成配置文件/etc/httpd/conf.modules.d/10-php.conf,該配置文件也會被Apache所讀取,它的設定讓Apache可以加載PHP模塊。不過,PHP軟件本身的配置文件其實是/etc/php.ini。
下面介紹一下配置文件/etc/httpd/conf.d/php.conf:
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
//<FilesMatch 正則表達式>和</FilesMatch>:文件名與正則表達式相匹配的文件,將適用這裏設定的語句。
//SetHandler:強制所有匹配的文件使用指定handler進行處理。
AddType text/html .php //設定擴展名爲.php的檔案的類型爲text/html
DirectoryIndex index.php //默認網頁檔名增加index.php
php_value session.save_handler"files"
php_value session.save_path "/var/lib/php/session"
下面介紹一下配置文件/etc/httpd/conf.modules.d/10-php.conf:
<IfModule prefork.c>
LoadModule php5_module modules/libphp5.so
</IfModule>
//如果Apache使用的多處理模塊(MPM)是prefork(默認),那麼Apache就會加載LoadModule指定的模塊(PHP模塊)
最後,來看看配置文件/etc/php.ini。在該文件的開頭處,有說明針對生產環境和開發環境,有一些設定值可以進行修改,以提高PHP的效能。假設該web服務器是用於生產環境的,將下面的這些設定值改成這樣(或確認這些設定值是這樣的):
display_errors = Off //當發生錯誤時,不將錯誤信息顯示出來(到瀏覽器上)
display_startup_errors = Off //不將PHP啓動時發生的錯誤信息顯示出來(到瀏覽器上)
error_reporting = E_ALL &~E_DEPRECATED & ~E_STRICT //這一項設定PHP會告知的錯誤或信息類型
html_errors = On //當PHP顯示或記錄錯誤信息時,將該信息格式化成HTML格式
log_errors = On //這讓PHP可以將錯誤信息日誌記錄到日誌文件裏
ignore_repeated_errors = On //忽略重複的錯誤信息
ignore_repeated_source = On //當忽略重複的錯誤信息時忽略信息源
post_max_size = 25M //PHP所允許的POST數據的最大值。可按照需要進行調整
file_uploads = On //允許文件上傳,默認爲On
upload_max_filesize = 20M //上傳文件所允許的最大值。可按照需要進行調整
memory_limit = 128M //PHP可用的最大內存。可按照需要進行調整
然後,重啓httpd服務:
[root@localhost~]# systemctl restart httpd
爲了測試Apache能不能正常調用PHP,在/var/www/html目錄下新建一個phpinfo.php文檔,內容如下所示:
其中的<?php ?>是PHP程序的語法,phpinfo ();則是PHP程序提供的一個函式庫,該函式庫可以顯示出你這個web服務器的相關信息。然後,使用瀏覽器來訪問服務器的這個文件,看看頁面能不能正常打開。如果正常的話,應該可以看到下面這個頁面:
測試完後,因爲這個頁面裏面的信息還挺重要的,所以應該把phpinfo.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 ~]# yum localinstall 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
查看mysqld服務偵聽端口:
[root@localhost ~]# netstat -atulpn | grep mysqld
如上圖所示,MySQL偵聽tcp端口3306。但因爲防火牆並未放通該端口,所以從其它設備上是無法訪問本服務器的MySQL數據庫的。但因爲這裏的MySQL也僅是提供給本機的PHP使用的,所以也就不必放通tcp端口3306。
根據MySQL官方手冊,建議安裝完MySQL數據庫後使用下面的命令來增強數據庫的安全性:
[root@localhost ~]# mysql_secure_installation
該命令程序可以協助你設置數據庫root賬號的密碼,移除匿名用戶賬號,是否允許遠程登錄root賬號,移除自帶的test數據庫,最後還會問你是否要重新加載特權表以讓修改生效。我是設置了數據庫root賬號密碼,其它的都選是(Y)。
如果不想使用上面的命令,那可以使用下面的命令來給root賬號設置密碼,回車後它會提示你輸入密碼的:
[root@localhost ~]# mysqladmin -u root password
如果要修改root賬號的密碼,可使用下面的命令,回車後,它會提示你輸入密碼,然後再設置新密碼:
[root@localhost ~]# mysqladmin -u root -p password
補充說明 :上面那兩個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賬號進入MySQL管理後臺,它會提示你輸入密碼:
[root@localhost ~]# mysql -u root –p
創建本地用戶:
mysql> create user '用戶名'@'localhost' identified by '密碼';
創建新數據庫:
mysql> create database 數據庫名;
將指定數據庫的所有權限授給指定用戶:
mysql> grant all privileges on 數據庫名.* to '用戶名'@'localhost';
刷新系統權限表:
mysql> flush privileges;
進入mysql數據庫(系統自帶),並查詢是否存在指定用戶(如果有出現一堆東西,則表明存在):
mysql> use mysql;
mysql> select * from user where user = '用戶名';
如果要刪除本地用戶,使用:
mysql> drop user '用戶名'@'localhost';
如果要刪除數據庫,使用:
mysql> drop database 數據庫名;
查看存在的數據庫:
mysql> show databases;
退出MySQL管理後臺:
mysql> exit
下面爲實際所進行的操作:
[root@localhost ~]# mysql -u root -p
Enter password:
mysql> create user'myuser'@'localhost' identified by '1234'; //新建本地用戶myuser,密碼爲1234
mysql> create database mydb; //新建數據庫mydb
mysql> grant all privileges on mydb.*to myuser@localhost; //將數據庫mydb的所有權限授權給本地用戶myuser
mysql> flush privileges; //刷新系統權限表
mysql> use mysql; //進入數據庫mysql(該數據庫爲系統自帶)
mysql> select * from user where user ='myuser'; //查詢數據庫mysql中是否存在用戶myuser
mysql> show databases; //顯示所有已有的數據庫
mysql> exit
上面設定好後,就可以使用myuser這個賬號登錄MySQL了,並且可以發現該用戶擁有一個數據庫mydb。
關於MySQL,還需要知道:
/etc/my.cnf:這是MySQL的配置文件。不過,因爲我還玩不轉MySQL,所以先暫時不動它。
/var/lib/mysql:這是數據庫實際存放目錄。毫無疑問,不能刪,並且,要注意,給予其所在分區足夠的容量。
/var/log/mysqld.log:這是MySQL的錯誤日誌文件。
安裝php-mysql
php-mysql是一個用於讓PHP程序使用MySQL數據庫的模塊。要安裝該模塊,使用命令:
[root@localhost ~]# yum install php-mysql
然後,重啓httpd服務:
[root@localhost ~]# systemctl restart httpd
爲了測試PHP能否連接到MySQL數據庫,在/var/www/html目錄下新建一個文檔test.php。因爲之前已經在MySQL中新建了一個數據庫mydb,並給這個數據庫建了個用戶myuser,密碼是1234,所以test.php的內容是這樣的:
[root@www ~]# vim /var/www/html/test.php
<?php
$mydbhost = 'localhost'; //數據庫服務器
$mydbuser = 'myuser'; //用戶名
$mydbpwd = '1234'; //密碼
$mydbname = 'mydb'; //數據庫名稱
$db =mysql_connect($mydbhost,$mydbuser,$mydbpwd) or die(‘Cannot find the database.’);
mysql_select_db($mydbname,$db) or die(‘Cannotconnect the database.’);
?>
Everything is OK!
上面這個測試頁面的內容純粹是我百度出來的,不過測試後的確有用。在瀏覽器中訪問test.php這個頁面,如果測試失敗的話(可以試着改一下用戶名或數據庫名稱),那麼就會顯示Cannot find the database或Cannot connect the database;如果測試成功的話,就會顯示Everythingis OK!。如下所示:
不過,雖然測試成功了,但查看Apache的錯誤日誌文件,還是發現有報錯“mysql_connect():Headers and client library minor version mismatch”。百度了一下,說是使用PHP5運行舊式PHP程序代碼出現的兼容性問題。解決方法是,使用php-mysqlnd模塊來代替php-mysql模塊。即執行yum remove php-mysql和yum install php-mysqlnd,然後重啓httpd服務。然後再測試,發現的確沒有再報錯。不過,因爲我不是網頁開發人員,所以暫時不確定使用php-mysqlnd這個模塊會不會有什麼其它的問題,所以就只是把這個問題寫在這了。
修改SELinux規則
有可能未來Apache需要進行聯機工作,那麼就先修改一下,讓SELinux規則放行:
[root@www ~]# setsebool -P httpd_can_network_connect=1
然後確認一下修改是否生效:
[root@www ~]# getsebool httpd_can_network_connect
安裝PHP緩存器XCache
其實,到上面那裏爲止,基本的LAMP平臺已經架設好了。但爲了優化LAMP平臺,所以還需要進行一些工作。XCache是一款開源的PHP緩存器/優化器,它通過把編譯 PHP 後的數據緩衝到共享內存從而避免重複的編譯過程, 使客戶端訪問時服務器能夠直接使用緩衝區已編譯的代碼從而提高速度,同時降低服務器負載。到我寫這篇文章爲止,XCache最新的版本爲3.2.0。我選擇使用官網提供的源碼來安裝XCache。
由於我這臺服務器在安裝系統時是以最小化模式安裝的,所以要使用源碼,得先安裝編譯器:
[root@www ~]# yum install gcc
再安裝php-devel,它用於讓PHP可以支持擴展工具(如XCache):
[root@www ~]# yum install php-devel
然後,使用XCache官網提供的源碼來安裝XCache:
[root@www ~]# wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz
[root@www ~]# tar -zxfxcache-3.2.0.tar.gz
[root@www ~]# cd xcache-3.2.0
[root@www xcache-3.2.0]# phpize --clean
[root@www xcache-3.2.0]# phpize
[root@www xcache-3.2.0]# ./configure--enable-xcache
[root@www xcache-3.2.0]# make
[root@www xcache-3.2.0]# make install
[root@www xcache-3.2.0]# cat xcache.ini>> /etc/php.ini
//千萬注意,有兩個>號,表示把xcache.ini的配置追加到php.ini後面。如果只有一個>號,會把php.ini原有的配置覆蓋掉。
//建議在操作前可以先備份/etc/php.ini文件。
然後,重啓httpd服務:
[root@www ~]# systemctl restart httpd
這樣就安裝完了,那怎麼確認XCache有沒有正常運行呢。在我這篇文章的前面部分,不是有使用一個phpinfo.php頁面嗎?就打開那個頁面,搜索xcache,應該可以搜索到關於XCache的相關信息,可以看到XCache是enabled的:
另外,其實XCache有提供管理後臺。如果要使用XCache管理後臺,可以這樣做。首先,在/var/www/html目錄下新建一個檔案,假設爲account.php,將這個檔案的內容該成如下所示:
[root@www ~]# vim/var/www/html/account.php
<?php
echo md5("1234"); //雙引號內可以填入你想要使用的密碼
?>
然後,從瀏覽器訪問這個頁面,可以得到一串數字和字母的組合,我得到的是81dc9bdb52d04dc20036dbd8313ed055。然後,再修改/etc/php.ini中的這兩個設定的值:
xcache.admin.user ="admin" //雙引號內可以填入你想要使用的用戶名
xcache.admin.pass ="81dc9bdb52d04dc20036dbd8313ed055" //雙引號內填入剛剛得到的那串組合
再將XCache安裝包裏面的htdocs整個目錄複製到/var/www/html目錄下:
[root@www ~]# cp -a/root/xcache-3.2.0/htdocs /var/www/html
修改目錄htdocs及其子目錄和檔案的所屬用戶和組,我選擇將其都改爲root:
[root@www ~]# chown -R root:root/var/www/html/htdocs
使用restorecon命令來重置目錄htdocs及其子目錄和檔案的SELinux相關設定:
[root@www ~]# restorecon -Rv/var/www/html/htdocs
最後,使用瀏覽器訪問地址http://服務器IP/htdocs/,然後輸入你設定的用戶名和密碼,就可以打開XCache的管理後臺了:
補充信息:關於重啓httpd服務
有三種方法可以重啓httpd服務:
1、 若要完全重啓httpd服務:
[root@localhost ~]# systemctl restart httpd.service
該命令會中斷正在運行的httpd進程。在安裝或移除一個動態加載模塊(如PHP)後,需要使用此命令。
2、 讓httpd服務重新讀取它的配置文件:
[root@localhost ~]# systemctl reload httpd.service
該命令會讓httpd重新加載配置文件,同時也會中斷httpd進程的運行。
3、 讓httpd服務重新讀取它的配置文件並且不影響httpd服務的運行:
[root@localhost ~]# apachectl graceful
該命令會讓httpd重新加載配置文件,並且不會中斷httpd服務。但現有的http請求將會繼續使用舊的配置。