Nginx配置文件(conf/nginx.conf)整体分为三部分
http块中可以配置多个Server块,每个Server块中可以配置多个location块
在 Nginx 配置中,http 块是一个核心的配置容器,用于定义所有与 HTTP 协议相关的设置。它是 Nginx 作为 Web 服务器或反向代理时的主要配置上下文。
# 主配置文件 nginx.conf
# 全局配置段 (在events和http之外)
user nginx nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
}
# http 块开始
http {
# HTTP 全局配置
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
# 服务器块
server {
listen 80;
server_name example.com;
# 服务器配置...
}
# 可以包含其他配置文件
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
# http 块结束
http {
# MIME 类型include mime.types;
default_type application/octet-stream;
# 日志配置access_log /var/log/nginx/access.log combined;
error_log /var/log/nginx/error.log warn;
# 编码charset utf-8;
}
http {
# 连接超时keepalive_timeout 65;
keepalive_requests 100;
# 发送文件优化sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 缓冲区大小client_body_buffer_size 128k;
client_max_body_size 10m;
# 开启 Gzip 压缩gzip on;
gzip_types text/plain text/css application/json application/javascript;
}
http {
# 定义上游服务器组upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 backup;
}
# 或者使用负载均衡算法upstream load_balancer {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
}
http {
# 代理缓存proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
max_size=1g inactive=60m;
# FastCGI 缓存fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2
keys_zone=fcgi_cache:10m max_size=1g;
}
当 root 出现在不同层级时,遵循以下规则:
server 块中的 root:作为默认值,会被所有 location 块继承location 块中的 root:覆盖继承的值,只在该 location 内有效nginx
server {
listen 80;
server_name example.com;
root /var/www/main;# 默认根目录
location / {
# 隐式继承 root /var/www/main;try_files $uri $uri/ =404;
}
location /images/ {
# 隐式继承 root /var/www/main;# 文件路径: /var/www/main/images/logo.png}
}
结果:所有 location 都使用 /var/www/main 作为根目录。
nginx
server {
listen 80;
server_name example.com;
root /var/www/main;# 默认根目录
location / {
# 使用继承的 root /var/www/maintry_files $uri $uri/ =404;
}
location /blog/ {
root /var/www/blog;# 覆盖继承的 root# 文件路径: /var/www/blog/article.html}
location /static/ {
# 使用继承的 root /var/www/main# 文件路径: /var/www/main/static/style.css}
}
结果:
/ 和 /static/ 使用 /var/www/main/blog/ 使用 /var/www/blognginx
server {
listen 80;
server_name example.com;
# 没有 server 级的 root
location / {
root /var/www/website;
try_files $uri $uri/ =404;
}
location /api/ {
# 错误:没有定义 root!proxy_pass <http://backend>;
}
}
结果:/api/ location 会报错,因为没有定义 root。
root 时:nginx
server {
root /var/www/main;
location /images/ {
# 请求: /images/photo.jpg# 文件路径: /var/www/main/images/photo.jpg}
}
alias 时(对比):nginx
server {
location /images/ {
alias /var/www/images/;
# 请求: /images/photo.jpg# 文件路径: /var/www/images/photo.jpg}
location /static/ {
alias /var/www/assets/;
# 请求: /static/css/style.css# 文件路径: /var/www/assets/css/style.css}
}
nginx
server {
listen 80;
server_name example.com;
root /var/www/primary;# 主要根目录
# 大部分内容使用主要根目录location / {
try_files $uri $uri/ /index.html;
}
# 用户上传的文件在单独目录location /uploads/ {
root /var/user-uploads;
# 文件路径: /var/user-uploads/uploads/avatar.jpg}
# 旧版本存档在另一个位置location /legacy/ {
root /var/old-website;
# 文件路径: /var/old-website/legacy/page.html}
}
nginx
server {
listen 80;
server_name myapp.com;
root /var/www/myapp;
# 前端静态资源location / {
try_files $uri $uri/ /index.html;
}
# API 代理(不需要 root)location /api/ {
proxy_pass <http://localhost:3000>;
}
# 管理后台使用不同的应用location /admin/ {
root /var/www/admin-panel;
try_files $uri $uri/ /admin/index.html;
}
# 文档使用第三方工具生成location /docs/ {
root /var/www/documentation;
index index.html;
}
}
nginx
server {
listen 80;
server_name ~^(www\\.)?(?<tenant>.+)\\.company\\.com$;
# 动态根目录基于租户子域名root /var/www/tenants/$tenant;
location / {
try_files $uri $uri/ /index.html;
}
# 所有租户共享的静态资源location /shared/ {
root /var/www/shared-assets;
}
}
location 继承 server 的 root,但可以覆盖root 指令会将 location 路径包含在最终文件路径中server 级设置 root 作为默认值是好的实践location 不需要文件服务(如代理),就不需要 root