第2课:配置文件详解

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

推广

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

配置文件详解

配置文件结构

1. 主配置文件

Nginx的主配置文件通常位于 /etc/nginx/nginx.conf,它采用层次化的块结构:

# 全局块
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# events块
events {
    worker_connections 1024;
    use epoll;
}

# http块
http {
    # http全局块
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # server块
    server {
        # server全局块
        listen 80;
        server_name example.com;
        
        # location块
        location / {
            root /var/www/html;
            index index.html;
        }
        
        location /api/ {
            proxy_pass http://backend;
        }
    }
    
    # 可以有多个server块
    server {
        listen 443 ssl;
        server_name secure.example.com;
        # ...
    }
}

2. 配置块层次

全局块

# 影响nginx全局的指令
user nginx;                    # 运行用户
worker_processes auto;         # 工作进程数
error_log /var/log/nginx/error.log;  # 错误日志
pid /run/nginx.pid;           # PID文件位置

events块

events {
    # 影响nginx服务器与用户的网络连接
    worker_connections 1024;   # 每个进程的最大连接数
    use epoll;                 # 事件驱动模型
    multi_accept on;           # 是否允许同时接受多个连接
}

http块

http {
    # HTTP相关的配置
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    # 包含其他配置文件
    include /etc/nginx/conf.d/*.conf;
}

server块

server {
    # 虚拟主机配置
    listen 80;                 # 监听端口
    server_name example.com;   # 服务器名称
    root /var/www/html;        # 网站根目录
    index index.html index.php; # 默认首页
    
    # 访问日志
    access_log /var/log/nginx/example.com.access.log main;
    error_log /var/log/nginx/example.com.error.log;
}

location块

location / {
    # 请求处理配置
    root /var/www/html;
    index index.html;
    try_files $uri $uri/ =404;
}

location ~ \.php$ {
    # PHP文件处理
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

核心指令详解

1. 全局指令

用户和进程

# 指定运行nginx的用户和组
user nginx nginx;

# 工作进程数量
worker_processes auto;          # 自动检测CPU核心数
worker_processes 4;             # 手动指定进程数

# 工作进程CPU亲和性
worker_cpu_affinity 0001 0010 0100 1000;

# 工作进程优先级
worker_priority -10;

# 工作进程打开文件数限制
worker_rlimit_nofile 65535;

错误日志

# 错误日志级别:debug, info, notice, warn, error, crit, alert, emerg
error_log /var/log/nginx/error.log warn;
error_log /var/log/nginx/error.log error;

# 关闭错误日志
error_log off;

2. events指令

events {
    # 每个worker进程的最大连接数
    worker_connections 1024;
    
    # 事件驱动模型
    use epoll;                  # Linux推荐
    use kqueue;                 # FreeBSD推荐
    
    # 是否允许同时接受多个连接
    multi_accept on;
    
    # 是否使用互斥锁
    accept_mutex on;
    accept_mutex_delay 500ms;
}

3. http指令

基本设置

http {
    # MIME类型
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # 字符集
    charset utf-8;
    
    # 服务器标识
    server_tokens off;          # 隐藏nginx版本号
    
    # 文件传输
    sendfile on;                # 启用高效文件传输
    tcp_nopush on;              # 优化数据包传输
    tcp_nodelay on;             # 禁用Nagle算法
}

连接设置

http {
    # 连接超时
    keepalive_timeout 65;       # 保持连接时间
    keepalive_requests 100;     # 保持连接请求数
    
    # 客户端设置
    client_max_body_size 10m;   # 客户端请求体最大大小
    client_body_timeout 60;     # 客户端请求体超时
    client_header_timeout 60;   # 客户端请求头超时
    
    # 发送超时
    send_timeout 60;
}

缓冲区设置

http {
    # 客户端缓冲区
    client_body_buffer_size 128k;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 4k;
    
    # 输出缓冲区
    output_buffers 1 32k;
    postpone_output 1460;
}

4. server指令

监听设置

server {
    # 基本监听
    listen 80;
    listen 443 ssl;
    listen [::]:80;             # IPv6
    
    # 监听选项
    listen 80 default_server;   # 默认服务器
    listen 80 reuseport;        # 端口重用
    listen 443 ssl http2;       # HTTP/2支持
}

服务器名称

server {
    # 精确匹配
    server_name example.com;
    
    # 通配符匹配
    server_name *.example.com;
    server_name example.*;
    
    # 正则表达式匹配
    server_name ~^(?<subdomain>.+)\.example\.com$;
    
    # 多个域名
    server_name example.com www.example.com;
}

根目录和索引

server {
    # 网站根目录
    root /var/www/html;
    
    # 默认首页文件
    index index.html index.htm index.php;
    
    # 自动索引
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
}

5. location指令

匹配规则

# 精确匹配
location = /favicon.ico {
    # 只匹配 /favicon.ico
}

# 前缀匹配
location /images/ {
    # 匹配以 /images/ 开头的路径
}

# 优先前缀匹配
location ^~ /static/ {
    # 优先匹配以 /static/ 开头的路径
}

# 正则表达式匹配(区分大小写)
location ~ \.(gif|jpg|png)$ {
    # 匹配以 .gif, .jpg, .png 结尾的文件
}

# 正则表达式匹配(不区分大小写)
location ~* \.(gif|jpg|png)$ {
    # 不区分大小写匹配图片文件
}

# 通用匹配
location / {
    # 匹配所有请求
}

匹配优先级

# 优先级从高到低:
# 1. = 精确匹配
# 2. ^~ 优先前缀匹配
# 3. ~ 和 ~* 正则表达式匹配(按配置顺序)
# 4. 前缀匹配(最长匹配)
# 5. / 通用匹配

配置语法规则

1. 基本语法

# 指令以分号结尾
directive_name parameter1 parameter2;

# 块指令用大括号
block_directive {
    directive_name parameter;
}

# 注释以#开头
# This is a comment

# 字符串可以用引号包围
directive_name "parameter with spaces";
directive_name 'single quoted parameter';

# 变量以$开头
set $variable_name value;

2. 变量使用

内置变量

# 请求相关
$request                # 完整的请求行
$request_method         # 请求方法 (GET, POST等)
$request_uri            # 完整的请求URI
$uri                    # 当前请求的URI
$args                   # 请求参数
$query_string           # 同$args

# 客户端相关
$remote_addr            # 客户端IP地址
$remote_port            # 客户端端口
$remote_user            # 客户端用户名
$http_user_agent        # 用户代理
$http_referer           # 引用页面

# 服务器相关
$server_name            # 服务器名称
$server_port            # 服务器端口
$server_protocol        # 服务器协议
$scheme                 # 协议方案 (http或https)
$host                   # 主机名

# 时间相关
$time_local             # 本地时间
$time_iso8601           # ISO 8601时间格式
$msec                   # 毫秒时间戳

# 响应相关
$status                 # 响应状态码
$body_bytes_sent        # 发送的字节数
$bytes_sent             # 发送的总字节数

自定义变量

# 设置变量
set $custom_var "hello world";
set $backend_pool "pool1";

# 使用变量
proxy_pass http://$backend_pool;
add_header X-Custom-Header $custom_var;

# 变量作用域
server {
    set $server_var "server level";
    
    location / {
        set $location_var "location level";
        # 可以访问$server_var和$location_var
    }
}

3. 条件判断

# if指令
if ($request_method = POST) {
    return 405;
}

if ($http_user_agent ~* "bot|spider") {
    return 403;
}

if ($uri ~* "\.(jpg|png|gif)$") {
    expires 30d;
}

# 条件操作符
# = 等于
# != 不等于
# ~ 正则匹配(区分大小写)
# ~* 正则匹配(不区分大小写)
# !~ 正则不匹配(区分大小写)
# !~* 正则不匹配(不区分大小写)

# 文件判断
if (-f $request_filename) {
    # 文件存在
}

if (!-f $request_filename) {
    # 文件不存在
}

if (-d $request_filename) {
    # 目录存在
}

if (-e $request_filename) {
    # 文件或目录存在
}

配置文件组织

1. 模块化配置

主配置文件

# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    # 基础配置
    include /etc/nginx/mime.types;
    include /etc/nginx/conf.d/default.conf;
    
    # 包含所有站点配置
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

站点配置文件

# /etc/nginx/conf.d/example.com.conf
server {
    listen 80;
    server_name example.com www.example.com;
    
    # 包含通用配置
    include /etc/nginx/snippets/common.conf;
    include /etc/nginx/snippets/ssl.conf;
    
    location / {
        root /var/www/example.com;
        index index.html;
    }
}

配置片段

# /etc/nginx/snippets/common.conf
# 通用安全头
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

# 隐藏服务器信息
server_tokens off;

# /etc/nginx/snippets/ssl.conf
# SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;

2. 配置验证

# 测试配置文件语法
nginx -t

# 测试特定配置文件
nginx -t -c /path/to/nginx.conf

# 显示配置文件内容
nginx -T

# 重新加载配置
nginx -s reload
systemctl reload nginx

最佳实践

1. 配置组织

  • 使用模块化配置,将不同功能分离到不同文件
  • 使用有意义的文件名和目录结构
  • 添加适当的注释说明配置用途

2. 性能优化

  • 合理设置worker_processes和worker_connections
  • 启用sendfile和tcp_nopush
  • 配置适当的缓冲区大小

3. 安全配置

  • 隐藏nginx版本信息
  • 设置适当的客户端请求限制
  • 配置安全响应头

总结

本课程详细介绍了Nginx配置文件的结构和语法:

  1. 配置结构:全局块、events块、http块、server块、location块
  2. 核心指令:用户进程、连接设置、缓冲区配置
  3. 语法规则:指令语法、变量使用、条件判断
  4. 配置组织:模块化配置、配置验证

下一课预告

在下一课中,我们将学习虚拟主机配置,包括:

  • 基于域名的虚拟主机
  • 基于IP的虚拟主机
  • 基于端口的虚拟主机
  • 默认服务器配置

💡 小贴士:理解Nginx配置文件的层次结构是掌握Nginx的关键。建议多练习配置文件的编写和测试,熟悉各种指令的用法。

Vue3 + TypeScript 企业级项目实战

课程推荐

Vue3 + TypeScript 企业级项目实战
Python 全栈开发工程师培训

热门课程

Python 全栈开发工程师培训

📚 文章对你有帮助?请关注我的公众号,万分感谢!

获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号

关注公众号

第一时间获取最新技术文章

添加微信

添加微信

技术交流 · 问题答疑 · 学习指导

评论讨论

欢迎留下你的想法和建议