Nginx应用配置实战

Nginx通用部署

Nginx常见参数介绍

Nginx 配置文件中的指令和参数决定了它的行为。下面详细介绍一些常见的 Nginx 参数,以帮助你更好地理解和配置 Nginx。

1. worker_processes

worker_processes auto;
  • 作用:设置 Nginx 处理请求的工作进程数量。auto 会根据 CPU 的核心数自动调整,或者你可以手动设置为特定的值。
  • 建议:通常将其设置为服务器 CPU 核心数,以最大化性能。如果服务器是多核的,使用 auto 是推荐做法。

2. worker_connections

worker_connections 1024;
  • 作用:每个 Nginx 工作进程能够处理的最大连接数。Nginx 的最大并发连接数是 worker_processes * worker_connections
  • 建议:如果你有大量的并发请求,适当增加该值。根据硬件和流量需求进行调整。

3. events

events {
    worker_connections 1024;
}
  • 作用:设置与网络事件处理相关的配置,比如连接的并发数和选择的事件模型。
  • 参数
    • use: 指定 Nginx 使用的事件处理模型,常见的是 epoll(Linux)或 kqueue(FreeBSD、MacOS)。
    • worker_connections: 如上所述,定义每个工作进程的最大连接数。

4. http

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    ...
}
  • 作用:HTTP 块是 Nginx 配置文件中最重要的块,包含了所有与 HTTP 相关的配置。
  • 常见配置
    • include /etc/nginx/mime.types: 引入 MIME 类型配置文件,帮助 Nginx 正确地返回文件的 MIME 类型。
    • default_type: 设置默认的 MIME 类型,如果无法自动识别某种文件的 MIME 类型,默认会用该类型,通常为 application/octet-stream
    • sendfile on: 启用 sendfile 选项,加速文件传输,建议保持开启。
    • keepalive_timeout 65: 设置保持连接超时时间,单位为秒,表示客户端和服务器之间空闲连接的最大持续时间。

5. server

server {
    listen 80;
    server_name example.com;
    ...
}
  • 作用server 块用于定义一个虚拟主机,配置不同域名或 IP 地址对应的服务器行为。
  • 常见配置
    • listen 80: 监听指定的端口,80 为 HTTP 的默认端口,443 为 HTTPS 默认端口。
    • server_name: 定义该服务器块的域名(如 example.com),可以使用通配符,如 *.example.com,也可以使用 IP 地址。

6. location

location / {
    proxy_pass http://localhost:8080;
    ...
}
  • 作用location 指令用于匹配 URL 路径,并为该路径定义不同的处理方式。它通常用于反向代理、静态文件服务等。
  • 常见配置
    • proxy_pass: 将请求代理到后端服务器。可以是本地应用或远程服务器。
    • root: 定义处理该路径时所使用的根目录。比如用于静态资源的存放路径。
    • index: 指定默认的主页文件,当访问某目录时,会默认查找的文件(如 index.html)。

7. proxy_pass

location / {
    proxy_pass http://localhost:8080;
}
  • 作用proxy_pass 是 Nginx 中用于反向代理的核心指令,它将匹配到的请求转发给指定的后端服务器。
  • 说明proxy_pass 可以代理 HTTP、HTTPS 甚至 FastCGI、uwsgi 等多种协议。

8. upstream

upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com;
    server 127.0.0.1:8080;
}
  • 作用upstream 定义后端服务器集群,用于负载均衡。在 proxy_pass 中可以将请求转发到 upstream 定义的服务器组。
  • 常见配置
    • server: 定义一个后端服务器,可以使用 IP 地址或域名。
    • weight: 为某个后端服务器分配更大的权重,默认值是 1。
    • max_failsfail_timeout: 控制某台后端服务器在多少次失败后被认为不可用,以及多久后再重新尝试。

9. gzip

gzip on;
gzip_types text/plain application/json;
  • 作用:启用或关闭响应的压缩功能,以减少传输的数据大小,提升性能。
  • 常见配置
    • gzip: 启用或禁用压缩功能,设置为 onoff
    • gzip_types: 定义哪些 MIME 类型的文件会被压缩,常见的有 text/htmlapplication/json 等。

