Nginx的使用方法和基础配置

Nginx

Nginx 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。因为项目需要用 Nginx 做前端的服务器,做一些反向代理等工作,因此抽空学习了下 Nginx 的基本用法。

安装

必备软件

1
2
3
4
5
6
7
8
9
10
11
12
# GCC编译器
yum install -y gcc
yum install -y gcc-c++
# PCRE库
yum install -y pcre pcre-devel
# zlib库
yum install -y zlib zlib-devel
# OpenSSL开发库
yum install -y openssl openssl-devel

Linux 内核参数的优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 修改 /etc/sysctl.conf 文件
fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 61000
net.ipv4.tcp_rmem = 4096 32768 262142
net.ipv4.tcp_wmem = 4096 32768 262142
net.core.netdev_max_backlog = 8096
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog=1024
# 执行sysctl-p命令,使上述修改生效

选定源码目录

1
cd /usr/local/src

下载、解压、安装nginx

1
2
3
4
5
6
7
8
9
10
11
# 下载(去nginx官网找下载链接http://nginx.org/en/download.html)
wget http://nginx.org/download/nginx-1.12.0.tar.gz
# 解压
tar -zxvf nginx-1.12.0.tar.gz
# 安装(默认安装到 /usr/local/nginx)
# 进入源码目录
./configure
make
make install

启动

1
2
3
4
5
# 检查80端口是否被占用
netstat -ano|grep 80
# ubuntu 下必须用 sudo 启动,不然只能在前台运行
sudo /usr/local/nginx/nginx

Nginx的命令行控制

默认方式启动

1
/usr/local/nginx/sbin/nginx

另行指定配置文件的启动方式

1
/usr/local/nginx/sbin/nginx -c tmpnginx.conf

另行指定安装目录的启动方式

1
/usr/local/nginx/sbin/nginx -p /usr/local/nginx/

另行指定全局配置项的启动方式

1
/usr/local/nginx/sbin/nginx -g "pid varnginx/test.pid;"

测试配置信息是否有错误

1
/usr/local/nginx/sbin/nginx -t

在测试配置阶段不输出信息

1
/usr/local/nginx/sbin/nginx -t -q

显示版本信息

1
/usr/local/nginx/sbin/nginx -v

显示编译阶段的参数

1
/usr/local/nginx/sbin/nginx -V

快速的停止服务

1
2
3
4
5
6
7
8
9
# 强制停止服务
/usr/local/nginx/sbin/nginx -s stop
# 查看nginx master的进程ID
ps -ef | grep nginx
kill -s SIGTERM <pid>
# 或
kill -s SIGINT <pid>

优雅的停止服务

1
2
3
4
5
6
7
8
# 正常处理完当前的所有请求再停止服务
/usr/local/nginx/sbin/nginx -s quit
# 优雅停止master进程
kill -s SIGQUIT <nginx master pid>
# 优雅停止某个worker进程
kill -s SIGUSR1 <nginx master pid>

使运行中的Nginx重读配置项并生效

1
2
3
/usr/local/nginx/sbin/nginx -s reload
# 或
kill -s SIGHUP <nginx master pid>

日志文件回滚

1
2
3
/usr/local/nginx/sbin/nginx -s reopen
# 或
kill -s SIGUSR1 <nginx master pid>

平滑升级Nginx

1
2
3
4
5
6
7
8
# 通知正在运行的旧版本Nginx准备升级
kill -s SIGUSR2 <nginx master pid>
# 启动新版本的Nginx,可以使用以上介绍过的任意一种启动方法。这时通过ps命令可
以发现新旧版本的Nginx在同时运行。
# 通过kill命令向旧版本的master进程发送SIGQUIT信号,以“优雅”的方式关闭旧版本的
Nginx。随后将只有新版本的Nginx服务运行,此时平滑升级完毕。

显示命令行帮助

1
# 使用-h或者-?参数会显示支持的所有命令行参数。

配置

配置项的语法格式

1
2
3
4
# 配置项名(空格)配置项值(空格)配置项值(分号)
# 每行配置的结尾需要加上分号
# 如果配置项值中包括语法符号,比如空格符,那么需要使用单引号或双引号括住配置项值,否则Nginx会报语法错误。
log_format main '$remote_addr - $remote_user [$time_local] "$request" ';

配置项的单位

1
2
3
4
5
6
7
8
9
10
11
12
13
# 当指定空间大小事,可以使用的单位包括:
# K或者k千字节(KiloByte,KB)
# M或者m兆字节(MegaByte,MB)
# 当指定时间时,可以使用的单位包括:
# ms(毫秒)
# s(秒)
# m(分钟)
# h(小时)
# d(天)
# w(周,包含7天)
# M(月,包含30天)
# y(年,包含365天)

