一.安装部署nginx
nginx官网
https://nginx.org/en/download.html1.安装编译依赖
# centos yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel openssl openssl-devel2.下载并解压压缩包
wget http://nginx.org/download/nginx-1.30.5.tar.gz tar -zxvf nginx-1.30.5.tar.gz cd nginx-1.30.53.configure配置
./configure \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-pcre- --prefix=/usr/1ocal/nginx:安装根目录(重点,后续所有文件都在这里)
- --with-http_ssl_module:支持HTTPS,必须加
- --with-http_stub_status_module:状态监控模块
执行完看输出,末尾显示Configuration summary无报错再往下走
4.编译安装
make #编译 make install #复制文件到/usr/local/nginx5.目录说明
/usr/local/nginx ├── conf # nginx.conf配置文件 ├── sbin # nginx二进制程序 ├── logs # 日志 ├── html # 默认网页根目录6.加入systemd管理
创建文件/usr/lib/systemd/system/nginx.service
[Unit] Description=Nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target生效并开机自启
systemctl daemon-reload systemctl start nginx systemctl enable nginx systemctl status nginx7.防火墙放行端口
firewall-cmd --add-service=http --permanent firewall-cmd --reload8.创建环境变量(软链接)
# 创建软链接 ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx [root@iZf8zcpoklqs4r29j973pwZ conf]# nginx -v nginx version: nginx/1.30.59.验证
访问云服务器公网ip或虚拟机 ip:port
二.常见功能部署
主配置文件 /usr/local/nginx/conf/nginx.conf 只保留全局配置不写server块,给服务创建单独的配置文件,而不直接修改主配置文件
手动创建conf.d目录
mkdir -p /usr/local/nginx/conf/conf.d修改主配置文件
worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server_tokens off; # 加载conf.d下的所有配置 include /usr/local/nginx/conf/conf.d/*.conf; }1.静态资源服务
用于部署前端静态页面(HTML/CSS/JS/ 图片等),是 Nginx 最常用的场景之一
新建配置文件: /usr/local/nginx/conf/conf.d/static.conf
配置如下:
server { # 监听80端口 listen 83; # 访问域名 server_name 47.120.58.165; add_header Content-Type "text/html;charset=utf-8"; # 静态资源根目录 root /data/static; # 默认首页 index index.html index.htm; # 静态资源缓存优化(可选) location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { # 缓存有效期7天 expires 7d; # 关闭日志(减少IO) access_log off; } # 防止访问隐藏文件(如.git/.env) location ~ /\. { deny all; } }创建静态页面目录
mkdir -p /data/static # 写一个测试页面 echo "<h1>静态页面测试</h1>" > /data/static/index.html语法检查并重载
#语法校验 nginx -t #平滑重载 nginx -s reload端口放行:
firewall-cmd --add-port=83/tcp --permanent firewall-cmd --reload2.反向代理服务
将客户端请求转发到后端应用服务器(如 Java/Node.js/Python 服务),隐藏后端服务地址,统一入口。
新建配置文件:/usr/local/nginx/conf/conf.d/proxy.conf
配置如下:
[root@iZf8zcpoklqs4r29j973pwZ conf.d]# cat proxy.conf server { listen 81; server_name 47.120.58.165; # 拦截非法主机头请求,生产环境必配 if ($host != $server_name) { return 403; } location / { # 后端服务器地址 proxy_pass http://47.120.58.165:8080; # 核心请求头:保留客户端真实信息,后端能正确获取ip/协议 proxy_set_header Host $host:$server_port; 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-Port $server_port; #传递转发端口(81) # 超时配置 proxy_connect_timeout 30s; #与后端建立连接的超时 proxy_send_timeout 30s; #向后端发送请求的超时 proxy_read_timeout 30s; #从后端读取响应的超时 proxy_buffer_size 4k; #代理响应头缓冲,提升转发效率 proxy_buffers 8 4k; #代理响应体缓冲池 } }语法检验并重载:
nginx -t nginx -s reload端口放行:
firewall-cmd --add-port=81/tcp --permanent firewall-cmd --reload3.负载均衡服务
后端有多个服务实例时,通过Nginx实现请求分发,提高系统可用性和性能。
新建配置文件:/usr/local/nginx/conf/conf.d/lb.conf
配置如下:
# 负载均衡后端池,本机两个端口模拟两台后端 upstream my_backend { server 127.0.0.1:8080 weight=5 max_fails=3 fail_timeout=30s; server 127.0.0.1:8081 weight=5 max_fails=3 fail_timeout=30s; # Nginx与后端的长连接池配置,20-50,减少TCP握手开销 keepalive 30; #ip_hash; #least_conn; } 虚拟主机:监听82端口,公网IP server { listen 82; server_name 47.120.58.165; #可追加域名 # nginx基础优化:安全+请求缓冲区,生产必加 server_tokens off; #关闭nginx版本号泄露 client_body_buffer_size 128k; #客户端请求体缓冲区,避免打请求报错 client_header_buffer_size 64k; #客户端请求头缓冲区 large_client_header_buffers 4 64k; #大请求头缓冲区,适配特殊请求 # 增加主机头拦截,和你前面proxy.conf保持一致 if ($host != $server_name) { return 403; } # 所有前端请求核心转发逻辑:反向代理到后端服务器池 location / { proxy_pass http://my_backend; # 名称必须与upstream完全一致 proxy_redirect off; # 关闭默认重定向,避免后端返回地址异常 # 透传客户端真实信息:生产必配,让后端能获取真实IP/协议/端口 proxy_set_header Host $host:$server_port; # 补充端口,适配非80/443端口访问 proxy_set_header X-Real-IP $remote_addr; # 单级代理的客户端真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 多级代理的IP链 proxy_set_header X-Forwarded-Proto $scheme; # 请求协议(http/https) proxy_set_header X-Forwarded-Port $server_port; # 客户端访问的端口 # 代理超时配置:避免后端无响应导致Nginx连接泄漏,生产必配 proxy_connect_timeout 30s; # Nginx与后端建立TCP连接的超时时间 proxy_send_timeout 30s; # Nginx向后端发送请求数据的超时时间 proxy_read_timeout 30s; # Nginx从后端读取响应数据的超时时间 # 代理缓冲区:提升转发性能,避免小响应频繁刷盘,减少I/O开销 proxy_buffer_size 64k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; # 核心:实现Nginx与后端的长连接复用(原Tengine缺失的关键步骤,原生Nginx需配置) proxy_http_version 1.1; # 启用HTTP/1.1(HTTP/1.0不支持长连接) proxy_set_header Connection ""; # 清空Connection请求头,避免后端主动关闭长连接 } # 可选:配置Nginx状态页面(需提前开启stub_status模块),查看负载均衡连接状态 location /nginx_status { stub_status on; access_log off; # 关闭该页面访问日志,减少日志量 allow 47.120.58.165; allow 127.0.0.1; deny all; } }语法检验并重载:
nginx -t nginx -s reload端口放行:
firewall-cmd --add-port=82/tcp --permanent firewall-cmd --reload测试思路:
- 多次刷新页面,交替出现 tomcat-8080 /tomcat-8081 → 轮询负载均衡生效
- 关闭其中一个 tomcat(比如 8080),连续刷新 3 次后,Nginx 自动剔除故障节点,全部转发到 8081(max_fails=3 fail_timeout=30s)
- 30 秒后 Nginx 自动重试 8080,如果重新启动 tomcat,会重新加入集群。
4.HTTPS服务
创建证书目录并生成自签名证书(测试用),正式上线要域名 + CA 颁发证书。
# 创建ssl存放目录 mkdir -p /usr/local/nginx/ssl cd /usr/local/nginx/ssl openssl一键生成自签名crt+key openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt -subj "/CN=47.120.58.165"新建配置文件:/usr/local/nginx/conf/conf.d/https.conf
配置如下:
# 第一个server块:80端口纯跳转,所有HTTP请求301永久重定向到HTTPS的443端口 server { listen 80; server_name 47.120.58.165; # 核心跳转指令:保留原请求路径和参数,跳转到自身443端口 return 301 https://$host$request_uri; } 第二个server块:443端口处理HTTPS请求+反向代理后端,所有SSL配置写在这里 server { listen 443 ssl http2; # 监听443端口,开启SSL+可选http2 server_name 47.120.58.165; # 1. SSL证书核心配置(替换为你的实际路径,确保文件存在) ssl_certificate /usr/local/nginx/ssl/server.crt; # 公钥crt/pem都可 ssl_certificate_key /usr/local/nginx/ssl/server.key; # 私钥key # 2. SSL协议+密码套件(替换为兼容版,解决no cipher match报错,OpenSSL1.0.2+都支持) ssl_protocols TLSv1.2 TLSv1.3; # 禁用低版本TLS1.0/1.1,仅保留安全协议 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128- GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; # 优先使用服务器端的套件顺序 # 3. SSL会话优化(提升重复连接性能,减少握手耗时) ssl_session_timeout 10m; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; # 关闭会话票证,提升安全性 # 4. 核心业务:反向代理到后端47.120.58.165:8080 location / { proxy_pass http://47.120.58.165:8080; # 保留客户端真实信息的请求头(后端能正确获取IP/协议/端口) proxy_set_header Host $host; # 443端口无需带:$server_port,简化 proxy_set_header X-Real-IP $remote_addr; # 客户端真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链IP proxy_set_header X-Forwarded-Proto $scheme; # 传递实际协议(HTTPS) proxy_set_header X-Forwarded-Port $server_port; # 传递实际端口(443) # 代理超时+缓冲配置(避免连接泄漏,提升转发效率) proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s; proxy_buffer_size 4k; proxy_buffers 8 4k; proxy_busy_buffers_size 8k; } }语法检验并重载:
nginx -t nginx -s reload端口放行:
firewall-cmd --add-port=80/tcp --permanent firewall-cmd --add-port=443/tcp --permanent firewall-cmd --reload访问测试
- http://47.120.58.165一自动301 跳转到https://47.120.58.165
- https://47.120.58.165Nginx解密,转发请求到my_backend负载均衡池(8080/8081两个tomcat)
5.上传下载服务
配置一个支持文件上传和下载的服务器。
新建文件:/usr/local/nginx/conf/conf.d/file_server.conf
配置如下:
server { listen 84; # 替换为你的域名/服务器IP server_name 47.120.58.165; # 根目录指向文件存储路径 root /data/file_server; index index.html; if ($host != $server_name) { return 403; } # ========== 核心配置:文件下载 ========== location /download/ { # 开启文件下载功能 autoindex on; # 开启目录浏览 autoindex_exact_size on; # 显示人性化的文件大小(KB/MB) autoindex_localtime on; # 显示本地时间 # 下载限速(可选,防止带宽占满) limit_rate 1024k; # 单连接限速1MB/s # 允许跨域(如果前端需要) add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; # 日志记录 access_log /usr/local/nginx/logs/file_download.log; } # ========== 核心配置:文件上传(代理到简单后端) ========== # 说明:Nginx原生不支持直接处理上传,需配合简单后端(如Python/Node.js) location /upload/ { # 代理到本地上传服务(示例:Python Flask服务,运行在5000端口) proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 上传大小限制(关键) client_max_body_size 100M; # 允许最大100MB的文件 client_body_buffer_size 10M; # 缓冲区大小 client_body_temp_path /data/file_server/temp; # 临时文件路径 # 超时配置 proxy_connect_timeout 60s; proxy_read_timeout 300s; # 上传超时设为5分钟 } # ========== 安全配置 ========== # 禁止访问敏感文件 location ~* \.(php|jsp|sh|py|conf|bak)$ { deny all; } # 禁止访问隐藏文件 location ~ /\. { deny all; }; # 限制上传文件类型(可选) location ~* \.(exe|sh|bat|php)$ { deny all; } }创建文件
mkdir -p /data/file_server mkdir -p /data/file_server/temp chmod 755 /data/file_server chmod 700 /data/file_server/temp语法检验并重载:
nginx -t nginx -s reload端口放行:
firewall-cmd --add-port=84/tcp --permanent firewall-cmd --reload访问地址:
- 文件下载目录浏览:http://47.120.58.165:84/download/
- 文件上传接口:http://47.120.58.165:84/upload/
注意:
autoindex on:仅测试使用,生产环境严禁开启目录浏览。
/upload/只是代理,没有启动5000后端服务时,访问/upload会报502/504,这是正常现象
client_max_body_size 100M 写在location /upload/里面,只对/upload 路由生效;
临时目录
client_body_temp_path目录权限不足会上传失败。
快速测试下载功能(无需后端):
# 在下载目录放一个测试文件 echo "test file" > /data/file_server/download/test.txt三.nginx.conf 配置详解
1.全局块
作用:配置影响 Nginx 全局的指令,通常位于文件顶部。
常见指令:
user nginx; # 运行 Nginx 的用户和组 worker_processes auto; # 工作进程数(通常设为 CPU 核心数) error_log /var/log/nginx/error.log warn; # 错误日志路径和级别 pid /run/nginx.pid; # 存储主进程 PID 的文件2.event 模块
作用:配置网络连接相关的参数。
常见指令:
events { worker_connections 1024; # 每个工作进程的最大连接数 use epoll; # 事件驱动模型(Linux 推荐 epoll) multi_accept on; # 允许同时接受多个连接 }3.http 块
作用:定义 HTTP 服务器相关配置,可嵌套多个 server 块。
核心模块:
http { include mime.types; # 引入 MIME 类型定义文件 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"'; access_log /var/log/nginx/access.log main; # 访问日志 sendfile on; # 启用高效文件传输模式 keepalive_timeout 65; # 长连接超时时间 # 启用 Gzip 压缩 gzip on; gzip_types text/css application/javascript; # 引入其他配置文件(如虚拟主机) include /etc/nginx/conf.d/*.conf; # 定义 upstream 负载均衡 upstream backend { server 192.168.1.100:8080; server 192.168.1.101:8080; } # 定义 server 块(虚拟主机) server { listen 80; server_name example.com; location / { proxy_pass http://backend; } } }4.server 块(虚拟主机配置)
作用:定义单个网站的监听和路由规则,可嵌套多个 location 块。
关键指令:
server { listen 80; # 监听端口 server_name example.com; # 域名或 IP root /var/www/html; # 网站根目录 # 错误页面 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # 定义路由规则 location / { index index.html; } location /api { proxy_pass http://backend; } }5.location 块
作用:匹配特定请求路径并定义处理逻辑。
匹配规则:
location /:匹配所有请求。location = /exact:精确匹配/exact。location ~ \.php$:正则匹配.php结尾的请求
常见用法:
location /static { alias /data/static; # 静态文件路径(注意与 root 的区别) expires 30d; # 缓存过期时间 } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; }6.upstream 块
作用:定义负载均衡的后端服务器组。
upstream backend { server 192.168.1.100:8080 weight=3; server 192.168.1.101:8080; least_conn; # 最少连接策略 }
7.mail 模块(邮件代理)
mail { server_name mail.example.com; auth_http localhost:9000/auth; imap_capabilities IMAP4rev1; }
参考链接:
nginx常见功能部署_nginx部署-CSDN博客
Nginx 的安装部署_nginx部署-CSDN博客