10. log_formataccess_log

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
  • 作用log_format 用于定义访问日志的记录格式,而 access_log 用于指定日志的存储位置和使用的日志格式。
  • 常见配置
    • $remote_addr: 记录客户端 IP 地址。
    • $status: 记录请求的 HTTP 状态码。
    • $body_bytes_sent: 记录响应内容的大小(字节数)。

11. error_log

error_log /var/log/nginx/error.log warn;
  • 作用:配置错误日志文件的位置和记录级别。
  • 日志级别
    • debug: 记录所有级别的日志,包括调试信息。
    • info: 记录一般的运行信息。
    • notice: 记录需要注意的事件。
    • warn: 记录警告信息。
    • error: 记录错误信息。
    • crit: 记录严重错误。

12. client_max_body_size

client_max_body_size 50m;
  • 作用:限制客户端请求主体的最大大小。如果请求体超过这个限制,Nginx 会返回 413(Request Entity Too Large)错误。
  • 建议:在上传大文件时,可以适当增加这个值。

13. keepalive_timeout

keepalive_timeout 65;
  • 作用:设置客户端和服务器之间保持活动的连接的超时时间。超时后连接会被关闭。
  • 建议:根据需求调整,默认 65 秒适合大多数场景。

14. listen

listen 80;
listen [::]:80;
  • 作用:配置服务器监听的端口,通常是 HTTP 的 80 端口或 HTTPS 的 443 端口。
  • 参数
    • [::]:80: 表示监听所有 IPv6 地址。
    • ssl: 用于启用 SSL/TLS 加密。

15. ssl_certificatessl_certificate_key

ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
  • 作用:在配置 HTTPS 时,ssl_certificate 指定 SSL 证书的位置,ssl_certificate_key 指定私钥的位置。

16. return

return 301 https://$server_name$request_uri;
  • 作用:用于执行重定向或返回特定的 HTTP 状态码。
  • 参数
    • 301: 返回 301 永久重定向。
    • 302: 返回 302 临时重定向。

以上是 Nginx 配置文件中一些重要参数的详细介绍。根据你的应用场景,这些参数可以灵活组合使用,帮助你优化 Nginx 的性能和功能。

Nginx部署Java服务

Nginx 是一个轻量级、高性能的 Web 服务器,常用于反向代理、负载均衡和静态资源服务。下面详细讲解如何配置 Nginx 以部署 Java 服务。

1. 安装 Nginx

在大多数 Linux 发行版上,使用包管理器安装 Nginx:

# Ubuntu/Debian
sudo apt update
sudo apt install nginx

# CentOS/RHEL
sudo yum install nginx

启动和检查 Nginx 是否正常运行:

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

2. Nginx 基础配置文件

Nginx 的主配置文件通常位于 /etc/nginx/nginx.conf。典型的目录结构如下:

  • /etc/nginx/nginx.conf: 主配置文件
  • /etc/nginx/conf.d/: 存放其他虚拟主机配置
  • /var/www/: 默认的网站根目录

Nginx 的基本配置结构如下:

