在 OS X 中使用 OpenResty

我曾经写过 在 Mac OS X 上安装lighttpd ,从那时起,我的 Mac 上的 HTTP 服务器一直是 lighttpd。

现在,为了学习 OpenResty ,我将 lighttpd 进行了替换。下面记录这个过程。

1. 移除 lighttpd

在 Mac OS X 上安装lighttpd 的时候,我使用 launchctl 来实现 lighttpd 的自动启动。现在,只需要 unload 即可。

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.lighttpd.plist

这会立即停止 lighttpd 的运行。接下来,将 homebrew.mxcl.lighttpd.plist 从~/Library/LanuchAgents 目录中移除。否则下次启动系统的时候,lighttpd 又会启动。

2. 配置 OpenResty 环境

2.1 编译和安装

OpenResty 的编译和安装流程,在官网上讲得很清楚,我不再赘述。

在这里我假设 OpenResty 已经安装到默认路径 /usr/local/openresty

修改 /usr/local/openresty/nginx/conf/nginx.conf ,将其中的 server 段下的 listen 80 改为 listen 8080

这是因为 80 端口只能被 root 用户启动。而在本文中我们是使用当前用户启动 nginx 的。

如果 8080 端口也被占用,请自行换成可用端口。

2.2 创建 plist 文件

launchctl 依赖一个 plist 配置文件来工作。我们需要手动创建这个文件。

plist 是一种标准的 xml 格式,这种格式的详细介绍,可以看这里:cocos2d-x中的plist文件格式详解

launchctl 对这个配置文件的格式有一些具体的要求,可以查看 launchd.plist

我们创建的 ~/Library/LaunchAgents/org.openresty.plist 文件,内容如下:

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 3<plist version="1.0">
 4<dict>
 5  <key>Label</key>
 6  <string>org.openresty</string>
 7  <key>ProgramArguments</key>
 8  <array>
 9    <string>/usr/local/openresty/nginx/sbin/nginx</string>
10    <string>-p</string>
11    <string>/usr/local/openresty/nginx</string>
12  </array>
13  <key>RunAtLoad</key>
14  <true/>
15  <key>KeepAlive</key>
16  <false/>
17  <key>HardResourceLimits</key>
18  <dict>
19    <key>NumberOfFiles</key>
20    <integer>512</integer>
21  </dict>
22  <key>SoftResourceLimits</key>
23  <dict>
24    <key>NumberOfFiles</key>
25    <integer>512</integer>
26  </dict>
27</dict>
28</plist>

注意其中 Label、Program和ProgramArguments 这三个 Key 是必须存在的。

KeepAlive 这个值建议设置成 false ,除非在 nginx.conf 中设置了 daemon off 。Wayne 在 launchctl笔记 中作了解释:

设定nginx登录后自启动后发现,由于缺省情况下是生成子进程后父进程立即退出,导致launchctl在KeepAlive配置的作用下反复启动nginx,产生了很多错误信息,所以在设置守护进程的时候要注意规避这类问题,nginx可以通过设置daemon off;或者去除掉KeepAlive设置来解决。

2.3 载入任务

1launchctl load ~/Library/LaunchAgents/org.openresty.plist

这条命令会直接启动 openresty ,下次系统重启的时候,也会自动启动。

2.4 使用 80 端口

既然是自己用,那么使用 8080 总是让人很不爽。要使用 80 端口,也很简单。

首先,将 ~/Library/LaunchAgents/org.openresty.plist 复制到 /Library/LaunchDaemons/org.openresty.plist

1cp ~/Library/LaunchAgents/org.openresty.plist /Library/LaunchDaemons/org.openresty.plist

/Library/LaunchDaemons 是给管理员使用的,在用户登录前生效,以 root 身份执行任务。

为什么不复制到 /Library/LaunchAgent 中呢?因为 Wayne 在 launchctl笔记 中提到:

LaunchAgents下的plist都会以当前登录用户的身份load进来……

然后,移除当前的监听:

1launchctl unload ~/Library/LaunchAgents/org.openresty.plist
2rm ~/Library/LaunchAgents/org.openresty.plist

最后,用 sudo 调用 launchctl:

1sudo launchctl load /Library/LaunchDaemons/org.openresty.plist

当然,记得要把 nginx 配置文件中的监听端口改成 80 。

3. 快捷方式

在开发过程中,经常需要重启 nginx 进程。在我的电脑上,有两个 nginx 进程,一个负责正常的 HTTP 服务;一个负责测试 OpenResty 功能。

我写了一个脚本 openresty 用于快速操作 nginx 进程。

 1#!/bin/bash
 2sign=${1:-reload}
 3prefix=${2:-1}
 4
 5if [ "$prefix" = 1 ]; then
 6    prefix='/usr/local/etc/openresty'
 7else
 8    prefix="$hhl/server"
 9fi
10
11echo "nginx -s $sign -p $prefix"
12nginx -s "$sign" -p "$prefix"

在实际使用中,我只需要这样调用就行了:

1#!/bin/bash
2openresty reload 1
3openresty reopen 2