nginx目录结构
bash
[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp # POST 大文件暂存目录
├── conf # Nginx所有配置文件的目录
│ ├── fastcgi.conf # fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default # fastcgi.conf的原始备份文件
│ ├── fastcgi_params # fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types # 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf #这是Nginx默认的主配置文件,日常使用和修改的文件
│ ├── nginx.conf.default
│ ├── scgi_params # scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params # uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # Nginx默认站点目录
│ ├── 50x.html # 错误页面优雅替代显示文件,例如出现502错误时会调用此页面
│ └── index.html # 默认的首页文件
├── logs # Nginx日志目录
│ ├── access.log # 访问日志文件
│ ├── error.log # 错误日志文件
│ └── nginx.pid # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp # 临时目录
├── sbin # Nginx 可执行文件目录
│ └── nginx # Nginx 二进制可执行程序
├── scgi_temp # 临时目录
└── uwsgi_temp # 临时目录
配置文件结构
Nginx 的配置文件通常是 /etc/nginx/nginx.conf,它采用分块的结构,主要包括以下几个部分:
示例配置文件
bash
# 全局块:配置全局参数
user www-data; # 运行 Nginx 的用户
worker_processes auto; # 工作进程数,auto 表示根据 CPU 核心数自动设置
error_log /var/log/nginx/error.log; # 错误日志路径
# 事件块:配置事件驱动模型的参数
events {
worker_connections 1024; # 每个工作进程的最大连接数
}
# HTTP 块:配置 HTTP 相关的参数
http {
include mime.types; # 包含 MIME 类型配置文件
default_type application/octet-stream; # 默认的 MIME 类型
sendfile on; # 启用高效文件传输模式
keepalive_timeout 65; # 客户端连接保持时间(秒)
# Server 块:配置虚拟主机
server {
listen 80; # 监听 80 端口
server_name example.com; # 服务器域名
# Location 块:配置请求的 URI 匹配规则
location / {
root /var/www/html; # 静态文件的根目录
index index.html; # 默认首页文件
}
}
}
全局块:配置 Nginx 的全局参数,如运行用户、工作进程数、错误日志等。
事件块:配置事件驱动模型的参数,如每个工作进程的最大连接数。
HTTP 块:配置 HTTP 相关的参数,如 MIME 类型、文件传输模式、连接保持时间等。
Server 块:配置虚拟主机,定义监听的端口和域名。
Location 块:配置请求的 URI 匹配规则和处理逻辑。
另外一个案例
bash
worker_processes 1; #允许进程数量,建议设置为cpu核心数或者auto自动检测,注意Windows服务器上虽然可以启动多个processes,但是实际只会用其中一个
events {
#单个进程最大连接数(最大连接数=连接数*进程数)
#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
worker_connections 1024;
}
http {
#文件扩展名与文件类型映射表(是conf目录下的一个文件)
include mime.types;
#默认文件类型,如果mime.types预先定义的类型没匹配上,默认使用二进制流的方式传输
default_type application/octet-stream;
#sendfile指令指定nginx是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度。
sendfile on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
#虚拟主机的配置
server {
#监听端口
listen 80;
#域名,可以有多个,用空格隔开
server_name localhost;
#配置根目录以及默认页面
location / {
root html;
index index.html index.htm;
}
#出错页面配置
error_page 500 502 503 504 /50x.html;
#/50x.html文件所在位置
location = /50x.html {
root html;
}
}
}
静态文件服务
Nginx 可以高效地提供静态文件服务
bash
server {
listen 80; # 监听 80 端口
server_name example.com; # 服务器域名
location / {
root /var/www/html; # 静态文件的根目录
index index.html; # 默认首页文件
}
location /images/ {
root /var/www; # 图片文件的根目录
}
}
root /var/www/html;:指定静态文件的根目录为 /var/www/html。
index index.html;:当访问根路径时,默认返回 index.html 文件。
location /images/:匹配以 /images/ 开头的请求,从 /var/www/images 目录提供文件。
反向代理
Nginx 可以作为反向代理服务器,将客户端请求转发到后端服务器。
bash
server {
listen 80; # 监听 80 端口
server_name example.com; # 服务器域名
location / {
proxy_pass http://localhost:8080; # 将请求转发到本地的 8080 端口
proxy_set_header Host $host; # 设置请求头
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
proxy_pass http://localhost:8080;:将请求转发到本地的 8080 端口。
proxy_set_header:设置转发请求的头信息,确保后端服务器能获取正确的客户端信息。
负载均衡
Nginx 支持多种负载均衡算法,可以将请求分发到多个后端服务器。
bash
# 定义后端服务器组
upstream backend {
server backend1.example.com; # 后端服务器 1
server backend2.example.com; # 后端服务器 2
server backend3.example.com; # 后端服务器 3
}
server {
listen 80; # 监听 80 端口
server_name example.com; # 服务器域名
location / {
proxy_pass http://backend; # 将请求转发到后端服务器组
}
}
bash
upstream backend:定义一组后端服务器。
proxy_pass http://backend;:将请求转发到 backend 服务器组。
Nginx 默认使用轮询(Round Robin)算法分发请求。
动静分离
动静分离 是一种常见的优化策略,将动态请求(如 API、PHP、Java 等)和静态资源(如
HTML、CSS、JS、图片等)分开处理。Nginx 可以通过配置实现动静分离,从而提高服务器的性能和可维护性。
动静分离的原理
bash
静态资源:由 Nginx 直接处理并返回给客户端,无需经过后端应用服务器。
动态请求:由 Nginx 转发到后端应用服务器(如 Tomcat、Node.js、PHP-FPM 等)处理。
Nginx 动静分离配置
bash
server {
listen 80; # 监听 80 端口
server_name example.com; # 服务器域名
# 静态资源处理
location /static/ {
root /var/www; # 静态资源的根目录
expires 7d; # 设置缓存过期时间为 7 天
}
# 动态请求处理
location / {
proxy_pass http://localhost:8080; # 将动态请求转发到后端服务器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 其他静态资源(如图片、CSS、JS)
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
root /var/www/static; # 静态资源的根目录
expires 30d; # 设置缓存过期时间为 30 天
}
}
配置详解
bash
(1)静态资源处理
location /static/:
匹配以 /static/ 开头的请求。
root /var/www;:静态资源的根目录为 /var/www,因此实际文件路径为 /var/www/static/。
expires 7d;:设置静态资源的缓存过期时间为 7 天,减少客户端请求。
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$:
使用正则表达式匹配常见的静态资源文件(如图片、CSS、JS 等)。
root /var/www/static;:静态资源的根目录为 /var/www/static。
expires 30d;:设置缓存过期时间为 30 天。
动态请求处理
bash
location /:
匹配所有请求。
proxy_pass http://localhost:8080;:将请求转发到后端服务器 localhost:8080。
proxy_set_header:设置转发请求的头信息,确保后端服务器能获取正确的客户端信息。
性能优化
bash
# 全局块
user www-data;
worker_processes auto; # 根据 CPU 核心数自动设置工作进程数
worker_rlimit_nofile 100000; # 每个工作进程的文件描述符限制
# 事件块
events {
worker_connections 4096; # 每个工作进程的最大连接数
multi_accept on; # 同时接受多个连接
use epoll; # 使用 epoll 事件驱动模型(Linux 专用)
}
# HTTP 块
http {
include mime.types;
default_type application/octet-stream;
sendfile on; # 启用高效文件传输模式
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on; # 禁用 Nagle 算法,提高响应速度
keepalive_timeout 65; # 客户端连接保持时间
gzip on; # 启用 Gzip 压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 压缩的文件类型
}
bash
worker_processes auto;:根据 CPU 核心数自动设置工作进程数。
worker_connections 4096;:每个工作进程可以处理的最大连接数。
sendfile on;:启用高效文件传输模式,减少文件复制的开销。
gzip on;:启用 Gzip 压缩,减少传输数据量。
tcp_nopush on; 和 tcp_nodelay on;:优化 TCP 传输性能。
总结
配置文件结构:Nginx 的配置文件分为全局块、事件块、HTTP 块、Server 块和 Location 块。
静态文件服务:通过 root 和 index 指令提供静态文件服务。
反向代理:通过 proxy_pass 将请求转发到后端服务器。
负载均衡:通过 upstream 定义后端服务器组,并使用 proxy_pass 分发请求。
性能优化:通过调整工作进程数、连接数、启用 Gzip 压缩等方式提升性能。