想在自己的电脑上运行一些Web服务供自己使用的话,MySQL,Apache和PHP(简称MAP)组合是一个很好的选择。如果你的工作环境和我一样,是Windows+Cygwin(一个在Windows上的模拟Linux的套件),可能也会觉得在Cygwin上安装和配置MAP是一个很好的选择。本文记录了在Cygwin上安装MAP的过程以及一些问题。

2017-06-25更新:
已用Windows版本的MariaDB代替Cygwin底下的MySQL了。MariaDB是MySQL(现归Oracle)的一个开源发行版,安装体积小,没有杂碎。用Windows原生的应用程序,启停服务的时候会比较方便。

首先来点准备工作:

  • 安装Cygwin
  • 安装包管理软件apt-cyg
  • 安装cygrunsrv:ap-cyg install cygrunsrv

MySQL

安装MySQL的客户端和服务端软件包:

apt-cyg install mysql
apt-cyg install mysql-server

然后执行下面的命令来安装数据库:

mysql_install_db

顺利的话会弹出一堆的输出告诉你接下来怎么弄:

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
To do so, start the server, then issue the following commands:

'/usr/bin/mysqladmin' -u root password 'new-password'
'/usr/bin/mysqladmin' -u root -h bjren password 'new-password'

Alternatively you can run:
'/usr/bin/mysql_secure_installation'

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the MariaDB Knowledgebase at http://mariadb.com/kb or the
MySQL manual for more instructions.

You can start the MariaDB daemon with:
cd '/usr' ; /usr/bin/mysqld_safe --datadir='/var/lib/mysql'

You can test the MariaDB daemon with mysql-test-run.pl
cd '/usr/mysql-test' ; perl mysql-test-run.pl

Please report any problems at http://mariadb.org/jira

下一步执行/usr/bin/mysql_secure_installation,来给数据库设置一个密码。

一些简单的操作,启动mysql服务的话,执行mysqld_safe &,关闭mysql服务的话,执行mysqladmin -u root -p shutdown后输入前面设置的密码。

MySQL的基本命令行

可以用mysql -u root -p登录mysql的命令行窗口,然后输入?查看帮助,一些简单的命令罗列如下:

SHOW DATABASES; # 察看数据库
USE mysql; # 选择 mysql
SHOW TABLES; # 查看数据表
SELECT * FROM db; # 查看db表
SHOW CREATE TABLE t1; # 查看创建t1的SQL
DESCRIBE t1; # 查看t1的表结构

其他一些注意事项

以Windows服务的方式启动MySQL,我参考了这个博客的设置,使用cygrunsrv把mysqld设置为Windows服务。先关停mysqld,然后执行以下命令:

$ cygrunsrv --install mysqld --path /usr/bin/mysql_safe --args '--datadir=/var/lib/mysql --pid-file=/var/lib/mysql/mysql.pid

成功后可以通过:cygrunsrv -S mysqld来启动服务。停止服务的话使用的是 cygrunsrv -E mysqld。因为安装成Windows服务了,下回系统重启的时候会自动启动,不需要再操作了。

另一个可供参考的配置脚本是Mysqld-host-config

Apache和PHP

先安装Apache的软件包httpd、php、以及其他相关的软件包:

apt-cyg install cygserver
apt-cyg install httpd
apt-cyg install php
apt-cyg install php-mysqli
apt-cyg install httpd-mod_php7

httpd和php的版本都比较新,分别是2.4和7。

先把Cygserver跑起来:cygrunsrv -S cygserver

测试httpd是否能启动和关停:

/usr/sbin/apachectrl start
/usr/sbin/apachectrl stop

限制httpd在本地运行

因为打算只在本地运行httpd,所以要改一下httpd的配置文件httpd.conf,在/etc/httpd/conf/目录。找到下面这行:

Listen 80

改成

Listen 127.0.0.1:8888

主机地址设为127.0.0.1,这样httpd只处理本机的请求。端口号改为8888是为了避免使用标准的80端口,以免引起一些防火墙软件的误会。

