Mac上安装Nginx+PHP5.6+MySQL+NodeJS+Express

1. 安装Homebrew

如果已经安装,请跳到下一步

HomebrewOSX 上注明的软件包管理器, 可以方便的安装很多常用软件。安装过程很简单,运行一下命令即可。

1
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装完毕以后,由于Homebrew可以能会做一些编译的事情,所以需要安装command line tools, 我用的是 10.8.5 Mountain Lion,请在apple的开发者下载中心(https://developer.apple.com/downloads/)选择自己对应的版本进行下载安装。

brew(意为酿酒)的命名很有意思,全部都使用了酿酒过程中采用的材料/器具,名词对应以下的概念:

  • Formula(配方) 程序包定义,本质上是一个rb文件
  • Keg(桶)程序包的安装路径
  • Cellar(地窖)所有程序包(桶)的根目录
  • Tap(水龙头)程序包的源
  • Bottle (瓶子)编译打包好的程序包

最终编译安装完毕的程序就是一桶酿造好的酒, 更多内容请查看官方“酿酒文档”

2. 安装PHP-5.6(FPM模式)

2-1. 首先要添加Homebrew官方的几个软件源,就是 Tap .

添加 homebrew/dupeshomebrew/versions 软件源,这两个软件源有我们需要的依赖包:

1
2
$ brew tap homebrew/dupes
$ brew tap homebrew/versions

最后添加Homebrew 官方的PHP 软件源homebrew-php :

1
$ brew tap homebrew/homebrew-php

2-2. 查看安装参数,选择PHP版本进行安装

TIPS: 可以用一下命令查看安装可选参数

1
$ brew options php56

由于新版的MacOSX会把curl"SSL Version" 设置为SecureTransport, 导致PHP中无法curl访问https的网址, 需要设置 SSL Versionopenssl, 才可以, 所以在安装php之前,首先要安装openssl版本的的curl,

1
brew install curl --with-libssh2 --with-openssl

PHP如果采用默认配置安装,会编译 mod_php 模块并只运行在Apache环境下,为了使用Nginx,这里需要编译 php-fpm 并且禁用apache,主要通过参数--without-fpm --without-apache 来实现。这是我的安装参数:

1
2
3
4
5
6
7
8
9
10
11
12
$ brew install php56 \\
--without-snmp \
--without-apache \
--with-debug \
--with-fpm \
--with-intl \
--with-homebrew-curl \
--with-homebrew-libxslt \
--with-homebrew-openssl \
--with-imap \
--with-mysql \
--with-tidy

2-3. 安装PHP扩展

有一些很多常用的扩展,我们都可以用Homebrew 来进行安装,可以搜索PHP 查看可以安装的扩展。

1
$ brew search php

【注意] 使用Laravel要求有 mcrypt 扩展,在安装扩展的时候注意, 由于我们安装PHP 的时候,加上了 –with-debug 参数,所以有些扩展安装后无法使用,会报这样的错误:

Warning: PHP Startup: redis: Unable to initialize module
Module compiled with build ID=API20131226,NTS
PHP compiled with build ID=API20131226,NTS,debug
These options need to match in Unknown on line 0

这时候需要在安装扩展的时候,加上 --build-from-source 参数,所以安装 mcrypt 的命令如下:

1
$ brew install mcrypt php56-mcrypt --build-from-source

2-4. 取代内置PHP

