nginx 学习简记 1

最近在迁移博客(从 Octopress 2.0 到 Hexo)的过程中,涉及到了一些 nginx 的配置操作,比如 利用 nginx 使用同一个 VPS 来服务不同的域名,从而可以把主 Blog lucida.me 和副 Blog [http://notes.lucida.me] 分开。配置的过程还算顺利,但配置参数时总有些心虚,毕竟不知道这些参数的具体作用,于是打算简单的看下 nginx,目标是:

  1. 读懂简单的 nginx 站点配置
  2. 进行简单的 nginx 站点配置

查了下选定了一本书一篇文章作为学习资源:

  1. 深入理解 nginx : 模块开发与架构解析
  2. nginx in aosabook

阅读记录

nginx 是什么

  • 同类:Apache, IIS, Tomacat, Jetty
  • 支持高效处理大规模并发连接的 Web 服务器

nginx 的特点

  • 更快速
  • 高扩展性,模块化
  • 高可靠性
  • 低内存消耗
  • 单机支持 10万+ 并发连接
  • 热部署

书本里接下来是大篇幅 nginx 的安装,编译,以及编译时各模块的配置参数,对我用处不大,略过。

nginx 运行时的进程间关系

  • nginx 一般用 1 个 master 进程管理多个 worker 进程
  • 一般 worker 进程数量和服务器的 CPU Core 数量相同
  • msster 负责管理 worker,worker 彼此独立的的异步处理请求,处理能力受内存影响

nginx 配置的通用语法

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
user nobody;
worker_processes 8;
error_log /var/log/nginx/error.log error;
# pid logs/nginx.pid;
events {
use epoll;
worker_connections 50000;
}
http {
include mime.types;
default_type application/octet-stream;
...
server {
...
location /webstatic {
gzip off;
}
}
}

块配置项可以嵌套,内层块直接继承外层。内外层配置冲突时以哪一项为准取决于模块配置。

空格符需要用单引号或双引号括住:

1
log_format main '$remode_addr - $remote_user [$time_local]'

使用 # 注释:

1
#pid logs/nginx.pid

配置项的单位(单位可否使用取决于解析该配置的模块):

  • 空间:K or k, M or m
  • 时间:ms, s, m, h, d, w, M, y

用于调试进程和定位问题的配置项

  • damemon on|off 是否以守护进程方式运行 nginx
  • master_process on|off 是否以 master/worker方式进行工作
  • error_log /path/file level 配置 error 日志
  • debug_points [stop|abort] 是否处理特殊调试点
  • debug_connection [IP|CIDR] 仅对指定客户端输出 debug 级别日志

正常运行的配置项

  • env VAR|VAR=value 设置操作系统的环境变量
  • include /path/file 嵌入其他配置文件
  • pid path/file 保存 master 进程 ID 的 pid 文件存放路径
  • user username[groupname] nginx worker 进程运行的用户及用户组
  • worker_rlimit_nofile limit 指定 nginx worker 进程可以打开的最大句柄描述符个数

优化性能的配置项

  • worker_process number 设置 nginx worker 进程个数
  • worker_cpu_affinity cpumask[...] 绑定 nginx worker 进程至指定 CPU 内核
  • ssl_engine device SSL 硬件加速
  • timer_resolution t 设置系统调用 gettimeofday 的执行频率
  • worker_priority nice 设置 nginx worker 进程优先级

事件类配置项

  • accept_mutex [on|off] 是否打开 accept 锁
  • lock_file path/file lock 文件的路径
  • use [kqueue|rtsig|epoll|...] 选择事件模型
  • worker_connections number 设置每个 worker 的最大连接数

未完待续