Fedora 15搭建LAMP环境中可能遇到的问题
LAMP是Linux + Apache + MySQL + PHP这组黄金组合的简称,在网站开发中极为流行。在Fedora这个红帽系的Linux发行版下面搭建LAMP环境是非常简单的,只需要使用yum就可以轻松安装Apache、MySQL以及PHP。但是实际上仅仅使用yum安装这些东西往往是不够的,譬如你可能会发现你所安装的PHP缺少很多扩展,或者MySQL数据库里的表名存在大小写敏感不符合你的习惯,或者在Apache对文件的读写权限上遇到一些非所期的结果,等等。这篇文章记录了一些我在自己的Fedora 15系统上搭建LAMP环境时所遇到的问题和最后的解决方法,因为我这人比较懒散,所以这些方法都是我自己看来最简单的解决方法。其他Linux发行版也可以以此为参考(只是参考!)。
索引:
-
Apache
- 安装Apache(yum安装)
- 诡异的写权限
-
PHP
- 安装PHP(yum安装)
- 安装扩展(mbstring,gd,xmlwriter)
-
MySQL
- 安装MySQL(yum安装)
- MySQL表名大小写敏感
- 安装phpMyAdmin
Apache
安装Apache
安装Apache服务器(httpd)可以下载源码在自己的系统上编译,也可以直接使用yum安装已经编译好的版本。这里推荐直接使用yum安装已经编译好的版本,安装简单,更新也很方便。使用yum安装Apache服务器的命令如下:
1
|
sudoyuminstallhttpd
|
启动httpd的命令如下:
1
|
sudoservice httpd start
|
或者:
1
|
sudo /etc/init.d/httpd start
|
默认情况下网站路径是/var/www/html。如果你在该目录下新建一个xxx.html,那么就可以通过http://localhost/xxx.html来查看该网页。
如果在你自己的电脑上你可以访问自己的网站,但是通过别人的却不可以,很有可能是你的防火墙关闭了80端口,把它打开即可。
可以使用chkconfig命令设置httpd为开机自动启动:
1
|
sudochkconfig--level235httpd
|
关于chkconfig的详细信息可以参考:
http://www.linuxidc.com/Linux/2011-08/40085p4.htm
诡异的写权限
这是个曾经折腾了我半天的问题。具体来说,便是在自己的LAMP环境下搭建一个现成的PHP程序,但是在运行它的安装脚本的时候被提示某些目录是不可写的。举例来说,提示/var/www/html/something这个目录不可写,那么执行chmod命令:
1
|
sudo chmoda+w /var/www/html/something
|
然后使用ls命令查看该目录的权限:
1
|
ls-al/var/www/html
|
你所看到的something目录的权限可能是drwxrwxrwx,也有可能是其他的,但只要有3个w,就说明chmod命令执行成功了,那么理论上这个目录已经是可写的了。但是运行安装脚本的时候提示并没有消失,于是尝试递归的chmod命令:
1
|
sudo chmod-Ra+w /var/www/html/something
|
这也不能为我们的情况带来什么改善。有人说可能是Apache服务器的用户的权限问题,例如在httpd的目录下新建一个php文件,里面加入如下的php代码:
1
|
<?phpechoexec('whoami');?>
|
得到的结果是apache。打开/etc/httpd/conf/下的httpd.conf文件,可以看到里面有对用户信息的记载:
1
2 |
User apache
Group apache |
于是又尝试了用chown命令把文件所有者变更为apache:
1
|
chown-Rfapache.apache/var/www/html/something
|
结果依然是令人失望的。就在山穷水尽的时候,经人点拨,才恍然意识到问题的根本所在——根本不是文件读写权限设置上出了什么问题,一切的始作俑者是SELinux!
于是尝试关掉SELinux:
1
|
sudosetenforce0
|
结果终于成功了!如此结果实在是令人生疼啊!“睫在眼前长不见”,“蓦然回首,那人却在灯火阑珊处”,盖此之谓也!
PHP
安装PHP
安装PHP可以下载源码在自己的系统上编译,也可以直接使用yum安装已经编译好的版本。
这里推荐直接使用yum安装已经编译好的版本,安装简单,更新也很方便。不过这种方法安装的PHP有一个缺点,那就是缺少很多扩展,不过这并不是什么无法弥补的事情,我们完全可以再根据需求安装那些需要使用的扩展,安装扩展的方法将会在下面一部分里介绍。
使用yum安装PHP的命令如下:
1
|
sudoyuminstallphp
|
如果权限不足请使用su或sudo命令。
安装扩展无论是使用源码编译安装的还是使用yum安装的PHP,都有可能面临需要安装一些扩展的情况。这里介绍一下通常情况下为PHP安装扩展的方法。
首先以mbstring为例。你可以在编译PHP的时候使用–enable-mbstring**这项扩展,但如果你在编译的时候并没有**它,或者你的PHP是使用yum安装的,那么你就需要再安装该扩展。
幸运的是mbstring扩展也是可以直接通过yum安装的,命令如下:
1
|
sudoyuminstallphp-mbstring
|
不过仅仅这条命令是不够的,还需要在PHP的配置文件中**这项插件。默认情况下,PHP的配置文件路径是/etc/php.ini。你需要调用管理员权限来编辑该文件,譬如像这样:
1
|
sudo vim /etc/php.ini
|
在php.ini中找到Dynamic Extensions这一块,譬如,在vim中你可以使用如下命令:
1
2 |
gg
/Dynamic Extensions |
然后在这一块的末尾添加一行内容:
1
|
extension=mbstring.so
|
这样mbstring这项扩展就被加载到PHP当中了。不过可能你需要在终端中重启Apache才能看到它被**:
1
|
sudoservice httpd restart
|
或者
1
|
sudo /etc/init.d/httpd restart
|
下面的PHP代码可以显示php的相关信息:
1
|
<?phpechophpinfo();?>
|
如果安装成功的话你应该可以在上面的代码输出的结果里找到mbstring的相关信息。此外其他扩展也是同样的道理,像gd,或者xmlwriter。先用yum安装,再在/etc/php.ini里配置下就好了。
gd的安装命令如下:
1
|
sudoyuminstallphp-gd
|
xmlwriter则是在php-xml当中:
1
|
sudoyuminstallphp-xml
|
/etc/php.ini里的相关内容如下:
1
2 |
extension=gd.so
extension=xml.so |
MySQL
安装MySQL
继续按照我们懒人的惯例,只介绍使用yum安装MySQL的方法。
1
|
sudoyuminstallmysql mysql-server php-mysql
|
其中mysql只是MySQL的客户端程序,想要拿自己的机器做数据库服务器还要安装mysql-server;而php-mysql则是在php中用来连接MySQL数据库的模组,不过奇怪的是我不记得有在php里为php-mysql做任何配置就可以正常使用,所以此处是否需要配置什么暂且存疑。
启动mysql-server的方法是:
1
|
sudoservice mysqld start
|
或者:
1
|
sudo /etc/init.d/mysqld start
|
同样可以使用chkconfig命令把mysqld服务设置为开机自动启动:
1
|
sudochkconfig--level235mysqld
|
默认情况下自己的MySQL是没有密码的,可以直接使用root账户登录:
1
|
mysql-uroot
|
当然最好还是给自己的MySQL的root账户设一个密码,方法是用上面的指令登录MySQL,然后使用输入下面的命令:
1
2 3 |
USEmysql;
UPDATEuserSETPassword=PASSWORD("your password")WHEREUser="root"; FLUSHPRIVILEGES; |
曾经在Windows上使用MySQL的用户初次尝试Linux上的MySQL存在一个很疼的表名大小写敏感问题,这个只是一个设置问题,如果不习惯的话完全可以把它修改为无视大小写。
方法很简单,只要使用文本编辑器打开/etc/my.cnf文件,譬如:
1
|
sudo vim /etc/my.cnf
|
在mysqld这一块的末尾添加如下一句:
1
|
lower_case_table_names=1
|
然后保存并退出,并重新启动mysqld服务:
1
|
sudoservice mysqld restart
|
或者
1
|
sudo /etc/init.d/mysqld restart
|
然后再打开MySQL,就会发现再创建表和查询表的时候,表名一律被变成小写了!
安装phpMyAdmin常用的图形化数据库管理和查询工具phpMyAdmin也可以直接通过yum安装:
1
|
sudoyuminstallphpMyAdmin
|
然后重新启动httpd,就可以通过http://localhost/phpmyadmin来查看你的数据库了!
chkconfig: 管理系統服務預設開機啟動與否
[[email protected] ~]# chkconfig --list [服務名稱]
[[email protected] ~]# chkconfig [--level [0123456]] [服務名稱] [on|off]
選項與參數:
--list :僅將目前的各項服務狀態列出來
--level:設定某個服務在該 level 下啟動 (on) 或關閉 (off)
範例一:列出目前系統上面所有被 chkconfig 管理的服務
[[email protected] ~]# chkconfig --list |more
NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off
acpid 0:off 1:off 2:off 3:on 4:on 5:on 6:off
....(中間省略)....
yum-updatesd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
xinetd based services: <==底下為 super daemon 所管理的服務
chargen-dgram: off
chargen-stream: off
....(底下省略)....
# 你可以發現上面的表格有分為兩個區塊,一個具有 1, 2, 3 等數字,一個則被 xinetd
# 管理。沒錯!從這裡我們就能夠發現服務有 stand alone 與 super daemon 之分。
範例二:顯示出目前在 run level 3 為啟動的服務
[[email protected] ~]# chkconfig --list | grep '3:on'
範例三:讓 atd 這個服務在 run level 為 3, 4, 5 時啟動:
[[email protected] ~]# chkconfig --level 345 atd on
瞧! chkconfig 是否很容易管理我們所需要的服務呢?真的很方便啦~ 你可以輕鬆的透過 chkconfig 來管理 super daemon 的服務喔!另外,你得要知道的是, chkconfig 僅是設定開機時預設會啟動的服務而已, 所以該服務目前的狀態如何是不知道的。我們舉個底下的例子來說明好了:
範例四:先觀察 httpd ,再觀察預設有無啟動,之後以 chkconfig 設定為預設啟動
[[email protected] ~]# /etc/init.d/httpd status
httpd 已停止 <==根本就沒有啟動
[[email protected] ~]# chkconfig --list httpd
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# 原因是預設並沒有啟動啊!
[[email protected] ~]# chkconfig httpd on; chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# 已經設定為『開機預設啟動』了,再來觀察看看到底該服務啟動沒?
[[email protected] ~]# /etc/init.d/httpd status
httpd 已停止
# 哈!竟然還是沒有啟動喔!怎麼會這樣啊?
上面的範例四並沒有啟動 httpd 的原因很簡單,因為我們並沒有使用 /etc/init.d/httpd start 嘛!我們僅是設定開機時啟動而已啊!那我們又沒有重新開機,所以當然使用 chkconfig 並不會導致該服務立即被啟動!也不會讓該服務立即被關閉,而是只有在開機時才會被載入或取消載入而已喔。而既然 chkconfig 可以設定開機是否啟動,那麼我們能不能用來管理 super daemon 的啟動與關閉呢?非常好!我們就來試看看底下的案例:
範例五:查閱 rsync 是否啟動,若要將其關閉該如何處理?
[[email protected] ~]# /etc/init.d/rsync status
-bash: /etc/init.d/rsync: No such file or directory
# rsync 是 super daemon 管理的,所以當然不可以使用 stand alone 的啟動方式來觀察
[[email protected] ~]# netstat -tlup | grep rsync
tcp 0 0 192.168.201.110:rsync *:* LISTEN 4618/xinetd
tcp 0 0 www.vbird.tsai:rsync *:* LISTEN 4618/xinetd
[[email protected] ~]# chkconfig --list rsync
rsync on <==預設啟動呢!將它處理成預設不啟動吧
[[email protected] ~]# chkconfig rsync off; chkconfig --list rsync
rsync off <==看吧!關閉了喔!現在來處理一下 super daemon 的東東!
[[email protected] ~]# /etc/init.d/xinetd restart; netstat -tlup | grep rsync
最後一個指令你會發現原本 rsync 不見了!這樣是否很輕易的就能夠啟動與關閉你的 super daemon 管理的服務呢!