由于Mac自带了phpphp-fpm,因此需要添加系统环境变量PATH来替代自带PHP版本。
我使用的是zsh , 所以在 `/.zshrc 中添加下面三行代码:

1
2
3
export PATH="$(brew --prefix php56)/bin:$PATH"
export PATH="$(brew --prefix php56)/sbin:$PATH"
export PATH="/usr/local/bin:/usr/local/sbib:$PATH"

重启终端后,输入 php -v 来验证版本。

2-5. 启动、停止和重启PHP-FPM

修改php-fpm配置文件,

1
vim /usr/local/etc/php/5.5/php-fpm.conf

找到pid相关大概在25行,去掉注释 pid = run/php-fpm.pid, 那么php-fpmpid文件就会自动产生在 /usr/local/var/run/php-fpm.pid ,下面要安装的Nginx pid文件也放在这里。

启动之前可以先测试一下 php-fpm 的配置

1
php-fpm -t

没有问题可以启动啦!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 启动php-fpm
php-fpm -D
OR
php-fpm -c /usr/local/etc/php/5.5/php.ini -y /usr/local/etc/php/5.5/php-fpm.conf -D
# 关闭php-fpm
kill -INT cat /usr/local/var/run/php-fpm.pid
# 重启php-fpm
kill -USR2 cat /usr/local/var/run/php-fpm.pid
# 还可以用这个命令来启动php-fpm
launchctl load -w /Library/LaunchAgents/homebrew.mxcl.php55.plist
# php-fpm 开机自动启动
ln -sfv /usr/local/opt/php55/\*.plist /Library/LaunchAgents
launchctl load /Library/LaunchAgents/homebrew.mxcl.php55.plist

启动php-fpm之后,确保它正常运行监听9000端口:

1
2
3
4
5
6
$ lsof -Pni4 | grep LISTEN | grep php
php-fpm 30907 calvin 9u IPv4 0xf11f9e8e8033a2a7 0t0 TCP 127.0.0.1:9000 (LISTEN)
php-fpm 30917 calvin 0u IPv4 0xf11f9e8e8033a2a7 0t0 TCP 127.0.0.1:9000 (LISTEN)
php-fpm 30918 calvin 0u IPv4 0xf11f9e8e8033a2a7 0t0 TCP 127.0.0.1:9000 (LISTEN)
php-fpm 30919 calvin 0u IPv4 0xf11f9e8e8033a2a7 0t0 TCP 127.0.0.1:9000 (LISTEN)
# 正常情况,会看到上面这些进程

3. 安装 NodeJS+Express

3-1.安装NodeJS

安装NodeJS 真是 hin 简单啊, 一行命令搞定:

1
$ brew install node

3-2.安装Express

使用 npm init 命令,会生成 package.json 文件。

1
$ npm init

这个命令会提示你输入一个应用的名称或者版本号,你可以使用默认的 index.js ,也可以改为 app.js , 不想改的话就直接按回车键。

1
entry point: (index.js)

现在就可以安装了, –save 参数可以讲依赖列表存入package.json.

1
$ npm install express --save

安装好Express后, 编辑 app.js :

1
2
3
4
5
6
7
8
9
10
11
12
13
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});

然后运行

1
$ node app.js

打开浏览器,输入 http://localhost:3000 , 可以看到Express 已经成功运行。

4. 安装Nginx

还是使用 Homebrew 来安装 Nginx ,

1
$ brew install nginx

4-1.启动Nginx

监听80端口需要有 root 权限, 所以先为 Nginx 添加 root 权限 :

1
2
sudo chown root:wheel /usr/local/Cellar/nginx/1.8.0/bin/nginx
sudo chmod u+s /usr/local/Cellar/nginx/1.8.0/bin/nginx

启动命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 测试配置是否有语法错误
nginx -t
# 打开 nginx
sudo nginx
# 重新加载配置|重启|停止|退出 nginx
nginx -s reload|reopen|stop|quit
# 也可以使用Mac的launchctl来启动|停止
launchctl unload /Library/LaunchAgents/homebrew.mxcl.nginx.plist
launchctl load -w /Library/LaunchAgents/homebrew.mxcl.nginx.plist
# Nginx开机启动
ln -sfv /usr/local/opt/nginx/\*.plist /Library/LaunchAgents
launchctl load /Library/LaunchAgents/homebrew.mxcl.nginx.plist

4-2. Nginx 配置

模仿Ubuntu中的文件夹结构建立文件夹:

1
2
3
4
5
6
mkdir -p /usr/local/etc/nginx/sites-available
mkdir -p /usr/local/etc/nginx/sites-enabled
mkdir -p /usr/local/etc/nginx/conf.d
sudo mkdir -p /var/www
sudo chown :staff /var/www
sudo chmod 775 /var/www

编辑Nginx 全局变量

1
$ vim /usr/local/etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
worker_processes 1;
error_log /usr/local/var/logs/nginx/error.log debug;
pid /usr/local/var/run/nginx.pid;
events {
worker_connections 256;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /usr/local/var/logs/access.log main;
sendfile on;
keepalive_timeout 65;
port_in_redirect off;
include /usr/local/etc/nginx/sites-enabled/*;
}

这样可以把一些可复用配置独立出来放在 /usr/local/etc/nginx/conf.d 下,比如fastcgi的设置就可以独立出来

1
vim /usr/local/etc/nginx/conf.d/php-fpm

内容为:

1
2
3
4
5
6
7
location ~ \.php$ {
try_files $uri 404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_intercept_errors on;
include /usr/local/etc/nginx/fastcgi.conf;
}

然后 /usr/local/etc/nginx/sites-available 目录下可以一个文件对应一个域名的配置,创建默认虚拟主机default

1
vim /usr/local/etc/nginx/sites-available/default

比如服务器目录是/var/www,那么配置为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80;
server_name localhost;
root /var/www/;
access_log /usr/local/var/logs/nginx/default.access.log main;
location / {
index index.html index.htm index.php;
autoindex on;
include /usr/local/etc/nginx/conf.d/php-fpm;
}
location = /info {
allow 127.0.0.1;
deny all;
rewrite (.*) /.info.php;
}
error_page 404 /404.html;
error_page 403 /403.html;
}

我们还有一个Express实例,所以为它做一个转发。

1
vim /usr/local/etc/nginx/sites-available/express

配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# the IP(s) on which your node server is running. I chose port 3000.
upstream app_yourdomain {
server 127.0.0.1:3000;
keepalive 8;
}
# the nginx server instance
server {
listen 80;
server_name yourdomain.com yourdomain;
access_log /var/log/nginx/yourdomain.log;
# pass the request to the node.js server with the correct headers
# and much more can be added, see nginx config options
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://app_yourdomain/;
proxy_redirect off;
}
}

如果你想Nginx(>=1.3.13) 同时能处理 websocket 请求, 在 location / 部分添加以下几行:

1
2
3
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

配置好以后, 如果想启用这些配置,软连接至 /usr/local/etc/nginx/sites-enabled :

1
2
3
$ cd /usr/local/etc/nginx/sites-enabled/
$ ln -s /usr/local/etc/nginx/sites-available/default default
$ ln -s /usr/local/etc/nginx/sites-available/express express

然后重启 php-fpm 使配置生效。然后就可以通过 http://yourdomain.com 来访问 Express 程序,记得需要修改 hosts 文件, 将yourdomain.com 指向127.0.0.1 。

5. 安装MySQL

依旧是很简单:

1
$ brew install mysql

启动MySQL:

1
2
3
4
5
6
7
# 启动和关闭
mysql.server start
mysql.server stop
# 开机启动
ln -sfv /usr/local/opt/mysql/\*.plist /Library/LaunchAgents
launchctl load /Library/LaunchAgents/homebrew.mxcl.mysql.plist

启动后默认应为空密码,可以通过mysqladmin设置一个密码

1
$ mysqladmin -uroot password "yourpassword"

6. 安装Memcached

1
brew install memcached

启动/停止指令

1
2
3
4
5
memcached -d
killall memcached
# 加入开机启动
cp /usr/local/Cellar/memcached/1.4.20/homebrew.mxcl.memcached.plist /Library/LaunchAgents/

7. 配置Alias

1
2
3
4
5
6
7
8
9
10
11
12
alias nginx.start='launchctl load -w /Library/LaunchAgents/homebrew.mxcl.nginx.plist'
alias nginx.stop='launchctl unload -w /Library/LaunchAgents/homebrew.mxcl.nginx.plist'
alias nginx.restart='nginx.stop && nginx.start'
alias php-fpm.start="launchctl load -w /Library/LaunchAgents/homebrew.mxcl.php56.plist"
alias php-fpm.stop="launchctl unload -w /Library/LaunchAgents/homebrew.mxcl.php56.plist"
alias php-fpm.restart='php-fpm.stop && php-fpm.start'
alias mysql.start="launchctl load -w /Library/LaunchAgents/homebrew.mxcl.mysql.plist"
alias mysql.stop="launchctl unload -w /Library/LaunchAgents/homebrew.mxcl.mysql.plist"
alias mysql.restart='mysql.stop && mysql.start'
alias memcached.start="launchctl load -w /Library/LaunchAgents/homebrew.mxcl.memcached.plist"
alias memcached.stop="launchctl unload -w /Library/LaunchAgents/homebrew.mxcl.memcached.plist"
alias memcached.restart='memcached.stop && memcached.start'

文章参考

  1. Mac下安装LNMP(Nginx+PHP5.6)环境
  2. 全新安装Mac OSX 开发者环境
  3. NodeJS-Nginx StackOverflow