Jun 19

Mac OS X 是由美国苹果公司开发的操作系统,通常它运行在如 MacBook、Mac 等个人电脑中。事实上,经过适当的配置以及软件的安装,也可以以 Mac OS X 为基础构建服务器。这里就来介绍一下如何在 Mac OS X 运行 Web 服务器。由于 Mac OS X 内置了 Apache 和 PHP,因此,几乎非常少的配置即可让 Web 服务运行在 Mac OS X 上。不过,这种非常少的配置是需要用户具有比较良好的 Unix 使用经验做基础的,后面的介绍也基本围绕着这种方式展开的。由于 Mac OS X 是一款非常优秀的操作系统,想要把 Web 服务的配置变得平易近人,也是非常容易的。OS X Server 就为用户提供了诸如 Web 服务、VPN 服务、FTP 服务等简明的图形化操作,有需要的用户可去 App Store 下载、安装 Server.app。除此而外,单就 Web 服务而言,另有 XAMPP、MAMP Pro 等已经打包好的开箱即用软件可供使用。

一、启动 Apache

在 Mac OS X 10.8 以前启动 Apache 很简单,只需在系统设置偏好(System Preferences)中设置 Web 共享(Web Sharing)即可。不过自 Mac OS X 10.8 以后,Web 共享(Web Sharing)取消了。因此,启动 Apache 需采用下述方法,先打开终端(Terminal.app),然后在终端运行

$ sudo apachectl start

再输入帐号密码,这样 Apache 就运行了。为了确认 Apache 是否正常工作,可在浏览器中输入 http://127.0.0.1 ,或者在终端输入

$ open http://127.0.0.1 &

正常情况下,就可以看到一个内容为 “It works!” 的页面,该页面对应 /Library/WebServer/Documents/index.html.en 文件。其中,/Library/WebServer/Documents/ 是 Apache 的默认(系统级)根目录。若想获知 Apache 的版本,可运行

$ apachectl -v
Server version: Apache/2.2.26 (Unix)
Server built:   Jun 20 2014 13:57:09

便会看到 Mac OS X 自带 Apache 版本信息。 为了更好的配置 Apache 服务,这里再来指出几个非常重要的文件与目录。第一个是 Apache 服务的配置文件目录,位于 /etc/apache2,里面包含了 Apache 服务的基本配置文件 httpd.conf。/etc/apache2 中还有很多其他文件和目录,在后面会陆续涉及到其中的一些。第二个是管理 Apache 服务的启动、停止等配置的文件,位于 /Library/LaunchDaemon/org.apache.plist。第三个是 Apache 的日志文件目录,位于 /var/log/apache2/,如果 Apache 启动后有任何问题,记得去这个地方看看,兴许就能找到解决问题的蛛丝马迹。

二、开启 PHP 支持

在终端中运行

$ sudo nano -w /etc/apache2/httpd.conf

打开 Apache 的配置文件,找到如下的行

#LoadModule php5_module libexec/apache2/libphp5.so

把前面的#号去掉,也即

LoadModule php5_module libexec/apache2/libphp5.so

保存 Apache 的配置文件。该来配置 PHP 了,首先查看 PHP 的配置文件 /etc/php.ini 是否存在,若没有的话,请运行

$ sudo cp /etc/php.ini.default /etc/php.ini

适当的调整一下配置,通过编辑 /etc/php.ini 文件,也即

$ sudo nano -w /etc/php.ini

来配置各种 PHP 功能。比如:

;调整时区
date.timezone = "Asia/Shanghai"
;通过 display_errors 来控制是否显示 PHP 程序的报错信息,这在调试 PHP 程序时非常有用
display_errors = Off

再来看一下 PHP 与 Apache 的整合配置文件:

$ sudo nano -w /etc/apache2/other/php5.conf
<IfModule php5_module>
    AddType application/x-httpd-php .php 
    AddType application/x-httpd-php-source .phps

    <IfModule dir_module>
        DirectoryIndex index.html index.php
    </IfModule>
</IfModule>

为了让所有的配置生效,需运行

$ sudo apachectl restart

重启 Apache,这样 PHP 就可以用了。

为了测试 Apache 服务器上的 PHP 是否正常工作,可在终端中运行

