默认的Nginx服务器配置文件都存放在安装目录conf中,主配置文件名为nginx.conf,如下是一个配置示例:
worker_processes 1; #全局生效
events {
worker_connections 1024; #在events部分中生效
}
http {
include mime.types; #以下指令在http部分中生效
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server { #以下指令在http的server部分中生效
listen 80;
server_name localhost;
location / { #以下指令在http/server的location中生效
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
nginx.conf一共由三部分组成,分别为全局块、events块和http块。
- 一般情况下,高一级块中的指令可以作用于自身所在的块和此块包含的所有低层级块。
- 如果某个指令在两个不同层级的块中同时出现,则采用“就近原则”,即以较低层级块中的配置为准。比如,某指令同时出现在http全局块中和server块中,并且配置不同,则应该以server块中的配置为准。
全局块是从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,这些指令的作用域是Nginx服务器全局。
通常包括配置:
- 运行Nginx服务器的用户(组)
- 允许生成的worker process数
- Nginx进程PID存放路径
- 日志的存放路径和类型
- 配置文件引入等
events块用于配置与事件处理相关的参数,主要影响Nginx服务器与用户的网络连接,例如并发连接数限制、连接超时等。
典型的配置项包括
- 是否开启对多worker process下的网络连接进行序列化
- 是否允许同时接收多个网络连接
- 选取哪种事件驱动模型处理连接请求:use(指定事件驱动模型,如 epoll 或 kqueue)
- 每个worker process可以同时支持的最大连接数等
这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。
Nginx服务器的主要配置块,包含了大部分HTTP服务的相关配置。代理、缓存和日志定义等都可以放在这个模块中。
在http全局块中配置的指令可以包括:
- 文件引入
- MIME-Type定义
- 日志自定义
- 是否使用sendfile传输文件
- 连接超时时间
- 单连接请求数上限
server块和“虚拟主机”的概念有密切联系。
虚拟主机的含义
虚拟主机技术主要应用于HTTP、FTP及EMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。从用户角度来看,一台虚拟主机和一台独立的硬件主机是完全一样的。
虚拟主机给nginx带来的能力:
在使用Nginx服务器提供Web服务时,利用虚拟主机的技术就可以避免为每一个要运行的网站提供单独的Nginx服务器,也无需为每个网站对应运行一组Nginx进程,即:在同一台服务器上只运行一组Nginx进程,就可以运行多个网站。
接着说server块的作用
每一个http块都可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)。
作用域
server块的作用域只在自己的块中起作用,server块之间相互独立。
常见配置
在server全局块中,最常见的两个配置项是
- 本虚拟主机的监听端口
- 本虚拟主机的名称或IP配置
location块的主要作用是:
基于Nginx服务器接收到的请求路由(例如, server_name/uri-string),对特定的请求进行处理。
地址定向、数据缓存和应答控制等功能都是在这部分实现。
user user [group]
■ user,指定可以运行Nginx服务器的用户。
■ group,可选项,指定可以运行Nginx服务器的用户组。
实践:
只有被设置的用户或者用户组成员才有权限启动Nginx进程,如果是其他用户(test_user)尝试启用Nginx进程,将会报错:
nginx: [emerg] getpwnam("test_user") failed (2: No such file or directory) in
/Nginx/conf/nginx.conf:2
如果希望所有用户都可以启动Nginx进程,有两种办法:
一是将此指令行注释掉:
#user [user] [group];
二是将用户(和用户组)设置为nobody:
user nobody nobody;
注意
在Nginx配置文件中,每一条指令配置都必须以分号结束,请不要忘记。
本质上是设置nginx能够处理的并发数
worker process实际上要受到来自软件本身、操作系统本身资源和能力、硬件设备(如CPU和磁盘驱动器)等的制约。
语法格式为:
worker_processes number/auto;
■ number,指定Nginx进程最多可以产生的worker process数。
■ auto,设置此值,Nginx进程将自动检测。
实践:
将number改为3,重启nginx,可以看到Nginx服务器除了主进程master process之外,还有已经三个worker process:
#ps ax | grep nginx
8626 ? Ss 0:00 nginx: master process ../sbin/nginx
8627 ? S 0:00 nginx: worker process
8628 ? S 0:00 nginx: worker process
8629 ? S 0:00 nginx: worker process
Nginx进程作为系统的守护进程运行,我们需要在某文件中保存当前运行程序的主进程号。
设置的语法格式为:
pid file ;
file指定存放路径和文件名称。
默认将此文件存放在Nginx安装目录logs下,名字为nginx.pid。
path可以是绝对路径,也可以是以Nginx安装目录为根目录的相对路径。比如要把nginx.pid放置到Nginx安装目录sbin下,文件名为web_nginx,则可以使用以下配置:
pid sbin/web_nginx
注意
在指定[path]的时候,一定要包括文件名,如果只设置了路径,没有设置文件名,则会报以下错误:
nginx: [emerg] open() “/Nginx/logs/” failed (21: Is a directory)。
在全局块、http块和server块中都可以对Nginx服务器的日志进行相关配置。
这里介绍全局块下日志的存放配置,后两种情况的配置基本相同,只是作用域不同。使用的指令是error_log,其语法结构是:
error_log file| stderr [debug | info | notice | warn | error | crit | alert | emerg];
日志可以输出到某一个文件中或者输出到标准错误输出stderr;日志的级别是可选项,由低到高分为debug…。
当然,设置某一级别后,比这一级别高的日志也会被记录。
例子:
error_log logs/error.log error;
注意:
运行Nginx进程的用户要对日志文件有写权限,否则在启动Nginx进程的时候会出现以下报错信息:
nginx: [alert]: could not open error log file: open() "/Nginx/logs/error.log" failed
(13: Permission denied)
此指令可以在全局块、http块、server块以及location块中配置。
在Nginx配置文件中,include指令用于引入其他配置文件或片段。这允许你将配置文件模块化,并将其组织成更容易管理和维护的部分。
语法如下:
include file;
file表示要包含的文件路径。可以是相对路径或绝对路径。
注意:
Nginx进程的用户同样对其要具有写权限,并且符合Nginx配置文件规定的相关语法和结构。
此指令可以放在配置文件的任意地方。
配置实例:
1.包含单个文件:
http {
include /etc/nginx/conf.d/mysite.conf;
}
2.包含一个目录中的所有已conf结尾的文件:
如nginx.conf对其他组件配置引入:
http{
...
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
...
}
3.分离不同的配置段
可以将不同的配置段存储在单独的文件中,然后使用include命令将它们组合起来。
http {
include /etc/nginx/conf.d/headers.conf;
include /etc/nginx/conf.d/locations.conf;
include /etc/nginx/conf.d/upstreams.conf;
}
如上,将headers.conf、locations.conf和upstreams.conf文件中的配置将被包含在主配置文件中。
参考:《Nginx高性能Web服务器详解》