租房项目开发实战(五)

Nginx反向代理与项目部署实战

「鸿蒙心迹」“2025・领航者闯关记“主题征文活动 10w+人浏览 160人参与

部署准备

在方案设计中,server-01负责部署移动端和后台管理系统的后端服务。server-02则部署Nginx服务器,承担以下双重角色:

  1. 作为移动端和后台管理系统的前端项目Web服务器
  2. 作为后端服务的反向代理

Nginx作为统一的请求入口,其处理逻辑如下:

  • 静态资源请求:直接由Nginx响应
  • 动态接口请求:Nginx将请求代理至后端服务,并将响应结果返回客户端

知识点:

代理

代理(Proxy)是网络通信中的重要中间层服务,其核心功能是作为客户端与服务器之间的中介桥梁。具体工作流程如下:客户端将请求发送至代理服务,代理接收后转发至目标服务器,获取服务器响应后再将结果返回给客户端。这一过程可通过下图直观展示。

代理主要分为正向代理和反向代理两种类型。需要明确的是,两者的核心机制相同,都是作为客户端与服务端之间的中介存在。区别在于代理对象不同:正向代理代表客户端向服务端发起请求,而反向代理则代表服务端接收客户端请求。

以下是正向代理和反向代理的两个应用场景:

正向代理案例

某学校为限制学生沉迷网络游戏,设置了防火墙屏蔽所有游戏网站。机智的小明同学通过代理服务器成功绕过防火墙限制,这就是典型正向代理的应用。

反向代理

随着某电商平台访问量的持续攀升,单一后端服务器已无法应对高并发场景的需求。为此,需要通过部署多台后端服务器来分担系统压力。那么如何实现客户端请求在这些服务器间的均衡分发呢?最常见的解决方案是采用代理服务:即部署一个代理服务作为后端服务器的统一入口接收请求,再将这些请求智能地分配到各个后端服务器。这种架构中的代理服务就是典型的反向代理实现。

​Nginx

Nginx 是一款 高性能的 HTTP 服务器、反向代理服务器、负载均衡器和静态资源服务器,核心特点是「轻量、高并发、低内存占用」,被广泛用于生产环境的服务部署。

配置和启动

1.配置nginx存储库

配置的好处:通过 yum 一键安装 / 升级官方适配的 Nginx,自动解决依赖、保障安全,无需手动编译。

创建/etc/yum.repos.d/nginx.repo​文件

vim /etc/yum.repos.d/nginx.repo

增加如下内容

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
2.在线安装Nginx

执行以下命令,安装Nginx

yum -y install nginx
3.启动Nginx

执行以下命令启动Nginx

systemctl start nginx

执行以下命令查看Nginx运行状态

systemctl status nginx

执行以下命令设置开机自启

systemctl enable nginx
4.访问Nginx服务默认首页

访问http://192.168.200.128​,能访问到如下页面,则证明Nginx运行正常。

访问不了的开放80端口

firewall-cmd --permanent --add-port=80/tcp

firewall-cmd --reload

以下是Nginx核心目录与文件的说明:

配置文件相关

  • /etc/nginx/ - Nginx主配置文件目录
  • /etc/nginx/nginx.conf - 核心配置文件,包含全局配置项
  • /var/log/nginx/ - 日志存储目录
  • /var/log/nginx/access.log - 记录所有访问请求的日志
  • /var/log/nginx/error.log - 记录服务器错误信息的日志

配置文件概述

配置文件结构

nginx.conf文件采用层级化设计,整体由多个区块(block)组成。每个区块既可配置各类参数,也能嵌套子级区块,形成清晰的树状结构。具体配置架构如下图所示:

Nginx配置文件nginx.conf通过include指令加载了/etc/nginx/conf.d目录下的所有.conf文件,该目录的配置文件结构如下图所示。

重要配置说明

以下是对关键配置参数的详细介绍:

全局配置块(main block)

全局配置块位于配置文件的最顶层,包含控制Nginx服务器整体运行的核心参数,主要包括:

  • user:设置运行Nginx工作进程的用户及用户组
  • worker_processes:配置工作进程数量
  • error_log:定义全局错误日志的存储路径
events block

events 配置块位于 main 配置块内部,用于定义 Nginx 服务器的连接处理机制,主要控制客户端连接的处理方式。

http block

HTTP block 配置位于 main block 中,主要用于设置 HTTP 服务器相关功能。主要配置项包括:

  • access_log:设置访问日志的存储路径
  • log_format:定义访问日志的格式规范
server block