$ mkdir -p ~/Sites

来创建 Apache 的用户级根目录,随后再在用户级根目录中新建一个 info.php 文件

$ cat > info.php << EOF
<?php
    phpinfo();
?>
EOF

不妨假设 Mac OS X 系统用户 james 便是 Apache 服务的主要使用者,以上 Apache 的用户级根目录都是在 james 用户的家目录创建的。于是,在 Mac OS X 的浏览器 Safari 的地址栏中输入 http://127.0.0.1/~james/info.php,或者

$ open http://127.0.0.1/~james/info.php &

便会看到有关 PHP 的信息,比如 Mac OS X 10.9 中内置 PHP 版本号是 5.3.13。

三、安装 MySQL

由于 Mac OS X 没有内置 MySQL,所以需要手动安装,可从 MySQL 的官方网站 http://mysql.com/downloads/mysql/MySQL 下载。目前 MySQL 的最稳定版本是 5.6,选择合适版本,如这里选择了 mysql-5.6.16-osx10.7-x86_64.dmg。进入下载页面,会提示注册 Oracle 帐号或者以 Oracle 帐号登录;当然,也可选择 “No thanks, just start my download.” 直接下载,例如

$ curl -O http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.16-osx10.7-x86_64.dmg

打开下载的 dmg 文件,会发现里面有 4 个文件,分别是 mysql-5.6.16-osx10.7-x86_64.pkg、MySQLStartupItem.pkg、MySQL.prefPane 与 ReadMe.txt。首先点击安装 mysql-5.6.16-osx10.7-x86_64.pkg,这是 MySQL 主安装包。一般情况下,安装文件会自动把 MySQL 主程序安装到 /usr/local 下。为了让 MySQL 在 Mac OS X 开机时自动启动,安装包里提供了 MySQLStartupItem.pkg,安装它。有了它,可以在终端控制 MySQL 的运行、重启以及关闭之类,例如

$ sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
$ sudo /Library/StartupItems/MySQLCOM/MySQLCOM restart
$ sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop

若想以图形界面方式管理 MySQL 的启动,可安装包里的 MySQL.prefPane。安装它之后,就可在“系统设置偏好”中看到 MySQL 的图标,通过它就可以控制 MySQL 是否开启以及开机时是否自动运行。另外,使用 PHP 连接 MySQL 可能会报错

Can’t connect to local MySQL server through socket ‘/var/mysql/mysql.sock‘

或使用 localhost 无法连接 MySQL 而需要 127.0.0.1,原因是连接时 PHP 默认去找 /var/mysql/mysql.sock,但 MAC 版的 MySQL 改动了文件位置,放在 /tmp 下了。处理办法是按如下修改 php.ini:

$ nano -w /etc/php.ini
mysql.default_socket = /tmp/mysql.sock

到这里 MySQL 就基本安装完毕了。 通过运行

$ sudo echo /usr/local/mysql/bin >> /etc/paths.d/80-mysql

将 mysql 的路径加入系统环境变量 PATH 中;当然,也可以代之以用户级环境变量设置,例如

$ echo "export PATH=/usr/local/mysql/bin:\$PATH" >> ~/.bashrc'

这样就可以在终端中比较简单地通过命令进行相应的操作。 在 MySQL 没有启动时,直接运行 mysql 或 mysqladmin 命令会提示

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

这就需要我们先通过控制面板或者直接运行

$ sudo /usr/local/mysql/support-files/mysql.server start
$ sudo /usr/local/mysql/support-files/mysql.server restart

命令来启动 MySQL,之后再运行 mysql 或 mysqladmin 命令就正常了。比如安装完毕后,MySQL 的 root 默认密码为空,如果要设置密码可以在终端运行

$ mysqladmin -u root password "mysqlpassword"

来设置,其中 mysqlpassword 即 root 的密码。再如查看 MySQL 的版本

$ mysql -V

注意:Mac OS X 的升级或其他原因可能会导致 MySQL 启动或开机自动运行时,在 MySQL 操作面板上会提示 “Warning:The /usr/local/mysql/data directory is not owned by the ‘mysql’ or ‘_mysql’”,这应该是某种情况下导致 /usr/local/mysql/data 的宿主发生了改变,只需要运行