Nginx服务的基本配置

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

(1) 是否以守护进程方式运行Nginx

语法:daemon on|off;
默认:daemon on;

(2) 是否以 master/worker方式工作

语法:master_process on|off;
默认:master_process on;

(3)error日志的设置

语法:error_log pathfile level;
默认: error_log logs/error.log error;

pathfile参数可以是一个具体的文件,例如,默认情况下是logs/error.log文件,最好将它
放到一个磁盘空间足够大的位置;pathfile也可以是/dev/null,这样就不会输出任何日志了,
这也是关闭error日志的唯一手段;pathfile也可以是stderr,这样日志会输出到标准错误文件
中。

level是日志的输出级别,取值范围是debug、info、notice、warn、error、crit、alert、
emerg,从左至右级别依次增大。当设定为一个级别时,大于或等于该级别的日志都会被输
出到pathfile文件中,小于该级别的日志则不会输出。例如,当设定为error级别时,error、
crit、alert、emerg级别的日志都会输出。

(4)是否处理几个特殊的调试点

语法:debug_points[stop|abort]

(5)仅对指定的客户端输入debug级别的日志(事件类配置,必须放到events{…}中才有效)

语法:debug_connection[IP|CIDR]
注意:使用debug_connection前,需确保在执行configure时已经加入了–with-debug参
数,否则不会生效

(6)限制coredump核心转储文件的大小

语法: worker_rlimit_core size;

(7)指定coredump文件生成目录

语法: working_directory path;

正常运行的配置项

(1)定义环境变量

语法: env VAR|VAR=VALUE

(2)嵌入其他配置文件

语法: include pathfile;

(3)pid文件的路径

语法: pid path/file;
默认: pid logs/nginx.pid;

(4)Nginx worker进程运行的用户及用户组

语法: user username[groupname];
默认: user nobody nobody;

(5)指定Nginx worker进程可以打开的最大句柄描述符个数

语法: worker_rlimit_nofile limit;

(6)限制信号队列

语法: worker_rlimit_sigpending limit;

优化性能的配置项

(1)Nginx worker进程个数

语法: worker_processes number;
默认: worker_processes 1;

(2)绑定Nginx worker进程到指定的CPU内核

语法: worker_cpu_affinity cpumask[cpumask…]

(3)SSL硬件加速

语法: ssl_engine device;

(4)系统调用gettimeofday的执行频率

语法: timer_resolution t;

(5)Nginx worker进程优先级设置

语法: worker_priority nice;
默认: worker_priority 0;

事件类配置项

(1)是否打开accept锁

语法: accept_mutex [on|off]
默认: accept_mutext on;

(2)lock文件的路径

语法: lock_file path/file;
默认: lock_file logs/nginx.lock;

(3)使用accept锁后到真正建立连接之间的延迟时间

语法: accept_mutex_delay Nms;
默认: accept_mutex_delay 500ms;

(4)批量建立新连接

语法: multi_accept[on|off];
默认: multi_accept off;

(5)选择事件模型

语法: use[kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];
默认: Nginx会自动使用最适合的事件模型。

(6)每个worker的最大连接数

语法: worker_connections number;

配置一个静态Web服务器

静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现,
当然,一个完整的静态Web服务器还有许多功能是由其他的HTTP模块实现的。

可以通过简单的查询相关模块(如ngx_http_gzip_filter_module、
ngx_http_image_filter_module等)的配置项说明,方便地在nginx.conf配置文件中加入新的配置
项,从而实现更多的Web服务器功能。

用HTTP proxy module 配置一个反向代理服务器

负载均衡的基本配置

(1)upstream块

语法: upstream name{…}
配置块: http

(2)server

语法: server name[parameters];
配置块: upstream

(3)ip_hash

语法: ip_hash;
配置块: upstream

(4)记录日志时支持的变量

反向代理的基本配置

(1)proxy_pass

语法: proxy_pass URL;
配置块: location、if

(2)proxy_method

语法: proxy_method method;
配置块: http、server、location

(3)proxy_hide_header

语法: proxy_hide_header the_header;
配置块: http、server、location

(4)proxy_pass_header

语法: proxy_pass_header the_header;
配置块: http、server、location

(5)proxy_pass_request_body

语法: proxy_pass_request_body on|off;
默认: proxy_pass_request_body on;
配置块: http、server、location

(6)proxy_pass_request_headers

语法: proxy_pass_request_headers on|off;
默认: proxy_pass_request_headers on;
配置块: http、server、location

(7)proxy_redirect

语法: proxy_redirect[default|off|redirect replacement];
默认: proxy_redirect default;
配置块: http、server、location

(8)proxy_next_upstream

语法:
proxy_next_upstream[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
默认: proxy_next_upstream error timeout;
配置块: http、server、location