一、nginx.conf文件
Nginx的配置文件通常称为nginx.conf,它的结构主要分为全局块、events块和http块。以下是nginx.conf文件的结构和每一块的作用和意义:
# 全局块
user nginx; # 指定Nginx worker进程运行的用户和用户组
worker_processes auto; # 指定Nginx worker进程的数量,通常设置为auto,表示自动根据CPU核心数确定
error_log /var/log/nginx/error.log warn; # 指定错误日志文件的路径和级别
pid /var/run/nginx.pid; # 指定Nginx主进程的PID文件路径
# events块
events {
worker_connections 1024; # 指定每个worker进程可以同时处理的最大连接数
}
# HTTP块
http {
include /etc/nginx/mime.types; # 引入MIME类型配置文件
default_type application/octet-stream; # 指定默认MIME类型
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 /var/log/nginx/access.log main; # 指定访问日志文件的路径和格式
sendfile on; # 启用sendfile机制,提高文件传输效率
tcp_nopush on; # 启用TCP_NOPUSH选项,提高网络传输性能
keepalive_timeout 65; # 设置客户端与服务器的长连接超时时间
# 定义HTTP服务器块
server {
listen 80; # 监听80端口
server_name example.com www.example.com; # 指定服务器的域名
location / {
root /usr/share/nginx/html; # 指定根目录
index index.html; # 指定默认文件
}
error_page 404 /404.html; # 定义404错误页面
error_page 500 502 503 504 /50x.html; # 定义50x错误页面
location = /50x.html {
root /usr/share/nginx/html; # 指定50x错误页面的路径
}
}
}
1. 全局块
全局块是Nginx配置文件的顶层块,包含了全局配置指令,对整个Nginx服务器生效。
- user: 指定Nginx worker进程运行的用户和用户组。
- worker_processes: 指定Nginx worker进程的数量,通常设置为服务器的CPU核心数。
- error_log: 指定错误日志文件的路径和级别。
- pid: 指定Nginx主进程的PID文件路径。
- events: 指定Nginx事件模型的配置,通常配置worker_connections等参数。
- http: 包含HTTP服务的配置,包括HTTP服务器块、HTTP代理、缓存等。
2. Events块 (events {})
Events块用于配置Nginx的事件模型,控制Nginx如何处理并发连接。
- worker_connections: 指定每个worker进程可以同时处理的最大连接数。
- multi_accept: 设置为on时,表示每个worker进程同时接受多个新连接。
use: 指定事件驱动模型,如epoll、kqueue、或者select。
3. HTTP块 (http {})
HTTP块包含了所有HTTP服务的配置,包括服务器、反向代理、负载均衡、缓存等。
include: 可以引入其他配置文件,使配置文件更加模块化和可维护。
- log_format: 定义日志格式,包括时间、IP地址、请求方法、URL等信息。
- access_log: 指定访问日志文件的路径和格式。
- server: 配置HTTP服务器,定义虚拟主机、监听端口、域名等。
- listen: 指定服务器监听的IP地址和端口。
- server_name: 指定服务器的域名。
- location: 定义URL的匹配规则和处理方式,包括静态文件服务、反向代理、重定向等。
- upstream: 定义后端服务器组,用于负载均衡和反向代理。
- weight: 指定服务器的权重,用于负载均衡。
- max_fails: 指定最大失败次数。
- fail_timeout: 指定失败超时时间。
这些是nginx.conf文件的主要结构和各部分的作用和意义。通过合理配置nginx.conf文件,可以实现Nginx服务器的各种功能,包括静态文件服务、反向代理、负载均衡等。
特别注意:在Nginx配置文件中,每一条指令配置都必须以分号结束,请不要忘记!!!
二、常用配置命令
1.配置用户及用户组
在nginx.conf文件中指定用户及用户组的意义是为了确定Nginx worker进程运行的身份。这对于安全性和权限管理非常重要。通过指定用户和用户组,可以限制Nginx进程的权限,确保其仅拥有必要的权限来执行其任务,从而提高系统的安全性。
配置用户及用户组的方式是使用user指令。下面是其语法:user username [groupname];
。其中,username是指定的用户名,groupname是该用户所属的用户组。如果不指定groupname,则默认为和username相同的组名,如:user nginx nginx;
上述配置将Nginx worker进程的用户设置为nginx,用户组也设置为nginx。这样配置的目的是为了使用专门的非特权用户来运行Nginx,以最小化潜在的安全风险。通常,Nginx软件安装后会创建一个名为nginx的用户和组,你也可以根据实际情况指定其他用户和组。
只有被设置的用户或者用户组成员才有权限启动Nginx进程,如果是其他用户(test_user)尝试启用Nginx进程,将会报错。
2.配置工作进程数
worker process是nginx服务器实现并发的核心所在。Nginx的工作进程负责处理客户端请求、响应静态文件、代理请求等任务。配置工作进程数量可以根据服务器的硬件资源和预期的负载情况来进行调整,以充分利用服务器资源,提高系统的性能和并发处理能力,并不是越大越好。
配置工作进程的方式是使用worker_processes指令。下面是其语法:worker_processes number;
nginx中有两类进程:main进程和worker进程,main进程只有一个,而worker进程数量可以在nginx.conf文件中进行配置。
3.配置错误日志的存入路径
错误日志记录了服务器在运行过程中出现的各种错误、警告以及其他相关信息,对于诊断和调试服务器问题非常重要。配置错误日志存放路径的方式是使用error_log指令。下面是其语法:
error_log file [level];
其中,file是指定的错误日志文件的路径,可以是相对路径或绝对路径;level是可选的错误日志记录级别,可以指定为debug、info、notice、warn、error、crit、alert或者emerg,默认为error级别。示例:
error_log /var/log/nginx/error.log warn;
4.配置文件的引入
我们可能需要将其他的Nginx配置或者第三方模块的配置引用到当前的主配置文件中。Nginx提供了include指令来完成配置文件的引入,其语法结构为:include file;
5.设置网络连接的系列化
这个功能主要是解决多个进程对网络连接的竞争问题。
在《UNIX网络编程》第1卷里提到过一个叫“惊群”的问题(Thundering herd problem),大致意思是,当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接。如果每次唤醒的进程数目太多,会影响一部分系统性能。在Nginx服务器的多进程下,就有可能出现这样的问题。在Nginx中,网络连接的序列化是通过以下几个指令来配置的:
- multi_accept: 这个指令控制是否允许每个工作进程同时接受多个新连接。默认情况下,这个选项是关闭的,即每个工作进程一次只能接受一个新连接。开启这个选项后,每个工作进程可以同时接受多个新连接,提高了并发处理能力,特别是在高负载情况下。
示例:
events {
multi_accept on;
}
- accept_mutex: 这个指令控制是否启用接受锁定。当启用接受锁定时,Nginx会对新连接的接受进行加锁,以确保只有一个工作进程处理新连接。这样可以避免多个工作进程同时处理同一个新连接,提高了性能。
示例:
events {
accept_mutex_delay 500ms;
}
- accept_mutex_delay: 这个指令指定了接受锁定的延迟时间,单位为毫秒。当有新连接到达时,Nginx会等待指定的延迟时间后再进行接受锁定,以允许更多的新连接同时被接受。这个选项通常与接受锁定一起使用,用于调节接受锁定的粒度。
示例:
events {
accept_mutex_delay 500ms;
}
网络连接的序列化功能在Nginx中的存在是为了优化服务器的性能和提高并发处理能力。以下是这个功能的几个重要作用:
提高并发处理能力: 在高负载的情况下,服务器需要处理大量的并发连接。通过序列化连接处理,可以确保新连接的接受和处理是有序的,避免了多个工作进程同时处理同一个新连接,从而提高了服务器的并发处理能力。
避免竞争条件: 多个工作进程同时接受新连接时可能会导致竞争条件的发生,例如两个进程同时试图对同一个文件描述符进行操作。通过接受锁定和序列化连接处理,可以避免这种竞争条件的发生,确保新连接的接受和处理是线程安全的。
提高性能稳定性: 在高负载的情况下,服务器的性能和稳定性对于保持服务的可用性至关重要。通过控制新连接的接受和处理顺序,可以有效地平衡服务器的负载,避免出现性能瓶颈和服务不稳定的情况。
总的来说,网络连接的序列化功能能够有效地提高服务器的性能、稳定性和并发处理能力,对于高负载的网络环境是非常重要的。因此,这个功能在Nginx中的存在是为了满足对高性能和高可用性的需求。
6.设置事件驱动模型
在Nginx中,可以通过配置events块来设置事件驱动模型。事件驱动模型决定了Nginx如何处理并发连接和事件。常见的事件驱动模型包括select、poll、epoll、kqueue等,不同的操作系统和平台支持不同的事件驱动模型。
以下是设置事件驱动模型的示例:
events {
use epoll; # 使用epoll事件驱动模型,适用于Linux系统
worker_connections 1024; # 每个worker进程可以同时处理的最大连接数
}
在上述示例中,use epoll;指定了使用epoll事件驱动模型。epoll是Linux系统上高效的事件驱动模型,在处理大量并发连接时性能表现优秀。如果你的Nginx运行在其他操作系统上,可以根据实际情况选择合适的事件驱动模型,如kqueue适用于FreeBSD和MacOS系统,select和poll则是跨平台的通用事件驱动模型。
另外,worker_connections指定了每个worker进程可以同时处理的最大连接数。这个值应该根据服务器的硬件资源和预期的负载情况来调整,通常设置为操作系统的最大文件描述符数或者是硬件资源的几倍。
7.自定义服务日志
在Nginx中,可以通过配置access_log指令来自定义访问日志,以记录用户请求的访问信息。以下是设置自定义访问日志的示例:
http {
# 定义自定义日志格式
log_format custom_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
server {
# 设置自定义访问日志
access_log /var/log/nginx/custom_access.log custom_log;
...
}
}
在上述示例中:
log_format指令用于定义自定义的日志格式。在custom_log中,通过使用Nginx内置的变量,定义了一种自定义的日志格式,包括客户端的IP地址、用户标识、请求时间、请求方法、HTTP状态码、响应体大小、来源页面、用户代理等信息。
access_log指令用于指定日志文件的路径和日志格式。在这里,/var/log/nginx/custom_access.log是自定义的访问日志文件路径,custom_log是之前定义的自定义日志格式。
通过自定义访问日志,可以根据实际需求记录特定的请求信息,或者将日志记录到特定的文件中,以便后续的分析和处理。
8.配置sendfile方式传输文件
在Nginx中,可以通过配置sendfile指令来启用或禁用sendfile方式传输文件。sendfile是一种高效的文件传输方式,可以直接将文件内容从磁盘复制到网络连接中,减少了数据在内核空间和用户空间之间的复制,提高了文件传输的效率。
以下是设置sendfile方式传输文件的示例:
http {
server {
...
location / {
root /usr/share/nginx/html;
index index.html;
# 启用sendfile方式传输文件
sendfile on;
}
}
}
在上述示例中,通过将sendfile指令设置为on,启用了sendfile方式传输文件。这样配置后,Nginx在传输静态文件时将使用sendfile机制,直接从磁盘读取文件并发送到网络连接,提高了文件传输的效率。
需要注意的是,sendfile功能默认是开启的,但在某些特殊情况下可能需要手动配置为on,以确保其正常工作。通常情况下,推荐开启sendfile功能,以提高文件传输的效率和性能。
9.配置连接超时时间
在Nginx中,可以通过配置keepalive_timeout指令来设置连接的超时时间。keepalive_timeout指定了客户端与服务器之间的持久连接(Keep-Alive)超时时间,即在该时间内如果没有新的请求到达,连接将被关闭。
以下是设置连接超时时间的示例:
http {
server {
...
# 设置连接超时时间为 60 秒
keepalive_timeout 60;
}
}
在上述示例中,通过将keepalive_timeout指令设置为60,将客户端与服务器之间的持久连接超时时间设置为60秒。这意味着如果在60秒内没有新的请求到达,Nginx会关闭连接,释放资源。
需要注意的是,连接超时时间的设置应根据实际情况进行调整。如果服务器上有大量的短连接请求,可以适当缩短连接超时时间以释放资源;如果服务器上有长时间的长连接请求,可以适当延长连接超时时间以提高性能。
10.设置单连接请求数上限
在 Nginx 中,可以通过配置 keepalive_requests 指令来设置每个持久连接(Keep-Alive 连接)的最大请求数。当达到指定的请求数后,Nginx 将关闭该持久连接,并释放资源。
以下是设置 keepalive_requests 的示例:
http {
server {
...
# 设置每个持久连接的最大请求数为 100
keepalive_requests 100;
}
}
在上述示例中,通过将 keepalive_requests 指令设置为 100,将每个持久连接的最大请求数设置为 100。这意味着当某个持久连接处理了 100 个请求后,Nginx 将关闭该连接。
需要注意的是,keepalive_requests 的设置应该根据实际需求和服务器的负载情况进行调整。设置过小的值可能会导致频繁的连接关闭和重新建立,影响性能;设置过大的值可能会导致持久连接占用过多资源,影响服务器的并发性能。通常情况下,建议根据实际情况进行适当的调整。
11.配置网络监听
在 Nginx 中,可以通过配置 listen 指令来设置网络监听。listen 指令用于指定 Nginx 服务器监听的 IP 地址和端口号。
以下是设置网络监听的示例:
http {
server {
# 监听所有 IPv4 地址,端口号为 80
listen 80;
# 监听指定的 IPv4 地址,端口号为 8080
listen 192.168.1.100:8080;
# 监听所有 IPv6 地址,端口号为 443
listen [::]:443;
# 监听指定的 IPv6 地址,端口号为 8443
listen [2001:db8::1]:8443;
}
}
在上述示例中:
- listen 80; 指定了服务器监听所有 IPv4 地址(0.0.0.0),端口号为 80。
- listen 192.168.1.100:8080; 指定了服务器监听指定的 IPv4 地址(192.168.1.100),端口号为 8080。
- listen [::]:443; 指定了服务器监听所有 IPv6 地址(::),端口号为 443。
- listen [2001:db8::1]:8443; 指定了服务器监听指定的 IPv6 地址(2001:db8::1),端口号为 8443。
通过设置 listen 指令,可以灵活地配置 Nginx 监听的网络地址和端口号,从而实现不同的网络监听需求。
12.基于名称的虚拟主机配置
基于名称的虚拟主机配置允许在同一台服务器上托管多个域名,并根据访问的域名来区分不同的站点或应用程序。在 Nginx 中,可以通过配置多个 server 块来实现基于名称的虚拟主机。
这里的“主机”,就是指此server块对外提供的虚拟主机。设置了主机的名称并配置好DNS,用户就可以使用这个名称向此虚拟主机发送请求了。
以下是一个基于名称的虚拟主机配置示例:
http {
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 80;
server_name example.net www.example.net;
root /var/www/example.net;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
}
在上述示例中,配置了两个 server 块,分别用于处理 example.com 和 example.net 两个域名的请求。每个 server 块都包含了相应域名的配置信息:
- listen 80; 指定了监听的端口号为 80。
- server_name example.com www.example.com; 指定了服务器名称为 example.com 和 www.example.com,表示这个虚拟主机用于处理这两个域名的请求。
- root /var/www/example.com; 指定了站点的根目录为 /var/www/example.com,即网站的根目录。
- index index.html; 指定了默认首页为 index.html。
- location / { … } 是用于配置请求处理的具体规则,这里使用了 try_files 指令来尝试查找请求的文件,如果文件不存在则返回 404 错误。
通过配置多个基于名称的虚拟主机,可以实现在同一台服务器上托管多个域名,并根据域名来区分不同的站点或应用程序。
13.基于IP的虚拟主机配置
基于IP的虚拟主机配置允许在同一台服务器上使用不同的 IP 地址来托管不同的站点或应用程序。在 Nginx 中,可以通过配置多个 server 块,并在每个 server 块中指定不同的监听 IP 地址来实现基于 IP 的虚拟主机。
以下是一个基于 IP 的虚拟主机配置示例:
http {
server {
listen 192.168.1.100:80;
server_name example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 192.168.1.101:80;
server_name example.net;
root /var/www/example.net;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
}
14.配置location块
location 块是用于配置 Nginx 处理特定 URL 路径的指令。它允许你定义不同的规则来处理不同的请求路径。以下是 location 块的基本语法:
location path {
# 指令和配置
}
其中,path 是要匹配的 URL 路径,可以是具体的路径,也可以是正则表达式。当客户端请求的 URL 匹配到指定的 path 时,Nginx 将会应用该 location 块中的配置。
以下是一个简单的 location 块示例:
server {
...
location / {
root /var/www/html;
index index.html index.htm;
}
location /images/ {
root /var/www;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
在上述示例中:
- 第一个 location 块匹配所有请求路径,使用了 /var/www/html 作为根目录,并指定了默认的索引文件。
- 第二个 location 块匹配以 /images/ 开头的路径,使用了 /var/www 作为根目录。
- 第三个 location 块使用了正则表达式匹配以 .php 结尾的路径,将请求转发给 PHP-FPM 进程进行处理。
location 块中可以包含各种 Nginx 指令和配置,如 root、alias、try_files、rewrite 等,可以根据需要灵活配置,以实现不同路径的不同处理逻辑。
15.配置请求的根目录
Web服务器接收到网络请求之后,首先要在服务器端指定目录中寻找请求资源。在 Nginx 中,可以使用 root 指令来配置请求的根目录,即服务器用于寻找请求文件的基本路径。以下是一个简单的示例:
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
在上述配置中:
- root /var/www/example.com; 指定了请求的根目录为 /var/www/example.com。当客户端请求的文件在该目录下时,Nginx 将从这个目录中寻找文件。
- index index.html; 指定了默认的索引文件为 index.html。如果请求的是一个目录,Nginx 将会尝试在该目录下寻找 index.html 文件。
在实际应用中,你可以根据需要设置不同的根目录来托管不同的网站或应用程序。确保在设置根目
16.URI的别名映射
在location块中,除了使用root指令指明请求处理根目录,还可以使用alias指令改变location接收到的URI的请求路径。alias 指令用于在 Nginx 中配置 URL 到文件系统路径的别名映射,允许将请求映射到文件系统中不同于 root 指定的目录的位置。这在需要将特定 URL 请求映射到其他目录的情况下非常有用。
以下是 alias 指令的基本语法:
location /url-path {
alias path/to/directory;
}
其中,/url-path 是要匹配的 URL 路径,path/to/directory 是要映射到的文件系统目录路径。
以下是一个示例,演示如何使用 alias 指令:
server {
listen 80;
server_name example.com;
location /images/ {
# 将 URL 中的 /images/ 替换为 /var/www/example.com/pictures/
alias /var/www/example.com/pictures/;
}
}
在上述配置中,当客户端请求的 URL 匹配到 /images/ 路径时,Nginx 将会将该请求映射到 /var/www/example.com/pictures/ 目录下寻找文件。例如,请求 /images/image.jpg 将会映射到 /var/www/example.com/pictures/image.jpg 文件。
需要注意的是,使用 alias 指令时需要确保目录的访问权限设置正确,并且确保 Nginx 进程有权限访问该目录。
17.设置网站的默认首页
在 Nginx 中,可以使用 index 指令来设置网站的默认首页,即当访问网站根目录时,Nginx 将会尝试列出或显示的文件。通常情况下,网站的默认首页文件是 index.html,但你也可以设置其他文件作为默认首页。
以下是设置默认首页的示例:
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.html index.htm;
}
在上述配置中,使用 index 指令将默认首页文件设置为 index.html 和 index.htm。当客户端请求的 URL 是一个目录时,Nginx 将会按照指定的顺序尝试找到第一个存在的文件作为默认首页文件。
需要注意的是,index 指令中列出的文件名应该是相对于 root 指定的目录的相对路径。如果客户端请求的 URL 是一个目录,并且没有匹配到指定的默认首页文件,Nginx 将会返回一个目录列表或者 403 Forbidden 错误,取决于是否允许列出目录内容。
18.设置网站的错误页
在 Nginx 中,可以使用 error_page 指令来设置网站的错误页面。error_page 指令用于定义当服务器发生特定 HTTP 错误代码时,应该显示的错误页面或重定向到的 URL。
server {
listen 80;
server_name example.com;
root /var/www/example.com;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
在上述配置中:
- 当服务器返回 404 Not Found 错误时,Nginx 将会显示 /var/www/example.com/404.html 页面作为错误页面。
- 当服务器返回 500、502、503 或 504 错误时,Nginx 将会显示 /var/www/example.com/50x.html 页面作为错误页面。
需要注意的是,uri 可以是一个相对路径或者一个外部的 URL,可以是一个静态的 HTML 页面,也可以是一个动态的脚本程序。确保指定的错误页面是存在的,并且 Nginx 对该页面的访问权限设置正确。