$ sudo chown -R _mysql /usr/local/mysql/data

即可。 MySQL 的默认日志位于它的数据目录,也即 /usr/local/mysql/data 之中。不过默认的错误日志文件名是主机名生成的,稍作配置

$ sudo nano -w /usr/local/mysql/my.cnf
[mysqld]
log-error=/usr/local/mysql/data/mysqld.log

由于它与系统目录分离,因此 mysql 不会自动清除日志,可以使用它自带的 mysql-log-rotate 脚本,例如

$ sudo /usr/local/mysql/support-files/mysql-log-rotate

或手动编写脚本清除旧日志。

四、MAMP 的简单应用

1、WordPress 的配置

先通过下述命令行为 WordPress 创建一个名为 db_wordpress 的数据库,并设置数据库用户 wordpress_user、密码为 654321 以及对 WordPress 数据库赋予所有权限:

$ sudo mysql -uroot -p
mysql> create database db_wordpress;
mysql> grant all privileges on db_wordpress.* to 'wordpress_user'@'127.0.0.1' identified by '123456';
mysql> FLUSH PRIVILEGES;
mysql> EXIT

数据库创建完成之后,开始安装

$ curl -O http://wordpress.org/latest.zip
$ sudo unzip latest.zip -d /Library/WebServer/Documents/
$ sudo mv /Library/WebServer/Documents/wordpress/wp-config-sample.php /Library/WebServer/Documents/wordpress/wp-config.php

接着根据前面创建的数据库信息配置 WordPress:

$ sudo nano -w /Library/WebServer/Documents/wordpress/wp-config.php

// ** MySQL settings – You can get this info from your web host ** //
/** The name of the database for WordPress */
define(‘DB_NAME’, ‘db_wordpress‘);

/** MySQL database username */
define(‘DB_USER’, ‘wordpress_user‘);

/** MySQL database password */
define(‘DB_PASSWORD’, ‘123456‘);

/** MySQL hostname */
define(‘DB_HOST’, ‘127.0.0.1‘);

为了让所有的 WordPress 设置生效,需重启 Apache

$ sudo apachectl restart

在浏览器输入 http://127.0.0.1/wordpress 进入 WordPress;或者

$ open http://127.0.0.1/wordpress &

第一次进入 WordPress 时,需要完成它的初始化安装。欢迎来到 WordPress 的世界,当然,还有后续的管理工作要做,例如

$ sudo nano -w /Library/WebServer/Documents/wordpress/.htaccess
Options +FollowSymLinks

有关这些的介绍,请查阅官网的相关介绍。

2、MediaWiki 的配置

先为 MediaWiki 创建一个数据库,也即

$ sudo mysql -uroot -p
mysql> create database db_mediawiki;
mysql> grant all privileges on db_mediawiki.* to 'mediawiki_user'@'127.0.0.1' identified by '654321';
mysql> FLUSH PRIVILEGES;
mysql> EXIT

创建了名为 db_mediawiki 的数据库,设置用户 mediawiki_user,密码为 654321,对 MediaWiki 数据库赋予所有权限。数据库创建完成之后,开始安装 MediaWiki:

$ curl -O http://releases.wikimedia.org/mediawiki/1.22/mediawiki-1.22.3.tar.gz
$ tar zxvf mediawiki-1.22.3.tar.gz -C ~/Sites/

重启 Apache

$ sudo apachectl restart

让所有的 MediaWiki 设置生效。由于 MediaWiki 是安装在 Apache 的用户级根目录中,需在浏览器中输入 http://127.0.0.1/~james/mediawiki,或者

$ open http://127.0.0.1/~james/mediawiki 

第一次打开 MediaWiki 会需要输入相关信息,并点击 Install/Upgrade Database 完成最后的安装。安装完成之后,会生成 Localsetting.php。将它下载到本地,再将它复制到 ~/Sites/mediawiki 目录,也即

$ cp /path/to/Localsetting.php ~/Sites/mediawiki

设置访问权限如下

