文章目录
- [💥 简介](#💥 简介)
- [💫 基本结构](#💫 基本结构)
-
- [🍉 事件处理器](#🍉 事件处理器)
-
- [🥭 配置分析](#🥭 配置分析)
- [🍏 配置示例](#🍏 配置示例)
- [🍉 HTTP服务器](#🍉 HTTP服务器)
-
- [🥭 配置分析](#🥭 配置分析)
- [🍏 配置示例](#🍏 配置示例)
- [🍉 虚拟主机](#🍉 虚拟主机)
- [🍊 优化](#🍊 优化)
- [🍔 总结](#🍔 总结)
💥 简介
Nginx就是一个高性能的Web服务器和反向代理服务器,它可以处理大量的并发连接,支持高速缓存、负载均衡、SSL/TLS终止、HTTP/2协议等功能,本篇主要讲述nginx的核心配置以及配置分析和优化,能够应用到你企业生产中为目的!
💫 基本结构
events:定义事件处理器,包括连接数、超时时间等。
http:定义HTTP服务器的行为,包括端口、服务器名称、日志、MIME类型等。
server:定义虚拟主机的行为,包括监听端口、服务器名称、文档根目录等。
location:定义URL路径的行为,包括URL路径、文件类型、反向代理、缓存等。
🍉 事件处理器
Nginx的事件处理器是负责处理客户端请求和服务器响应的核心组件。它可以处理大量的并发连接和高负载的请求,提高服务器的性能和可靠性。
🥭 配置分析
worker_processes
worker_processes定义了Nginx启动的工作进程数。每个工作进程都是一个独立的进程,可以处理多个并发连接。通常,worker_processes的值应该等于CPU核心数的两倍。例如,如果服务器有4个CPU核心,那么worker_processes应该设置为8。一般情况可以设置为auto,由程序自行选择适配。
worker_connections
worker_connections定义了每个工作进程可以处理的最大连接数。如果请求数很大,可以适当增加这个值,以提高服务器的并发处理能力。
use
use定义了Nginx使用的事件处理器类型。Nginx支持多种事件处理器类型,包括epoll、kqueue、poll等。不同的事件处理器类型适用于不同的操作系统和硬件平台。如果服务器的性能不佳,可以尝试不同的事件处理器类型。
常用的事件处理器类型
- epoll
epoll是Linux内核提供的事件处理器类型,它可以处理大量的并发连接和高负载的请求。epoll使用一个文件描述符来监听事件,因此它不需要像select()和poll()那样每次都轮询所有的连接。epoll还支持边缘触发和水平触发两种模式,可以更加高效地处理事件。
缺点
需要Linux内核支持,因此在非Linux系统上不适用。
在Linux内核2.6.x版本之前,epoll的水平触发模式可能会导致一些问题,因此需要注意这个问题。
参考地址:https://blog.csdn.net/weixin_28673511/article/details/130114682 - kqueue
kqueue是FreeBSD和Mac OS X提供的事件处理器类型,它可以处理大量的并发连接和高负载的请求。kqueue使用一个事件表来监听事件,因此它不需要像epoll那样每次都轮询所有的连接。kqueue还支持边缘触发和水平触发两种模式,可以更加高效地处理事件。
缺点
在FreeBSD和Mac OS X系统上使用时,需要安装Nginx的kqueue模块。
在FreeBSD和Mac OS X系统上,kqueue的水平触发模式可能会导致一些问题,因此需要注意这个问题。
kqueue流程分析:https://www.cnblogs.com/damiao-hungry/p/14172072.html - poll
poll是Unix和Linux提供的事件处理器类型,它可以处理大量的并发连接和高负载的请求。poll使用一个文件描述符来监听事件,因此它不需要像epoll和kqueue那样每次都轮询所有的连接。poll还不支持边缘触发和水平触发两种模式,只能使用水平触发模式。
缺点
在处理大量的并发连接和高负载的请求时,可能会导致性能下降。
不支持边缘触发和水平触发两种模式,只能使用水平触发模式。
参考地址:https://blog.csdn.net/weixin_51582527/article/details/114154502 - select
select是Unix和Linux提供的事件处理器类型,它只能处理少量的并发连接和低负载的请求。select使用一个文件描述符来监听事件,因此它需要轮询所有的连接,比较浪费资源。select还不支持边缘触发和水平触发两种模式,只能使用水平触发模式。
参考地址:[https://blog.csdn.net/weixin_51582527/article/details/114154502\]
multi_accept
multi_accept定义了Nginx是否允许多个连接同时处理请求。如果请求数很大,可以适当增加这个值,以提高服务器的并发处理能力。
accept_mutex
accept_mutex定义了Nginx是否使用互斥锁来保护accept()系统调用。如果多个进程同时调用accept()系统调用,可能会导致竞争条件 和死锁。可以尝试关闭accept_mutex,以提高服务器的并发处理能力。
accept_mutex_delay
accept_mutex_delay定义了Nginx在使用互斥锁时,如果锁已经被其他进程持有,等待的时间。可以尝试增加这个值,以减少锁的竞争。
accept_mutex_retries
accept_mutex_retries定义了Nginx在使用互斥锁时,如果锁已经被其他进程持有,尝试获取锁的最大次数。可以尝试增加这个值,以减少锁的竞争。
🍏 配置示例
powershell
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
worker_connections:指定Nginx在处理请求时可以创建的最大连接数。
use epoll:使用epoll事件驱动模型来处理客户端请求。
multi_accept on:允许Nginx同时接受多个客户端连接请求。
这些参数可以根据您的服务器硬件配置和应用程序需求进行调整。
🍉 HTTP服务器
Nginx是一个高性能的Web服务器和反向代理服务器,它可以处理大量的并发连接和请求。Nginx的HTTP服务器模块可以用于处理HTTP请求和响应,包括静态文件、动态内容和代理请求等。
🥭 配置分析
server块:每个server块都定义了一个虚拟主机,它可以监听一个或多个端口,并处理来自客户端的HTTP请求。
location块:每个location块都定义了一个URL路径,它可以处理特定的HTTP请求。例如,您可以使用location块来处理静态文件请求或动态内容请求。
upstream块:每个upstream块都定义了一个后端服务器组,它可以处理来自客户端的请求。您可以使用upstream块来实现负载均衡和高可用性。
proxy_pass指令:使用proxy_pass指令可以将客户端请求转发到后端服务器。您可以使用proxy_pass指令来实现反向代理和负载均衡。
try_files指令:使用try_files指令可以指定Nginx在请求文件时尝试使用不同的文件名。这可以用于处理静态文件请求。
🍏 配置示例
powershell
http {
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
location /static/ {
root /var/www/static;
}
location /api/ {
proxy_pass http://backend-server;
}
}
upstream backend-server {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
}
在这个示例中,我们定义了一个虚拟主机,它监听80端口,处理来自客户端的HTTP请求。我们使用location块来处理静态文件请求和动态内容请求,使用upstream块来定义后端服务器组。我们还使用proxy_pass指令来实现反向代理和负载均衡。
🍉 虚拟主机
Nginx的虚拟主机是指在同一台服务器上运行多个Web应用程序的能力。每个虚拟主机都有自己的域名和服务器配置,可以访问不同的Web应用程序。虚拟主机可以帮助您轻松地将多个Web应用程序部署到同一台服务器上,每个应用程序都有自己的域名和服务器配置。以下是Nginx的虚拟主机配置的详细说明:
Nginx的虚拟主机配置通常保存在nginx.conf文件中。您可以使用以下命令打开nginx.conf文件:
powershell
sudo vim /etc/nginx/nginx.conf
在nginx.conf文件中,您可以找到虚拟主机的配置节。默认情况下,虚拟主机的配置节位于http块中。例如,以下是一个虚拟主机的配置节:
powershell
http {
server {
listen 80;
server_name example.com;
location / {
root /var/www/example.com;
index index.html;
}
}
}
在这个示例中,我们创建了一个名为example.com的虚拟主机,它监听80端口,并将所有请求通过location块转发到/var/www/example.com目录。我们还指定了默认的索引文件为index.html。
🍊 优化
worker_processes
如果您的服务器性能和应用负载都比较平稳,可以适当调整worker进程数,以避免过多的系统资源占用。
powershell
worker_processes auto;
worker_connections
可以增加连接数限制,以防止过多的连接导致服务器性能下降。您可以根据您的服务器性能和应用负载来调整连接数限制的大小。
powershell
events {
worker_connections 1024;
}
启用缓存
powershell
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 3m;
access_log off;
}
在这个示例中,我们使用正则表达式匹配静态资源的URL,并将它们缓存3分钟。这样可以避免重复加载静态资源,提高网站的性能。
启用压缩
在这个示例中,我们启用了Gzip压缩,并将压缩级别设置为5。我们还指定了需要压缩的MIME类型。
powershell
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
启用SSL/TLS
在这个示例中,我们启用了SSL/TLS,并指定了SSL/TLS证书和密钥的路径。这样可以确保网站的安全性和可信度。
powershell
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/ssl/certificate;
ssl_certificate_key /path/to/ssl/certificate/key;
location / {
proxy_pass http://backend1;
}
location /api {
proxy_pass http://backend2;
}
}
优化日志
我们定义了一个日志格式,并将访问日志和错误日志分别输出到不同的文件中。我们还指定了日志的格式和输出路径。
powershell
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;
error_log /var/log/nginx/error.log;
启用TCP keepalive
优化服务器配置,以提高网站的性能和安全性。
powershell
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
启用缓存
powershell
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 60m;
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;
我们使用proxy_cache指令将缓存区域应用于不同的URL路径。我们还使用proxy_cache_valid指令指定缓存的有效期,使用proxy_cache_bypass指令指定需要绕过缓存的请求,使用proxy_cache_revalidate指令指定是否需要重新验证缓存。
启用缓存可以提高网站的性能和响应速度,但是需要注意以下几点:
缓存区域的大小和有效期需要根据您的应用场景进行调整。如果您的应用需要处理大量的静态资源,可以将缓存区域的大小设置为较大的值,以避免重复加载静态资源。
缓存区域的存储路径需要根据您的服务器配置进行调整。如果您的服务器性能较高,可以将缓存区域的存储路径设置为SSD硬盘,以提高缓存的读取速度。
缓存的有效期需要根据您的应用场景进行调整。如果您的应用需要实时更新数据,可以将缓存的有效期设置为较短的值,以避免频繁的缓存验证。
缓存的绕过和重新验证需要根据您的应用场景进行调整。如果您的应用需要绕过缓存或重新验证缓存,可以使用proxy_cache_bypass和proxy_cache_revalidate指令进行相应的设置。
总之,启用缓存可以提高网站的性能和响应速度,但是需要注意缓存区域的大小、有效期、存储路径、绕过和重新验证等方面的问题。
🍔 总结
为了让这篇文章更有价值,对你印象更深刻,我们在回顾一下nginx的配置:
总的来说,nginx就像是一位魔法师,可以为你的网站带来无限的可能性。但是在学习和使用的过程中,也需要耐心和勇气。只有这样,才能把nginx的魔法发挥到极致。