{"id":18321655,"url":"https://github.com/bryanadamss/nginx-conf","last_synced_at":"2025-07-06T13:06:44.833Z","repository":{"id":215642673,"uuid":"739448753","full_name":"BryanAdamss/nginx-conf","owner":"BryanAdamss","description":"前端常用nginx配置 Common Nginx Configurations for FE's","archived":false,"fork":false,"pushed_at":"2024-04-28T15:05:12.000Z","size":23,"stargazers_count":1,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-24T08:47:47.164Z","etag":null,"topics":["nginx","nginx-conf","nginx-template"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BryanAdamss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-05T15:38:13.000Z","updated_at":"2024-07-11T08:06:52.000Z","dependencies_parsed_at":"2024-04-28T16:24:09.620Z","dependency_job_id":"1aa92190-a115-403b-99d9-420ee95242ad","html_url":"https://github.com/BryanAdamss/nginx-conf","commit_stats":null,"previous_names":["bryanadamss/nginx-conf"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BryanAdamss/nginx-conf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanAdamss%2Fnginx-conf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanAdamss%2Fnginx-conf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanAdamss%2Fnginx-conf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanAdamss%2Fnginx-conf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BryanAdamss","download_url":"https://codeload.github.com/BryanAdamss/nginx-conf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BryanAdamss%2Fnginx-conf/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263905744,"owners_count":23527972,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nginx","nginx-conf","nginx-template"],"created_at":"2024-11-05T18:20:39.202Z","updated_at":"2025-07-06T13:06:44.815Z","avatar_url":"https://github.com/BryanAdamss.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nginx配置\n\n- 在线可视化配置\n\t- https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN\n\n## 配置文件结构\n\n```nginx\nuser nginx; # 指定运行 Nginx 的用户和用户组，通常是指定系统中存在的非特权用户。需要确保该用户对 Nginx 所需的文件和目录有适当的访问权限。\n\nworker_processes auto; # 设置 worker 进程数，可以是数字或 `auto`。通常设置为 CPU 核心数的倍数，以充分利用系统资源。\n\nerror_log /var/log/nginx/error.log info; # 设置错误日志路径和级别。错误日志是排查问题的重要工具，级别包括 `debug`、`info`、`notice`、`warn`、`error` 等。\n\npid /var/run/nginx.pid; # 指定保存 Nginx 主进程 ID 的文件路径。通常保存在 `/var/run/nginx.pid`。\n\nworker_rlimit_nofile 8192; # 设置每个 worker 进程的最大打开文件描述符数，影响系统的最大文件打开数。\n\ndaemon on; # 启动 Nginx 作为守护进程，即在后台运行。\n\n# events块用于配置与事件驱动机制相关的参数，控制 Nginx 服务器的并发连接处理\nevents {\n    # 配置参数\n    worker_connections 1024; # 设置每个 worker 进程的最大连接数\n    use epoll; # 选择事件驱动模型，可以是 `select`、`poll`、`kqueue`、`epoll` 等；`epoll` 在 Linux 环境下通常表现较好\n}\n\n# http块用于配置 HTTP 服务器的全局参数，并包含了与 HTTP 请求和响应相关的配置。\nhttp {\n    include /etc/nginx/mime.types; # 包含其他配置文件，通常包含 MIME 类型配置等。\n    default_type application/octet-stream; # 设置默认 MIME 类型\n\n\t# 配置全局的访问日志的格式。可以有多个。在http块中都可以访问到\n    log_format main '$remote_addr - $remote_user [$time_local] \"$request\" '\n                      '$status $body_bytes_sent \"$http_referer\" '\n                      '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n\t# 配置访问日志的路径并使用main这种log_format。这是全局日志，会记录所有server块的访问记录\n    access_log /var/log/nginx/access.log main;\n\n    # 可以有多个 `server` 块，用于配置不同的虚拟主机，一个server块代表一个虚拟主机\n    server {\n        # 服务器配置\n        listen 80; # 监听的本机某ip地址和端口号，不带ip则默认当前服务器ip。一个服务器可以通过虚拟网络接口技术或在物理网卡上添加多个ip的形式，实现多个ip访问同一台机器；\n        server_name example.com; # 设置虚拟主机的域名。进入的请求会携带Host头，server_name和Host头一致 且 请求访问的ip+port和listen匹配，则代表访问的当前server块；当通过ip+port访问，但请求不带Host或Host同server_name不匹配，则无法进入到当前server块，而是进入到nginx的defaultServer，默认server，可通过在listen后指定deafultServer标识来确定，或没有server_name的server也会当成默认server；\n        root /usr/share/nginx/html; # 设置网站根目录，从哪找网站资源。\n        index index.html index.htm; # 设置默认首页文件，nginx首页找的文件。\n\n\t\t# 设置当前server的访问日志路径并使用http中定义的main日志格式。\n\t\t# 其仅仅记录当前server的访问日志\n\t\taccess_log /var/log/nginx/access-example.log main; \n\t\terror_log log/example_error.log; # 当前虚拟主机的错误日志\n\t\terror_page 404 /404.html; # 配置自定义错误页面。\n\n\t\t# 配置全局的gzip，也可在server中单独配置\n\t    gzip on; # 启用gzip模块\n\t    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 需要gzip的类型，一般只压缩文本的类型\n\t    gzip_comp_level 5; # 设置压缩级别（1-9），级别越高压缩率越高，但耗费更多 CPU。\n\t    gzip_min_length 256; # 设置最小压缩文件大小，小于该值的文件将不会被压缩。\n\t    gzip_buffers 16 8k; # 设置缓冲区大小。\n\t    gzip_proxied any; # 启用或禁用代理服务器上的压缩。\n\t    gzip_vary on; # 启用或禁用根据 Accept-Encoding 头字段的 Vary 头字段。\n\n\t\t# 可以包含多个 `location` 块，用于配置不同的路径规则，location匹配原理见下面的章节\n\t\tlocation / {\n\t\t\t# 处理所有未匹配到其他 location 的请求\n\t\t\t# autoindex on; # 开启自己创建索引目录功能，一般不开启，只在做些简单的静态内容索引时用上\n\t\t\t\n\t\t\ttry_files $uri $uri/ /index.html; # 尝试文件路径，用于处理静态文件。\n\n\t\t\t# 设置CORS，具体设置CORS见下面章节\n\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\tadd_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';\n\t\t\tadd_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';\t\n\n\t\t\tif ($request_method = 'OPTIONS') {\n\t\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\t\tadd_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';\n\t\t\t\tadd_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';\n\t\t\t\t\n\t\t\t\tadd_header 'Access-Control-Max-Age' 1728000;\n\t\t\t\tadd_header 'Content-Type' 'text/plain; charset=utf-8';\n\t\t\t\tadd_header 'Content-Length' 0;\n\t\t\t\treturn 204;\n\t\t\t}\n\t\t}\n\n\t\tlocation /app/ {\n\t\t\t# 反向代理到后端服务器。反向代理的一些实践见下面章节\n\t\t    proxy_pass http://backend_server; # 将以 `/app/` 开头的请求转发给 `http://backend_server`。\n\t\t}\n\t\t\n\t\tlocation ~ ^/user/(\\d+)/ {\n\t\t\t# 重写 URL。\n\t\t    rewrite ^/user/(\\d+)/$ /profile?id=$1 last; # 将形如 `/user/123/` 的 URL 重写为 `/profile?id=123`。\n\t\t}\n\n\t\tlocation /images/ {\n\t\t\t# 制定别名，用于指定实际文件路径。\n\t\t\talias /usr/share/nginx/html/images/;  # 将以 `/images/` 开头的请求映射到 `/usr/share/nginx/html/images/` 目录。\n\t\t\texpires 30d; # 设置缓存过期时间。\n\t\t}\n\t\t\n\t\tlocation /secure/ {\n\t\t\t# 添加响应头。\n\t\t    add_header X-Frame-Options \"SAMEORIGIN\";\n\t\t    add_header X-Content-Type-Options \"nosniff\";\n\t\t}\n\n\t\tlocation = /robots.txt {\n\t\t\t# 直接返回指定的 HTTP 状态码和内容。\n\t\t    return 200 \"User-agent: *\\nDisallow: /\";\n\t\t}\n\n    }\n\n\tserver {\n\t\t# 其它虚拟主机\n\t\t# 开启https，具体开启步骤见下面章节\n\t    listen 443 ssl; # 启用 HTTPS，并监听 443 端口。\n\t    server_name your_domain.com;\n\t\n\t    ssl_certificate /path/to/your_certificate.crt; # 指定 SSL 证书的路径。\n\t    ssl_certificate_key /path/to/your_private_key.key; # 指定 SSL 私钥的路径。\n\n\t\t# 其它配置\n\t}\n} \n\n# 包含其他配置文件，用于模块化配置。可以包含其他配置文件或目录中的所有配置文件。\ninclude /etc/nginx/conf.d/*.conf;\n```\n\n## location匹配原理\n\n- 路径匹配原理涉及不同的匹配规则和优先级\n- 规则\n\n```nginx\n# 前缀匹配（Prefix Match）： `location /path/` 使用前缀匹配，匹配以 `/path/` 开头的请求路径。\nlocation /images/ {\n\t# 匹配以 /images/ 开头的路径\n\t# 示例匹配：/images/photo.jpg \n\t# 示例不匹配：/documents/file.txt\n}\n\n# 精确匹配（Exact Match）： 使用 `=` 前缀可以进行精确匹配，匹配与指定路径完全相同的请求。\nlocation = /path {\n\t# 精确匹配 /path\n\t# 示例匹配：/path\n\t# 示例不匹配：/path/info\n}\n\n# 正则表达式匹配： 使用 `~` 或 `~*` 前缀可进行正则表达式匹配，区分大小写或不区分大小写。\nlocation ~ ^/user/\\d+/ {\n\t# 匹配形如 /user/123/ 的路径\n\t# 示例匹配：/user/456/ \n\t# 示例不匹配：/user/john/\n}\n\nlocation ~* \\.png$ {\n\t# 匹配以 .png 结尾的路径，不区分大小写\n\t# 示例匹配：/images/photo.PNG\n\t# 示例不匹配：/documents/file.jpg\n}\n\n# 最长前缀匹配： 在多个 `location` 中，Nginx 会选择最长的前缀匹配。如果存在两个 `location`，一个是 `/images/`，另一个是 `/images/data/`，请求 `/images/data/file.jpg` 会匹配到 `/images/data/`。\n```\n\n- 优先级\n\t1. **精确匹配优先：** 精确匹配的 `location` 优先级高于前缀匹配。\n\t2. **正则表达式匹配优先：** 正则表达式匹配的优先级高于前缀匹配。但如果存在精确匹配，精确匹配仍然优先。\n\t3. **按配置文件中出现的顺序：** 如果存在多个匹配，按照在配置文件中出现的顺序选择第一个匹配。\n\t4. **总结：**\n\t\t- 精确匹配\u003e正则匹配\u003e前缀匹配\n\t\t- 同优先级匹配多个location，取第一个匹配\n- 注意\n\t1. **顺序很重要：** `location` 的匹配顺序非常重要，因为第一个匹配成功的 `location` 将会被使用。\n\t2. **谨慎使用正则表达式：** 正则表达式匹配可能会影响性能，因此谨慎使用。对于简单的路径匹\n\t3. 配，前缀匹配通常更高效。\n\t4. **避免冲突：** 当存在多个 `location` 块时，确保它们的路径不会相互冲突，以免出现不符合预期的行为。\n\t5. **使用 `location /`：** 如果没有精确匹配或更具体的路径匹配，`location /` 可用于处理所有未匹配到其他 `location` 的请求。\n\n```nginx\nlocation / {\n    # 处理所有未匹配到其他 location 的请求\n}\n```\n\n## 反向代理实践\n\n- **基本配置：**\n\t- `proxy_pass`后跟后端服务器的地址，可以是具体的 IP 地址或域名，也可以是包含协议和端口号的完整地址。\n\n```nginx\nlocation / {\n    proxy_pass http://backend_server;\n    # 其他代理相关配置...\n}\n```\n\n- **添加代理头信息：**\n\t- 使用 `proxy_set_header` 添加额外的头信息，通常用于传递客户端的真实 IP 地址 (`X-Real-IP`)。\n\n```nginx\nlocation / {\n    proxy_pass http://backend_server;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    # 其他代理相关配置...\n}\n```\n\n- **处理后端服务器不同路径：**\n\t- 如果后端服务器的应用程序部署在路径中，确保 `proxy_pass` 的路径与后端服务器上的路径一致。\n\n```nginx\nlocation /app/ {\n    proxy_pass http://backend_server/app/;\n    # 其他代理相关配置...\n}\n```\n\n- **启用代理缓冲：**\n\t- 启用代理缓冲以减轻后端服务器的负载，可以根据服务器性能调整缓冲的大小。\n\n```nginx\nlocation / {\n    proxy_pass http://backend_server;\n    proxy_buffering on;\n    proxy_buffer_size 4k;\n    proxy_buffers 4 4k;\n    proxy_busy_buffers_size 8k;\n    # 其他代理相关配置...\n}\n```\n\n- **处理长连接：**\n\t- 处理长连接，特别是对于 WebSocket 连接，需要设置适当的头信息。\n\n```nginx\nlocation / {\n    proxy_pass http://backend_server;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection 'upgrade';\n    # 其他代理相关配置...\n}\n```\n\n- **负载均衡：**\n\t- 使用 `upstream` 配置实现负载均衡，确保多个后端服务器均衡处理请求。\n\n```nginx\nupstream backend_servers {\n    server backend1.example.com;\n    server backend2.example.com;\n    # 其他后端服务器...\n}\n\nserver {\n    location / {\n        proxy_pass http://backend_servers;\n        # 其他代理相关配置...\n    }\n}\n```\n\n- **错误处理：**\n\t- 配置适当的错误页面，以提供友好的错误信息给用户。\n\n```nginx\nlocation / {\n    proxy_pass http://backend_server;\n    error_page 502 503 504 /error.html;\n    # 其他代理相关配置...\n}\n```\n\n- **日志记录：**\n\t- 启用日志记录以便于故障排除和性能监控。\n\n```nginx\nlocation / {\n    proxy_pass http://backend_server;\n    access_log /var/log/nginx/proxy_access.log;\n    error_log /var/log/nginx/proxy_error.log;\n    # 其他代理相关配置...\n}\n```\n\n## CORS配置\n\n- 配置 CORS（跨域资源共享）是为了让 web 应用程序能够在一个域上使用其他域的资源。\n\n```nginx\nserver {\n    listen 80;\n    server_name your_domain.com;\n\n    location / {\n\t\t# STEP1：配置基础的CORS头\n        add_header 'Access-Control-Allow-Origin' '*'; # 指定允许访问资源的域。`'*'` 表示允许所有域，也可以指定具体的域。\n        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; # 指定允许的 HTTP 方法。\n        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; # 指定允许的请求头。\n\n\t\t# STEP2：处理OPTIONS请求\n\t\t# CORS 通常会发送一个 OPTIONS 预检请求（Preflight Request）来检查是否允许实际的请求\n        if ($request_method = 'OPTIONS') {\n            add_header 'Access-Control-Allow-Origin' '*';\n            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';\n            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';\n            \n            add_header 'Access-Control-Max-Age' 1728000;\n            add_header 'Content-Type' 'text/plain; charset=utf-8';\n            add_header 'Content-Length' 0;\n            return 204;\n        }\n    }\n}        \n```\n\n## 配置HTTPS\n\n - HTTPS 相关设置通常是放在 `server` 块内的，因为 HTTPS 设置是针对具体的虚拟主机或站点的。HTTPS 的配置包括 SSL 证书、私钥、协议版本、加密套件等，这些都是与特定的域名或虚拟主机相关的。\n\n1. **获取 SSL 证书：**\n\t- 你需要获取有效的 SSL 证书。你可以购买 SSL 证书，也可以使用免费的证书颁发机构（CA）如 Let's Encrypt 提供的证书。Let's Encrypt 提供的证书可以通过 Certbot 工具进行免费获取和续订。\n2. **安装 SSL 证书：**\n\t- 将获取到的 SSL 证书文件和私钥文件上传到服务器。通常，证书文件的扩展名为 `.crt` 或 `.pem`，而私钥文件的扩展名为 `.key`。\n3. **配置 Nginx 支持 HTTPS：**\n\t- 打开 Nginx 配置文件，通常位于 `/etc/nginx/nginx.conf` 或 `/etc/nginx/conf.d/default.conf`。确保以下配置项存在或添加：\n\n```nginx\nserver {\n    listen 443 ssl; # 启用 HTTPS，并监听 443 端口。\n    server_name your_domain.com;\n\n    ssl_certificate /path/to/your_certificate.crt; # 指定 SSL 证书的路径。\n    ssl_certificate_key /path/to/your_private_key.key; # 指定 SSL 私钥的路径。\n\n    # 其他 SSL 配置...\n}\n```\n\n4. **配置重定向：**\n\t- 如果你希望所有 HTTP 请求都自动重定向到 HTTPS，可以添加一个额外的 server 配置块：\n\n```nginx\nserver {\n    listen 80;\n    server_name your_domain.com;\n    \n    return 301 https://$host$request_uri; # 将所有 HTTP 请求重定向到 HTTPS。\n}\n```\n\n5. **配置 SSL 协议和加密套件（可选）：**\n\t- 可以选择性地配置支持的 SSL 协议版本和加密套件。\n\t- 根据最新的安全建议，尽量使用更安全的协议版本和加密套件。\n\n```nginx\nhttp {\n\t# 一些全局的 HTTPS 可以放在 `http` 块内，对所有server生效，也可以server单独配置\n\tssl_protocols TLSv1.2 TLSv1.3;\n\tssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384';\n}\n```\n\n6. **重启验证**\n\n```bash\nsudo nginx -t # 验证配置\n\nsudo systemctl reload nginx # 重启\n\n# or\n\nsudo service nginx restart # 重启\n```\n\n## URL重写\n\n- 域名迁移时可以使用URL重写保证流量顺利迁移到新域名\n- 主要用到`nginx`的`rewrite`功能，`rewrite`可以实现`url`的重写、规范化\n- 实用场景\n\t- 读取`ua`，对爬虫封禁\n\t- 动态的`url`伪装成静态的`html`页面，便于搜索引擎抓取\n\t- 新旧域名的更新和迁移\n- 语法\n\n```nginx\nrewrite regex replacement [flag];\n```\n\n- `regex` 是一个正则表达式，用于匹配需要重写的 URL。\n    - `replacement` 是一个字符串，用于指定替换的内容。可以使用捕获组来引用正则表达式中的匹配结果。\n    - `flag` 是一个可选的标志，用于指定重写规则的行为。常用的标志包括：\n        - `last`：表示完成重写操作后停止匹配。\n        - `break`：与 `last` 类似，但不会重新尝试匹配其他重写规则。\n        - `redirect`：发出临时重定向（HTTP 状态码 302）。\n        - `permanent`：发出永久重定向（HTTP 状态码 301）。\n        - `if`：条件重写。\n- 示例\n\n```nginx\n# 将所有请求重写到 index.html\nrewrite ^(.*)$ /index.html;\n\n# 重写以 /old 开头的 URL 到以 /new 开头的 URL\nrewrite ^/old(.*)$ /new$1;\n\n# 使用正则表达式捕获组进行替换\nrewrite ^/blog/(.*)$ /article/$1;\n\n# 发出永久重定向\nrewrite ^/oldpage$ /newpage permanent;\n\n```\n\n## 同一台机器绑定多个ip的方法\n\n- 添加虚拟网络接口（Virtual Network Interface）即IP别名（IP aliasing）\n\t- 这种方式在同一台机器上创建多个网络接口，每一个接口都有自己的IP地址。你可以使用`ifconfig`命令创建额外的接口。比如，下面的命令就创建了一个名为`eth0:1`的虚拟接口，并且给它分配了`192.168.1.2`这个IP地址：\n\n```bash\nsudo ifconfig eth0:1 192.168.1.2\n```\n\n- 在物理网卡上添加额外的IP地址\n\t- 对于支持绑定多个ip的网卡，你也可以直接在其上添加多个IP地址。你可以使用`ip`命令添加额外的地址。比如，下面的命令就在`eth0`接口上添加了`192.168.1.2`这个IP地址：\n\n```bash\nsudo ip addr add 192.168.1.2 dev eth0\n```\n\n- 区别\n\t- 虚拟网络接口（IP别名）。在这种方式中，虽然物理硬件只有一块，但是在逻辑上我们创建了多个网络接口，每个接口都有各自单独的名字和IP地址。例如，我们可以创建一个名为eth0:1的接口，同时为它分配一个IP地址。这种方式的优点是，它可以清晰地分隔开不同的网络接口和对应的IP地址。\n\t- 在物理网卡上添加额外的IP地址。这种方式中，我们在同一物理网络接口上绑定了多个IP地址。也就是说，这个网络接口有一个主IP地址，同时还有一个或多个附属IP地址。所有这些地址都属于同一个网络接口，并且可以在这个接口上同时使用。\n\t- 这两种方式的主要区别在于，虚拟网络接口的方法在逻辑上创建了多个网络接口，每个接口都有自己独立的名字和IP地址，这在一些情况下可能使网络配置更清晰；而在物理网卡上添加额外IP地址的方法则将所有地址都绑定在同一个网络接口上。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbryanadamss%2Fnginx-conf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbryanadamss%2Fnginx-conf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbryanadamss%2Fnginx-conf/lists"}