worker_processes auto;
events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    sendfile on;
    keepalive_timeout 65;

    include /etc/nginx/conf.d/*.conf;
}

3. 配置反向代理(用于 Java 服务)

假设你有一个基于 Spring Boot 的 Java 应用程序运行在 http://localhost:8080。你可以通过 Nginx 将外部请求转发给该 Java 服务。

/etc/nginx/conf.d/ 下创建一个配置文件,如 java_app.conf

server {
    listen 80;
    server_name example.com; # 将其替换为你的域名或服务器IP

    location / {
        proxy_pass http://localhost:8080; # 代理到 Java 服务的地址
        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;
    }
}

说明

  • listen 80: 监听 HTTP 80 端口。
  • server_name: 配置你的域名或 IP 地址。
  • proxy_pass: 将请求代理到运行 Java 应用程序的本地地址(例如,localhost:8080)。
  • proxy_set_header: 传递客户端请求的一些信息到后端 Java 应用,比如 IP 地址和协议。

4. 配置 SSL(HTTPS)

为了保证安全,建议使用 HTTPS。可以通过 Let’s Encrypt 获取免费 SSL 证书。

安装 certbot 工具:

# Ubuntu
sudo apt install certbot python3-certbot-nginx

然后运行以下命令为你的域名获取证书:

sudo certbot --nginx -d example.com

Nginx 会自动配置 HTTPS。生成的配置大致如下:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

说明

  • 443 端口用于 SSL。
  • 配置 SSL 证书路径,/etc/letsencrypt/live/ 存放的是通过 Let’s Encrypt 获取的证书。
  • 第二个 server 块会将所有 HTTP 请求重定向到 HTTPS。

5. Nginx 配置负载均衡

如果你的 Java 服务部署在多台服务器上,可以使用 Nginx 做负载均衡。配置示例:

upstream java_backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://java_backend;
        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;
    }
}

说明

  • upstream 块定义了一个名为 java_backend 的后端服务器组,可以配置多个 IP 地址进行负载均衡。
  • proxy_pass 将请求转发给该服务器组。

6. 常见 Nginx 命令

# 检查配置是否正确
sudo nginx -t

# 重新加载 Nginx 配置
sudo systemctl reload nginx

# 查看 Nginx 状态
sudo systemctl status nginx

7. 日志管理

Nginx 的访问日志和错误日志通常位于 /var/log/nginx/access.log/var/log/nginx/error.log

可以在 server 块中自定义日志路径:

server {
    listen 80;
    server_name example.com;

    access_log /var/log/nginx/java_app_access.log;
    error_log /var/log/nginx/java_app_error.log;

    location / {
        proxy_pass http://localhost:8080;
    }
}

Nginx配置举例

Nginx配置websocket

在基于 STOMP 协议的 WebSocket 应用中,如果你通过 Nginx 作为反向代理来处理 HTTPS(SSL/TLS)连接,并且需要支持 WebSocket,则需要确保 Nginx 正确处理 WebSocket 升级请求,同时配置 SSL 证书来启用 HTTPS

以下是如何在 Nginx 中配置 HTTPS,并支持基于 STOMP 协议的 WebSocket。

步骤一:准备 SSL 证书

要启用 HTTPS,首先你需要 SSL 证书。如果你没有 SSL 证书,可以使用以下方式获取:

  1. 自签名证书(测试使用):可以使用 openssl 工具生成自签名证书。
  2. Let’s Encrypt:可以通过 Let’s Encrypt 免费获取 SSL 证书(适合生产环境)。
生成自签名证书(测试使用):
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/server.key -out /etc/nginx/ssl/server.crt
  • 生成一个有效期为 365 天的自签名 SSL 证书和密钥文件,并将其存储在 /etc/nginx/ssl/ 路径下。

步骤二:配置 Nginx 支持 HTTPS 和 WebSocket

配置 Nginx 来支持 HTTPS 和 WebSocket 升级请求。在 Nginx 的 server 配置块中,需要同时启用 SSL 并配置 WebSocket 的 UpgradeConnection 头部。

完整的 Nginx 配置示例:
server {
    listen 443 ssl;
    server_name your-domain.com;  # 替换为你的域名或服务器 IP 地址

    # 配置 SSL 证书
    ssl_certificate /etc/nginx/ssl/server.crt;  # 替换为你的 SSL 证书路径
    ssl_certificate_key /etc/nginx/ssl/server.key;  # 替换为你的 SSL 私钥路径

    # SSL 配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # WebSocket 相关配置
    location /ws {
        proxy_pass http://localhost:31004;  # 代理到后端 WebSocket 服务
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        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_read_timeout 3600;
        proxy_send_timeout 3600;
        proxy_set_header X-NginX-Proxy true;
    }

    # 通常的 HTTP/HTTPS 请求
    location / {
        proxy_pass http://localhost:8080;  # 代理到你的应用服务,例如Spring Boot应用
        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 到 HTTPS
server {
    listen 80;
    server_name your-domain.com;

    location / {
        return 301 https://$host$request_uri;  # 强制将 HTTP 重定向到 HTTPS
    }
}

关键配置解释:

  1. SSL 证书配置

    • ssl_certificatessl_certificate_key:指定 SSL 证书和私钥的路径,用于 HTTPS 加密。
    • ssl_protocolsssl_ciphers:定义支持的 SSL/TLS 协议和加密套件。
  2. WebSocket 升级

    • proxy_set_header Upgrade $http_upgrade;:告诉 Nginx 将普通的 HTTP 请求升级为 WebSocket 连接。
    • proxy_set_header Connection "Upgrade";:确保 Connection 头部被正确设置为 Upgrade
    • proxy_read_timeoutproxy_send_timeout:配置 WebSocket 连接的超时,防止连接因空闲时间过长而被关闭。
  3. 代理到 WebSocket 服务

    • proxy_pass http://localhost:31004;:将 WebSocket 请求代理到后端实际运行的 WebSocket 服务器(例如运行 STOMP WebSocket 的 Spring Boot 服务)。
  4. HTTP 重定向到 HTTPS

    • 配置第二个 server 块,监听端口 80,将所有 HTTP 请求重定向到 HTTPS。

步骤三:配置 Spring Boot WebSocket 支持

后端 Spring Boot 项目需要正确配置 WebSocket 支持,确保 WebSocket 端点和 STOMP 协议配置一致。

Spring Boot WebSocket 配置示例:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        // 这里的 /ws 是 WebSocket 连接端点,前端需要通过这个路径连接
        registry.addEndpoint("/ws")
                .setAllowedOrigins("*")  // 允许跨域,或者指定域名
                .withSockJS();  // 如果需要兼容旧版浏览器,可以启用 SockJS
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        // 配置消息代理
        config.enableSimpleBroker("/topic", "/queue");
        config.setApplicationDestinationPrefixes("/app");
    }
}

步骤四:前端 WebSocket 连接

在前端代码中,确保 WebSocket 连接使用 wss:// 协议,因为你正在通过 HTTPS 加密连接。

前端示例代码:
// 使用 wss:// 进行 WebSocket 连接
const wsUrl = 'wss://your-domain.com/ws';
const socket = new WebSocket(wsUrl);

// 使用 STOMP 协议
const stompClient = Stomp.over(socket);

stompClient.connect({}, function (frame) {
    console.log('Connected: ' + frame);

    // 订阅消息
    stompClient.subscribe('/topic/messages', function (message) {
        console.log('Received: ' + message.body);
    });

    // 发送消息
    stompClient.send('/app/hello', {}, JSON.stringify({ name: 'Hello World' }));
}, function (error) {
    console.error('Connection error: ', error);
});

常见问题及排查:

  1. SSL 证书问题

    • 如果浏览器提示 SSL 证书无效,可能是因为使用了自签名证书。为了在生产环境中避免这种情况,建议使用 Let’s Encrypt 或其他可信的 CA 机构签发的证书。
  2. WebSocket 升级失败

    • 如果 Nginx 没有正确处理 WebSocket 升级,可能会导致连接失败。检查 Nginx 日志以及浏览器开发者工具中的网络请求,确保请求的 UpgradeConnection 头部被正确处理。
  3. 跨域问题

    • 如果前端和后端的域名或端口不一致,可能会导致跨域问题。确保 Nginx 和后端应用正确配置了 CORS
  4. 客户端使用 HTTPS

    • 如果前端页面是通过 HTTPS 访问的,WebSocket 连接必须使用 wss:// 协议,否则浏览器会阻止不安全的连接。

总结

通过上述步骤,你可以在 Nginx 中配置 HTTPS,并支持基于 STOMP 协议的 WebSocket。关键在于:

  • 正确处理 WebSocket 的升级请求,确保 Nginx 代理能够支持 WebSocket 连接。
  • 配置 SSL 证书,以启用 HTTPS 和 WSS 加密连接。
  • Spring Boot 的 WebSocket 端点配置,确保前端能够连接到正确的 WebSocket 服务。

后续配置举例持续更新中~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愤怒的代码

如果您有受益,欢迎打赏博主😊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值