Nginx 的 server block 配置位于 http block 中,用于设置虚拟主机。单个 Nginx 服务可以承载多个虚拟主机,每个虚拟主机都能独立提供服务。通过这种机制,我们可以在同一台服务器上部署多个完全独立的网站,如下图所示。

每个虚拟主机通过独立的 server block 进行配置,主要包含以下参数:

  • listen:设置虚拟主机监听的端口号
  • server_name:指定虚拟主机的域名或 IP 地址
location block

location block 位于 server block 内部,主要用于配置请求处理逻辑。每个 server block 可以包含多个 location block 配置。例如:

server {
    listen 80;
    server_name www.baidu.com;
    location /index {
        root /var/www/html;
    }

    location /api {
        proxy_pass http://backend-api;
    }
}

项目打包

后端代码打包:

前端打包:

所以我们需要修改.env.production​文件中VITE_APP_BASE_URL​环境变量的值,修改结果如下

VITE_APP_BASE_URL='http://lease.atguigu.com'

安装JDK

  1. 获取JDK安装包

将资料中提前下载好的JDK上传到server01​,也在服务器执行以下命令可直接下载。

wget https://download.oracle.com/java/17/archive/jdk-17.0.8_linux-x64_bin.tar.gz
  1. 解压JDK安装包

执行以下命令将jdk解压到/opt​目录

tar -zxvf jdk-17.0.8_linux-x64_bin.tar.gz -C /opt
  1. 测试JDK安装效果

执行以下命令,观察输出是否正常

/opt/jdk-17.0.8/bin/java -version

部署

上传jar包

请将后端项目的两个jar包上传至server01服务器的/opt/lease目录。若该目录不存在,请先创建目录再上传文件。

  • 集成Systemd

为简化项目进程管理,我们采用Systemd来统一控制后端服务的启动、停止和重启操作。

  • 移动端集成Systemd

创建lease-app.service​文件

vim /etc/systemd/system/lease-app.service

内容如下

[Unit]
Description=lease-app
After=syslog.target

[Service]
User=root
ExecStart=/opt/jdk-17.0.8/bin/java -jar /opt/lease/web-app-1.0-SNAPSHOT.jar 1>/opt/lease/app.log 2>&1
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

后台管理系统集成Systemd

创建lease-admin.service​文件

vim /etc/systemd/system/lease-admin.service

内容如下

[Unit]
Description=lease-admin
After=syslog.target

[Service]
User=root
ExecStart=/opt/jdk-17.0.8/bin/java -jar /opt/lease/web-admin-1.0-SNAPSHOT.jar 1>/opt/lease/admin.log 2>&1
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

启动项目

执行以下命令启动两个后端项目。

systemctl start lease-app
systemctl start lease-admin

上传dist文件

将 rentHouseAdmin 项目编译生成的 dist 文件部署到 server02 服务器的 /usr/share/nginx/html/admin 目录下。

最终目录结构应为:

/usr
└── share
    └── nginx
        └── html
            └── admin
                ├── assets
                └── index.html
                └── ...

配置Nginx服务器

创建配置文件:/etc/nginx/conf.d/admin.conf

vim /etc/nginx/conf.d/admin.conf

内容如下

server {
    listen       80;
    server_name  www.test.com;

    location / {
        root   /usr/share/nginx/html/admin/dist;
        index  index.html;
    }
    location /admin {
        proxy_pass http://192.168.200.128:8080;
    }
}

重新加载Nginx配置文件

执行以下命令重新加载配置文件

systemctl reload nginx

访问项目

访问http://www.test.com

本地hosts文件新增域名映射(C:\Windows\System32\drivers\etc)

所有的接口都是502,查看nginx日志提示如下:

问题是 CentOS 7 的 SELinux 安全机制拦截了 Nginx 访问后端 8080 端口的权限(不是防火墙,也不是配置错误)

方案 1:允许 Nginx 发起网络连接(推荐,安全)

SELinux 默认禁止 Nginx 对外发起连接,执行以下命令授权:

bash

运行

# 允许 Nginx 网络连接(永久生效)
setsebool -P httpd_can_network_connect 1
  • 命令说明:
    • setsebool:修改 SELinux 布尔值配置;
    • -P:永久生效(重启服务器也不会失效);
    • httpd_can_network_connect 1:允许 Apache/Nginx 这类 Web 服务发起网络连接(1 = 开启,0 = 关闭)。

授权后 无需重启 Nginx,直接在浏览器访问 www.test.com/admin/login/captcha,502 错误会立即消失。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值