文章目录
- 安装
- 配置文件介绍
- 1. 先进入安装目录,找到默认配置文件
- 2. 打开默认配置
- 3. 调整一下,改成如下配置,这里需要注意一下http的日志路径,和全局的异常日志路径
- 4. 每次修改配置文件之后,需要刷新一下配置
- 5. 有时候会遇到一些代理问题,尤其是自己建立的虚拟机
安装
直接上sh脚本。包源:
- rpm包地址:
http://nginx.org/packages/ - win和二进制包地址:
https://nginx.org/en/download.html
viinstall_nginx.sh#!/bin/bash# 安装和更新基本库sudoyum updatesudoyuminstallpcre2# 检查是否以root用户运行脚本if["$(id-u)"!="0"];thenecho"错误:请使用root用户运行此脚本"exit1firpm-ivhhttp://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.24.0-1.el7.ngx.x86_64.rpm--force--nodeps# 更新软件包缓存# yum update -y# 安装Nginx包# yum install nginx# 启动Nginx服务systemctl start nginx systemctlenablenginx- 复制脚本,并起名
install_nginx.sh。直接怼进去 - 赋予权限:
chmod+x install_nginx.sh- 执行脚本:
./install_nginx.sh- 查看版本
nginx-v配置文件介绍
1. 先进入安装目录,找到默认配置文件
cd/etc/nginx2. 打开默认配置
vinginx.conf3. 调整一下,改成如下配置,这里需要注意一下http的日志路径,和全局的异常日志路径
user nginx;worker_processes auto;# 工作进程数 = CPU 核心数worker_rlimit_nofile100000;# worker 最大文件描述符(需 ≤ systemd LimitNOFILE,本机 unit drop-in 已设 1048576)error_log /var/log/nginx/error.log warn;pid /run/nginx.pid;events{use epoll;# Linux 高效 I/O 事件模型multi_accept on;# 单 worker 一次接受多个新连接worker_connections50000;# 单 worker 最大并发(总并发 ≈ worker_processes × worker_connections)accept_mutex off;# 内核 ≥3.9 + nginx ≥1.9.1 可安全关闭,连接分发交给内核accept_mutex_delay 100ms;# 仅 accept_mutex on 时有意义,保留缺省习惯}http{# ── 日志 ──────────────────────────────────────────────────────────# 纪律:同级只保留一条 access_log。此前 "access_log off" 与路径行并存,# off 并不能抵消后面的路径行(同级多条 access_log 是并存各写),注释与实际行为相反。# buffer 后日志最长 flush 周期才落盘,排障时注意别拿"没日志"当"没请求"。log_format main'[$time_local] - [$ssl_protocol/$ssl_cipher] - [$scheme://$host$request_uri $status $request_method] - [$remote_addr] - [$http_user_agent] - [$http_host] - [$upstream_addr - $upstream_status]';access_log /var/log/nginx/access.log mainbuffer=64kflush=1m;error_log /var/log/nginx/error.log warn;include /etc/nginx/mime.types;default_type application/octet-stream;# ── 网络传输 ──────────────────────────────────────────────────────sendfile on;# 内核零拷贝tcp_nopush on;# 数据包满再发(配合 sendfile)tcp_nodelay on;# 禁用 Nagle,小包立即发# ── 连接保持 ──────────────────────────────────────────────────────keepalive_timeout30;keepalive_requests100000;# ── 代理默认值(全局缺省,server/location 可覆盖)────────────────proxy_connect_timeout 5s;proxy_send_timeout 30s;proxy_read_timeout 60s;# ── 上传限制(大文件在具体 location 单独放宽,见站点模板 /upload)──client_max_body_size 10M;# ── 响应缓冲 ──────────────────────────────────────────────────────proxy_buffer_size 16k;proxy_buffers416k;proxy_busy_buffers_size 32k;proxy_buffering on;# ── 安全响应头(http 层默认下发)────────────────────────────────# add_header 继承规则:location 内出现任意一条 add_header,本组全局头在该# location 全部失效——需要额外头的 location 必须显式补齐所需头。server_tokens off;add_header X-Frame-Options"SAMEORIGIN"always;add_header X-Content-Type-Options"nosniff"always;add_header Referrer-Policy"strict-origin-when-cross-origin"always;# CSP 必须单行:换行会原样进入 header 值造成坏头。# 不使用固定 nonce 占位符('nonce-{xxx}' 没有 nonce 语义,浏览器会拒绝所有脚本);# 需要内联脚本时由应用层生成随机 nonce 并同步写入 HTML 后再收紧此处。add_header Content-Security-Policy"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; frame-src 'self' blob:; img-src 'self' data: blob:; object-src 'none'; base-uri 'self'"always;# HSTS 禁止在 http 层 / HTTP 站点下发:HTTP 域名收到后浏览器强制 HTTPS 两年,# 无证书域名会被浏览器锁死。仅由持有有效证书的 HTTPS server 块显式启用(见站点模板):# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;# ── 代理请求头(全局缺省)───────────────────────────────────────# 继承铁律:server/location 内出现任意一条 proxy_set_header,本组全部失效(含 Host)。# 因此站点模板里所有带自定义 proxy_set_header 的 location 都显式写全本组,不依赖继承。# Host 是按域名路由的后端(frp 网关等)的路由依据,丢失即 404 no route。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_set_header X-Forwarded-Proto$scheme;proxy_set_header X-Forwarded-Host$host;proxy_set_header X-Forwarded-Port$server_port;proxy_set_header Accept-Encoding"";# 清空防后端压缩与 nginx 二次压缩叠加# ── 压缩 ──────────────────────────────────────────────────────────gzipon;gzip_min_length 2k;gzip_comp_level6;# woff2/图片/视频等本身已压缩的格式不进 gzip_types(压了更大白耗 CPU)gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml image/svg+xml;gzip_vary on;gzip_proxied any;gzip_disable"msie6";include /etc/nginx/conf.d/*.conf;}stream{include /etc/nginx/tcp.conf.d/*.conf;}- 剩下的就简单了,只需要在conf.d文件夹下面创建自己想要的配置。例如我这里创建一个监听域名为
ceshi.csym.com的请求,来跟着走
cdconf.dviceshi.csym.com把下面的内容给我怼进去
server{server_name ceshi.csym.com;# 监听的目标域名listen80reuseport;listen443ssl http2 reuseport;# 启用 HTTP/2 协议(多路复用,头部压缩)# access_log /var/log/nginx/ceshi.csym.com.log main; # 这里可以单独指定日志# SSL/TLS 安全配置ssl_certificate conf.d/ssl/ceshi.csym.com.pem;ssl_certificate_key conf.d/ssl/ceshi.csym.com.key;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;# TLS 1.2 及以下使用的加密套件(传统 cipher list)ssl_protocols TLSv1.2 TLSv1.3;# 启用 TLS 1.3(OpenSSL 1.1.1+ 自动支持其默认 cipher suites)ssl_ecdh_curve X25519:prime256v1;# 优先现代曲线ssl_session_cache shared:SSL:50m;# 足够大的缓存ssl_session_timeout 1d;ssl_buffer_size 4k;# 优化内存使用,对于高延迟网络,可以适当增加(如16k)以提升性能ssl_session_tickets off;# 禁用 session tickets(存在安全风险)ssl_stapling on;# OCSP 装订,加速证书验证ssl_stapling_verify on;# 在 ssl_stapling on; 的基础上,强制 Nginx 验证它从 CA 获取到的 OCSP 响应的真实性(签名)和有效性(未过期)。这是确保装订机制安全可靠的关键步骤。# 静态资源缓存#location ~* \.(?:css|js|jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {# expires 1y; # 浏览器缓存 1 年#add_header Cache-Control "public, immutable"; # public:允许代理服务器缓存,immutable:内容永不变,跳过验证#}# 字体文件缓存,参数类似静态资源配置#location ~* \.(?:eot|ttf|otf|woff|woff2)$ {# expires 1y;# add_header Cache-Control "public";# add_header Access-Control-Allow-Origin "*"; # 额外添加跨域头,解决 CDN 字体加载问题。这里是允许任意域名加载。}# 默认请求地址,/ 也就是域名本身访问的时候,一般指向前端页面location /{root /usr/share/nginx/html/ceshi;# ceshi代表分包名index index.html;# 解决刷新404问题try_files$uri$uri/ /index.html;}# location / {# return 301 https://www.baidu.com$; # 永久重定向到百度# }# 请求地址是http://ceshi.csym.com/server/ 的时候执行的代码块,这里是代理到http://127.0.0.1:8444/。注意,如果Nginx做了ssl,这里可以是httplocation /server/{# 代理到后端proxy_pass http://127.0.0.1:8444/;# 2. 路径重写,rewrite 移除 /server 前缀,break 停止后续重写规则。# - 原始URL:`/server/abc/def`# - 重写后:`/abc/def`# rewrite ^/server/(.*)$ /$1 break;proxy_set_header X-Forwarded-Prefix /server/;# 记录原始请求在经过代理或负载均衡器后发生的变化的路径前缀,这里是/server/,例如使用knife4j代理后文档异常问题}# 特殊的功能location /upload{# 代理到后端proxy_pass http://127.0.0.1:8444/;client_max_body_size 2G;# 允许的最大文件大小proxy_read_timeout 1800s;# 读取响应超时client_body_temp_path /tmp/nginx_upload12;# 临时文件地址,二级子目录create_full_put_path on;# 自动创建目录# 大文件下载优化proxy_buffer_size 32k;proxy_buffers8256k;proxy_busy_buffers_size 1m;proxy_max_temp_file_size 2g;# 启用磁盘缓存proxy_request_buffering off;# 禁用缓冲提升大文件上传性能proxy_set_header X-Forwarded-Prefix /upload;# 记录原始请求在经过代理或负载均衡器后发生的变化的路径前缀,这里是/server/,例如使用knife4j代理后文档异常问题}# 高并发覆盖配置location /api/{# 代理到后端proxy_pass http://127.0.0.1:8444/;proxy_read_timeout 15s;# API接口缩短超时proxy_buffers416k;# 减少内存占用proxy_busy_buffers_size 32k;proxy_buffering on;# 保持小数据缓冲proxy_set_header X-Forwarded-Prefix /api/;# 记录原始请求在经过代理或负载均衡器后发生的变化的路径前缀,这里是/server/,例如使用knife4j代理后文档异常问题}# WebSocket覆盖配置location /ws{# 代理到后端proxy_pass http://127.0.0.1:8444/;proxy_read_timeout 3600s;# 读取响应超时时间proxy_send_timeout 3600s;# 发送超时时间# Websocket 支持,如果Nginx做了ssl,这里会自动升级为wss.如果是netty等框架单独写的websocket,可以单独开一个代码块,也能升级wssproxy_http_version1.1;proxy_set_header Upgrade$http_upgrade;proxy_set_header Connection"upgrade";}}先做默认跳转
vi00-default-server.conf# ============================================================# 兜底默认站点(文件名 00- 前缀保证 conf.d 按字母序最先加载)# 显式声明 default_server:未匹配任何 server_name 的请求一律断开,# 不再隐式落进 conf.d 字母序第一个业务站点(此前 qty.* 就是这样被# 丢进别的站点后端吃 404 的)。444 = 空响应直接断开,不泄露内容。# ============================================================server{listen80default_server;server_name _;return444;}# 443 兜底:未持有默认证书时直接拒绝 TLS 握手(nginx ≥1.19.4),# 避免默认站点引用不存在证书导致 nginx -t 失败server{listen443ssl default_server;ssl_reject_handshake on;}上业务
visite-template.conf# ============================================================# 本模板固化四条纪律(全部是踩过的雷):# 1. reuseport 对同一端口全配置只允许出现一次——模板一律不写,# 多站点都写必报 [emerg] duplicate listen options;# 2. location 内只要出现任意一条 proxy_set_header,http 层整组头失效(含 Host),# 因此所有代理 location 显式写全 Host 与转发头,不依赖继承;# 3. HSTS 只在持有有效证书的 HTTPS server 内启用,HTTP 站点严禁下发;# 4. 443 的默认拒绝由 00-default-server.conf 兜底,业务站点证书就绪后再开 443。# ============================================================server{listen80;# 证书就绪后再启用下一行 443 与 SSL 段;HTTP-only 站点整段删除即可# listen 443 ssl;http2 on;# nginx ≥1.25.1 独立指令,替代 listen 内的 http2 参数server_name ceshi.csym.com;# ── SSL/TLS(启用 443 时取消注释;证书路径按实际调整)──# ssl_certificate conf.d/ssl/ceshi.csym.com.pem; # 相对路径基于 nginx 前缀目录(/etc/nginx)# ssl_certificate_key conf.d/ssl/ceshi.csym.com.key;# ssl_protocols TLSv1.2 TLSv1.3;# ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;# ssl_ecdh_curve X25519:prime256v1;# ssl_session_cache shared:SSL:50m;# ssl_session_timeout 1d;# ssl_session_tickets off;# ssl_buffer_size 4k;# # OCSP 装订需要 resolver 解析 CA 响应器域名,缺失时 stapling 静默失效# resolver 223.5.5.5 119.29.29.29 valid=300s;# resolver_timeout 5s;# ssl_stapling on;# ssl_stapling_verify on;# # HSTS:证书有效且确认全站 HTTPS 后启用;includeSubDomains 需评估子域范围# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;# access_log /var/log/nginx/ceshi.csym.com.log main; # 需要站点级日志时取消注释# ── 静态资源缓存 ──# 注意:下面两个正则 location 里的 add_header 会使 http 层安全头(CSP/XFO 等)# 对这类静态文件不下发——属已知取舍;若要求静态文件也带安全头,在此显式补齐。location ~*\.(?:css|js|jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)${expires 1y;add_header Cache-Control"public, immutable";}location ~*\.(?:eot|ttf|otf|woff|woff2)${expires 1y;add_header Cache-Control"public";add_header Access-Control-Allow-Origin"*";# 解决 CDN/跨域字体加载}# ── 前端入口(history 路由刷新 404 兜底)──location /{root /usr/share/nginx/html/ceshi;# 目录名 = 分包名index index.html;try_files$uri$uri/ /index.html;}# ── 后端 API 代理 ──location /server/{proxy_pass http://127.0.0.1:8444/;proxy_set_header Host$host;# 显式写全,不依赖 http 层继承proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto$scheme;proxy_set_header X-Forwarded-Prefix /server/;}# ── 大文件上传 ──location /upload{proxy_pass http://127.0.0.1:8444/;client_max_body_size 2G;proxy_read_timeout 1800s;client_body_temp_path /tmp/nginx_upload12;create_full_put_path on;proxy_buffer_size 32k;proxy_buffers8256k;proxy_busy_buffers_size 1m;proxy_max_temp_file_size 2g;proxy_request_buffering off;# 禁用请求缓冲提升大文件上传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_set_header X-Forwarded-Proto$scheme;proxy_set_header X-Forwarded-Prefix /upload;}# ── 高并发 API(小缓冲短超时)──location /api/{proxy_pass http://127.0.0.1:8444/;proxy_read_timeout 15s;proxy_buffers416k;proxy_busy_buffers_size 32k;proxy_buffering on;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_set_header X-Forwarded-Proto$scheme;proxy_set_header X-Forwarded-Prefix /api/;}# ── WebSocket ──location /ws{proxy_pass http://127.0.0.1:8444/;proxy_http_version1.1;proxy_set_header Upgrade$http_upgrade;proxy_set_header Connection"upgrade";proxy_read_timeout 3600s;proxy_send_timeout 3600s;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_set_header X-Forwarded-Proto$scheme;}}这里的匹配规则需要注意一下。按照上面的配置,假如我们有这样一个场景:
- 地址:http://ceshi.csym.com/server/ceshi.html
- location :/server/
- proxy_pass:https://127.0.0.1:8444/aaa,它由A和B两部分组成:
- A:https://127.0.0.1:8444
- B:/aaa
- 如果proxy_pass由
uri+url组成,那么就应该是location去匹配地址信息,然后包含location在内的左边部分,全部替换proxy_pass的值。什么意思呢?举个例子
| 请求地址 | location | proxy_pass | 实际请求地址 | 说明 |
|---|---|---|---|---|
http://ceshi.csym.com/server/ceshi.html | /server/ | https://127.0.0.1:8444/aaa/ | https://127.0.0.1:8444/aaa/ceshi.html | proxy_pass红色标记部分替换了请求地址中的红色标记部分 |
http://ceshi.csym.com/server/ceshi.html | /server | https://127.0.0.1:8444/aaa/ | https://127.0.0.1:8444/aaa//ceshi.html | proxy_pass红色标记部分替换了请求地址中的红色标记部分,因为匹配过程中location 没有/,导致地址中余下一个/,然后proxy_pass中又带有一个"/",所以出现了双“/”。 |
http://ceshi.csym.com/server/ceshi.html | /server/ | https://127.0.0.1:8444/aaa | https://127.0.0.1:8444/aaaceshi.html | - |
http://ceshi.csym.com/server/ceshi.html | /server/ | https://127.0.0.1:8444 | https://127.0.0.1:8444/server/ceshi.html | 当且仅当proxy_pass只由A组成时,末尾没有“/”,那么就会成为全代理 |
4. 每次修改配置文件之后,需要刷新一下配置
nginx-sreload5. 有时候会遇到一些代理问题,尤其是自己建立的虚拟机
例如代理的时候请求不到上游服务器,出现以下日志
connect()to XXXX failed(13: Permission denied)whileconnecting to upstream,这个是由于谷歌的SeLinux框架导致的,执行以下命令
setsebool-Phttpd_can_network_connect1后续一大堆的域名文件,都可直接丢到这个文件夹下,Nginx会自动识别分别执行的,充分合理利用二级域名(千万不要直接拿www的主域名来做接口,不然你就是大冤种),每一个二级域名都是一个项目,一个或者多个后端地址。后端地址的代理通过可以监听不同的域名(域名可以指向同一个IP),或者同一个域名不同的url,还可以同一个域名监听不同端口来实现。而且这三种方式并非独立选择,而是相辅相成,多种混合使用的关系。