$ sudo nano -w /etc/apache2/users/mediawiki.conf
 Alias /mediawiki "/Users/james/Sites/mediawiki"

 <directory "/Users/james/Sites/mediawiki/">
       Options Indexes MultiViews FollowSymLinks
       AllowOverride None
       Order allow,deny
       Allow from all

 <directory "/Users/james/Sites/mediawiki/upload/">
    AllowOverride None
    AddType text/plain .html .htm .shtml
 # php_admin_flag engine off  # This doesn't seem to work.

  RewriteEngine on
  RewriteRule ^/wiki/en/(.*)$ /mediawiki/wiki.phtml?title=$1

至此,MediaWiki 站点基本完工了。

3. phpBB3 的配置

先为 phpBB3 创建数据库
$ mysql -u root -p
mysql> create database db_phpdb3;
mysql> grant all privileges on db_phpbb3.* to 'phpbb3_user'@'127.0.0.1' identified by '654123';
mysql> FLUSH PRIVILEGES;
mysql> EXIT
现在开始搭建 phpBB 论坛,目前 phpBB 的稳定版本是 3.0.12:
$ curl -O -J -L http://prdownloads.sourceforge.net/phpbb/phpbb-3.0.12.tar.bz2
将解压的 phpBB3 目录放到 ~/Sites 下:
$ tar jxvf phpbb-3.0.12.tar.bz2 -C ~/Sites
$ chmod 644 ~/Sites/phpbb/config.php
$ open http://127.0.0.1/~james/phpbb &
填写所连接数据库以及用户信息等。填写完成后开始安装。完成最后的安装之前,别忘了先将 phpBB 下的 install 目录删除
$ rm -rf ~/Sites/phpbb/install
 
本地化 phpBB,先到官方网站下载并解压语言包,例如下载简体中文包
$ curl -O -J -L https://www.phpbb.com/customise/db/download/id_91456
$ tar jxvf mandarin_chinese_simpliefied_script_1.0.3.tar.bz2
$ cd mandarin_chinese_simpliefied_script_1.0.3/mandarin_chinese(simpliefied_script)_1.0.3
$ cp -r * ~/Sites/phpbb/
后续操作,请参考 https://www.phpbb.com/kb/article/how-to-install-a-language-pack。

Jul 22

虽然 Fedora 作为服务器来用不是上佳的选择,不过拿来练手倒是上上之选。因为 Fedora 中的大多数 Web 服务除去安全性等方面需要多加注意之外,基本上属于即装即用型的。Fedora 上的 Web 服务器的搭建也有很多选择,而且都是一些非常成熟的组合。反正不能免俗,不妨选择最常用的 LAMP 组合作为 Web 服务器的基础。不过话说回来,物换星移,Fedora 19 以 MariaDB 替换了 MySQL,也算是必然趋势。尽管如此,这些对于普通用户的影响并不大,mysqld 还是那个 mysqld。 作为普通用户,这里主要介绍的是与 LAMP 服务器相关的一些应用。至于 LAMP 服务本身相关的网站开发、优化等内容,暂时没有时间也没有能力触及了。

下面主要的测试环境是 Fedora 19。其他环境中 Web 服务器安装大同小异,很容易自行调整。当然,在开始之前最好关掉 SELinux,具体来说

$ sudo nano -w /etc/sysconfig/selinux
SELINUX=disable

修改完之后需重启机器才能有效。为了免去重启机器,可执行

$ sudo setenforce 0

即可即时生效。

一、LAMP 的安装与测试

1. Apache 服务器的安装

Apache 是世界上非常流行的 Web 服务器软件之一,类似的还有lighttpd、Nginx、Tomcat 等。不过,Apache 功能强大,一直深受建站爱好者的喜爱。它的安装非常容易:

$ sudo yum install httpd

Apache 的配置文件位于 /etc/httpd 目录,其中 /etc/httpd/conf/httpd.conf 是其默认配置文件,默认虚拟主机的目录位于 /var/www/html,与 Apache 相关的 Web 应用的配置目录可能位于 /etc/httpd/conf.d/。下面启动 Apache 服务并让它随机器一起启动:

$ sudo service httpd start
$ sudo chkconfig httpd on

为了看看 Apache 有没有正常工作,先做一下本地测试。打开本地的网页浏览器,在地址栏输入 http://localhost。正常情况应该出现如下的页面:

2. MariaDB 数据库的安装