执行/usr/sbin/apachectrl restart,然后打开一个浏览器,输入地址127.0.0.1:8888,应该可以看到经典的文字It works!

测试PHP是否能工作

编辑一个简单的php文件info.php,放在httpd默认的服务目录/srv/www/htdocs里面,内容如下

<?php phpinfo(); ?>

浏览器访问127.0.0.1:8888/info.php,如果显示出一堆关于PHP的信息,就说明PHP能工作了。

减少httpd和php的资源占用

httpd默认的设置启动的进程较多,光本地使用的话有点浪费系统资源,可以做一些削减。

httpd的mod_php必须使用prefork模式的MPM(Multi-Processing Modules),默认应该已经配置好了,可以通过/usr/sbin/apachectl -t -D DUMP_MODULES | grep mpm来确认下。

prefork模式的MPM默认情况下会在httpd启动的时候开启很多httpd进程,在Windows的任务管理器里面可以看到。我们的目的是减少启动的httpd进程。

首先编辑/etc/httpd/conf/httpd.conf, 找到下面这一行,把前面的#号去掉,然后保存文件:

#Include conf/extra/httpd-mpm.conf

接着打开/etc/httpd/conf/extra/httpd-mpm.conf,找到<IfModule mpm_prefork_module>,把其下的配置修改如下:

<IfModule mpm_prefork_module>
    StartServers             1
    MinSpareServers          1
    MaxSpareServers          2
    MaxRequestWorkers        3
    MaxConnectionsPerChild   0
</IfModule>

执行/usr/sbin/apachectrl restart使配置生效,看看httpd的进程数目有没有减少。

测试PHP和MySQL的连接性

编辑php的配置文件/etc/php.ini,开启mysqli扩展(php连接mysql有两大扩展,分别是mysqli和pdo,这里选择的是mysqli):

# 把前面的';'去掉
extension=php_mysqli.dll

/srv/www/htdocs下创建一个db.php,并将内容设置为mysqli的例子

<?php
$mysqli = new mysqli("localhost", "root", "my_password", "world");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

/* check if server is alive */
if ($mysqli->ping()) {
    printf ("Our connection is ok!\n");
} else {
    printf ("Error: %s\n", $mysqli->error);
}

/* close connection */
$mysqli->close();
?>

注意将文中的my_password替换成之前设置的MySQL数据库的root密码

浏览器访问127.0.0.1:8888/db.php,如果显示*Our connection is ok!*说明数据库连接正常了。

配置Apache的服务httpd

从2.4开始,Apache使用/etc/rc.d/init.d/httpd而不是以往的/usr/sbin/httpd2-config来配置服务(参考这篇博文)

执行/etc/rc.d/init.d/httpd install来安装Apache的服务httpd。然后运行cygrunsrv -S httpd开启动服务。

如果服务无法启动,可以使用/usr/sbin/apachectrl start来测试,会显示错误信息。

一些其他信息

到此为止MAP就配置完成了,下面是一些其他信息。

prefork和mod_php

mod_php并不是线程安全的,所以只能使用httpd的prefork MPM模式。其他的MPM模式如worker、event之类的都不能使用。这一点可以看PHP的FAQ

如果在httpd.conf中把prefork替换成worker:

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
Php

会导致PHP脚本无法被解释。

一个替换的方案是使用FastCGI来连接php,可以参考这篇文章

Nginx也是通过FastCGI来连接php的。

使用mklink做目录链接

Windows支持使用mklink命令做目录软连接。MySQL默认安装在/var/lib/mysql。可以把mysql目录挪到其他地方,比如D:\MySQL,然后在/var/lib/目录下执行:

mklink /d mysql D:\mysql

这样/var/lib/mysql就是到D:\MySQL的软连接了。

mklink需要administrator权限哦。

MAMP和XAMPP

其实如果想在Windows上安装MAP的话,还可以选择那些集成的软件包,比如MAMP和XAMPP。个人不太喜欢这些软件包的原因是:一)通常集成了太多东西导致体积过大;二)我还是习惯于自己做一些配置操作,可以提升自己的技艺。

其他零散资源