Linux 中的 SQL 数据库很多,例如 MariaDB(MySQL)、PostgreSQL、SQLite、Firebird 等。不过这里就只安装 MariaDB:

$ sudo yum install mariadb mariadb-server

MariaBD 服务的开启方法与 MySQL 一样:

$ sudo service mysqld start
$ sudo chkconfig mysqld on

实际上,MariaDB 的用法也与 MySQL 别无二致。例如,MariaDB 数据的默认账户是 root,它与 Linux 系统的 root 账户没有什么联系。通常,MariaDB 的默认账户是没有密码的,这对于数据库的管理来说是不安全的。给它设置一个密码,例如toor:

$ sudo mysqladmin -u root password toor

现在尝试在本地登录 MariaDB 数据库:

$ sudo mysql -u root -p

数据库一切正常。

3. 网页开发语言 PHP 的安装

网页开发语言众多,例如PHP、JSP、ASP等。不过在 Linux 下面,PHP 整合的相对好一些:

$ sudo yum install php

测试一下 PHP 是否正常工作?首先,在本地的 /var/www/html 目录新建如下的文件:

$ su -c 'echo > /var/www/html/info.php << EOF

<?php
    phpinfo();
?>
EOF'

接着,在本地浏览器的地址栏中输入 http://localhost/info.php。如果出现如下的页面,就说明 PHP 工作正常!

4. 整合Apache与PHP
 
具体的整合可能涉及到很多优化方面的内容,这里只谈非常常见的几点。
$ sudo nano -w /etc/httpd/conf/httpd.conf
先在
AddType application/x-gzip .gz .tgz
所在行的下面添加
AddType application/x-httpd-php .php .phtml
AddType applicatoin/x-httpd-php-source .phps
接着再将
   DirectoryIndex index.html
改为
    DirectoryIndex index.html index.htm index.php
修改完成后保存退出。
 
为了提升 PHP 安全性,可在 /etc/php.ini 中进行作如下设置
$ sudo nano -w /etc/php.ini
将下面这一行
disable_functions =
修改为:
disable_functions = phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server

5. 防火墙设置与 LAMP 的远程测试

Fedora 中默认防火墙的安全级别比较高,基本上关闭了所有的服务端口。为了让远程机器能够访问 LAMP 服务器,需要适当调整防火墙设置。Fedora 在程序菜单中提供了防火墙的图形界面工具,不过这里主要介绍防火墙的命令行设置方法。由于 iptables 的规则是有优先次序的,通常需要手动编辑 iptables 的配置文件 /etc/sysconfig/iptables。下面为了简单起见,直接清空防火墙的原先设置,完全重写了所有的 iptables 规则。因此,使用下面这些规则的时候要小心,例如与 SSH 相关的规则没有在里面。关于如何开启 SSH 端口,可自行查阅 iptables 规则的写法。

首先,停止所有的 iptables 服务:

$ sudo service iptables stop
清除所有的 iptables 规则表:
$ sudo iptables -F -t filter
$ sudo iptables -X
设定预设 iptables 规则:
$ sudo iptables -P INPUT DROP
$ sudo iptables -P OUTPUT ACCEPT
接受所有本地回环网络的数据:
$ sudo iptables -A INPUT -i lo -j ACCEPT
接受所有 Established 连接:
$ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
设置 ICMP 服务(保证 
$ sudo iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
开启 Apache 服务的端口:
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
开启 MariaDB 服务的端口:
$ sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
最后,保存所有 iptables 的规则并再次启动 iptables 服务
$ sudo service iptables save
$ sudo service iptables start

为了确认本地端口已经正常开启,请执行以下命令

$ netstat -nat

检查相应服务的端口是否被监听。如果一切正常的话,可以开始在远端主机测试 LAMP 服务器了。假设 LAMP 主机的 IP 地址为 ipaddr。首先测试 Apache 服务,打开网页浏览器,在地址栏输入 http://ipaddr 或者 http://ipaddr/info.php。如果出现图或中的页面,就说明 Apache 工作正常;接着测试 MariaDB 服务,请安装 MariaDB 的客户端,然后登录 MariaDB 主机进行测试:

$ sudo yum install mariadb
$ mysql -h http://ipaddr -u root -p
至此,LAMP 服务器的安装配置已经完成,后面将接着介绍它的应用。