Nginx配置:如何在一个域名下运行两个网站

在现代的Web应用开发中,网站的数量和复杂性越来越高,多个网站使用同一个域名的情况也越来越常见。通过Nginx配置,我们可以轻松实现两个网站共用一个域名,并根据特定的路径、子域名或其他规则对流量进行分发。本文将详细介绍如何使用Nginx配置两个网站共用一个域名的方案。

场景描述

假设我们有一个域名为example.com,需要通过该域名运行两个网站:

  1. 一个位于路径/site1的Web应用(如一个博客)。
  2. 另一个位于路径/site2的Web应用(如一个电商平台)。

我们希望使用Nginx进行反向代理,将请求分发到不同的网站。

Nginx配置思路

Nginx作为一个高性能的反向代理服务器,具备极高的灵活性。我们可以通过它来实现:

  • 基于URI路径的流量分发(通过location指令)
  • 对不同的Web应用进行代理(使用proxy_pass

下面我们将介绍如何编写Nginx配置文件,并详细解析每一行的意义。

Nginx配置示例

server {listen 80;server_name example.com;location /site1/ {proxy_pass http://localhost:8081/;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;}location /site2/ {proxy_pass http://localhost:8082/;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;}
}

逐行解析配置

  1. server {
    这是定义一个Nginx服务器块的开始。在这个块内,我们将配置监听端口、域名及相关的处理规则。

  2. listen 80;
    这行指令告诉Nginx监听80端口,也就是HTTP默认的端口。当用户访问http://example.com时,Nginx会处理该请求。如果你希望配置HTTPS,则需要监听443端口,并添加SSL相关配置。

  3. server_name example.com;
    该指令用于指定虚拟主机的域名。在这个例子中,我们将域名设置为example.com,即所有访问example.com的请求都会进入这个服务器块。

  4. location /site1/ {
    location指令用于定义匹配规则。在这里,/site1/表示匹配URL路径为example.com/site1/的所有请求。location块内的配置将处理这些请求。

  5. proxy_pass http://localhost:8081/;
    这是关键的反向代理配置。proxy_pass指令告诉Nginx将匹配的请求转发到http://localhost:8081/,也就是将/site1/路径的请求代理给运行在本地8081端口的Web应用。

  6. proxy_set_header Host $host;
    该指令将客户端请求中的Host头转发给后端服务器,$host是Nginx的内置变量,表示客户端请求中的Host值,即example.com。这对于后端服务器正确处理请求是非常重要的,尤其在涉及到虚拟主机或跨域问题时。

  7. proxy_set_header X-Real-IP $remote_addr;
    Nginx在代理请求时,默认不会传递客户端的真实IP。这行指令告诉Nginx将客户端的真实IP(即$remote_addr变量)添加到X-Real-IP头中,以便后端服务器能够知道请求的来源IP。

  8. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    X-Forwarded-For是一个常用的HTTP头,通常用于记录原始客户端的IP地址。如果请求经过了多个代理,Nginx会将当前的客户端IP附加到已有的X-Forwarded-For头中,从而保留整个代理链。

  9. proxy_set_header X-Forwarded-Proto $scheme;
    该指令设置X-Forwarded-Proto头,用来告诉后端服务器客户端使用的协议是http还是https$scheme是Nginx的内置变量,它的值为当前请求的协议。

  10. location /site2/ {
    同样,location /site2/块用于匹配路径/site2/的请求。这些请求会被转发到另外一个Web应用(通过8082端口)。

  11. proxy_pass http://localhost:8082/;
    /site2/路径的请求代理给本地8082端口的Web应用。

解释两个Web应用的工作流程

假设两个Web应用分别是:

  • 一个博客应用,运行在8081端口。
  • 一个电商应用,运行在8082端口。

当用户访问http://example.com/site1/时,Nginx会将请求代理到8081端口,即博客应用。当访问http://example.com/site2/时,Nginx会将请求代理到8082端口,即电商应用。Nginx只负责代理请求,实际的页面渲染和业务逻辑由后端Web应用负责。

更多的Nginx配置技巧

去掉路径重写

在上面的配置中,注意proxy_pass后面的URL以斜杠/结尾。这意味着Nginx会保留请求的路径结构,即/site1/不会被自动移除。如果你希望在将请求代理给后端应用时移除/site1/,可以使用如下配置:

location /site1/ {rewrite ^/site1/(.*)$ /$1 break;proxy_pass http://localhost:8081/;
}

rewrite指令用于重写请求路径。这里的^/site1/(.*)$表示匹配/site1/后的所有路径,并通过/$1保留其后缀路径。

使用子域名代替路径

如果你不希望使用路径来区分两个网站,可以考虑使用子域名。例如,可以为博客应用配置blog.example.com,为电商应用配置shop.example.com

配置如下:

server {listen 80;server_name blog.example.com;location / {proxy_pass http://localhost:8081/;}
}server {listen 80;server_name shop.example.com;location / {proxy_pass http://localhost:8082/;}
}

通过server_name指令,我们可以为不同的子域名配置不同的服务器块,从而将流量分发到不同的后端应用。

总结

通过Nginx,我们可以非常轻松地将多个Web应用部署在同一个域名下,无论是通过不同的路径,还是通过子域名。本文的示例展示了如何配置两个网站共用一个域名,并详细解释了每个配置项的作用。

在实际的生产环境中,需要考虑更多的细节,比如SSL加密、缓存优化、负载均衡等,这些都是Nginx能够提供的强大功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端最新Vue2+Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!

Vue 快速上手 Vue概念 Vue 是一个用于构建用户界面的渐进式框架 构建用户界面:基于数据渲染出用户看到的页面 渐进式:循序渐进 框架:一套完整的项目解决方案 Vue 的两种使用方式: ① Vue 核心包开发 场景:局部 模块改造 ② Vue 核心包 &am…

基于Spring Boot的高校请假管理系统

一、系统背景与意义 随着高校规模的扩大和学生数量的增加,传统的请假管理方式已经难以满足高校管理的需求。人工请假流程繁琐、耗时长,且容易出现信息错误或遗漏。因此,开发一套基于Spring Boot的高校请假管理系统具有重要意义,它…

Gate.io 平台通证 GT:持续赋能与销毁、财富效应显著

在瞬息万变的加密市场中,每一轮牛熊转换都在加速 CEX 市场的一轮又一轮洗牌,这也使得该赛道的格局始终处于动态的变化。而在本轮牛市中,CEX 赛道也正在从最初的三大领衔变成了多强角逐,而 Gate.io 作为创立 11 余年的老牌交易平台…

mysql怎么返回一个字段逗号分隔后的所有数据的sql

mysql怎么返回一个字段逗号分隔后的所有数据的sql 场景描述5.7版本MySql : 完整sql如下sql解析8.0 版本MySql : 完整sql如下 场景描述 mysql有一张表比如result表,表中有个字段场景id:scene_id,这个id存储的值可以是单个的id也可以是多个id用逗号拼接起来的,现在需…

RK3576 Android14编译OTA包提示java.lang.UnsupportedClassVersionError问题

最近遇到RK3576 Android14编译OTA包时,出现如下报错log: Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/signapk/SignApk has been…

Spring Boot 中的 @Scheduled 定时任务以及开关控制

Scheduled注解是Spring框架(包括Spring Boot)中用于实现定时任务的一种方式。以下是对Scheduled注解的详细解析: 一、基本概念 Scheduled注解允许开发者在Spring容器中定义定时任务。通过简单地在一个方法上添加Scheduled注解,S…

WebRTC音视频同步原理与实现详解(下)

WebRTC音视频同步原理与实现详解(上) 第四章、音视频同步实现详解 4.1 音视频同步标准 音视频做到什么程度才算是同步呢? 关于音画同步, 业界有3个标准: 1)ITU-R BT.1359(1998)&#xff1a…

1.系统学习-线性回归

系统学习-线性回归 前言线性回归介绍误差函数梯度下降梯度下降示例 回归问题常见的评价函数1. MAE, mean absolutely error2. MSE, mean squared error3. R square (决定系数或R方) 机器学习建模流程模型正则化拓展阅读作业 链接: 2.系统学习-逻辑回归 …

Oracle 日常巡检

1. 检查服务器状态 1.1. CPU使用情况 1.1.1. top top 命令是 Linux 和 Unix 系统中用于显示实时系统状态的工具,特别是对于监控 CPU 和内存的使用非常有用。 在命令行中输入 top,top 会显示一个实时更新的界面,其中包含系统的关键指标&am…

熊军出席ACDU·中国行南京站,详解SQL管理之道

12月21日,2024 ACDU中国行在南京圆满收官,本次活动分为三个篇章——回顾历史、立足当下、展望未来,为线上线下与会观众呈现了一场跨越时空的技术盛宴,吸引了众多业内人士的关注。云和恩墨副总经理熊军出席此次活动并发表了主题演讲…

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码? 前言什么是 GitHub1s?使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

3D布展平台主要有哪些功能?有什么特点?

3D布展平台是一种利用3D技术和虚拟现实(VR)技术,为用户提供线上虚拟展览和展示服务的平台。这些平台通常允许用户创建、设计和发布3D虚拟展厅,从而提供沉浸式的展览体验。以下是对3D布展平台的详细介绍: 一、主要功能 …

TowardsDataScience 博客中文翻译 2018~2024(一百二十三)

TowardsDataScience 博客中文翻译 2018~2024(一百二十三) 引言 从 2018 年到 2024 年,数据科学的进展超越了许多技术领域的速度。Towards Data Science 博客依然是这个领域的关键平台,记录了从基础工具到前沿技术的多方面发展。…

Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程

简介 Docker 通过提供轻量级、可移植和高效的解决方案,彻底改变了软件开发和部署。docker build 命令是 Docker 镜像创建过程的核心。本文将探讨 docker build 命令、其语法、用法以及优化 Docker 构建的最佳实践。本教程的目标是手把手教你如何在 Linux 服务器上使…

【Linux编程】一个基于 C++ 的 TCP 客户端异步(epoll)框架(一))

TcpClient 类的设计与实现:一个基于 C 的 TCP 客户端框架 在现代网络编程中,TCP(传输控制协议)客户端是实现网络通信的基础组件之一。本文将详细介绍一个基于 C 的 TcpClient 类的设计与实现,该类提供了创建 TCP 连接…

【Python知识】Python进阶-什么是装饰器?

Python装饰器介绍 概述1. 基本装饰器2. 带参数的装饰器3. 带参数的函数装饰器(使用functools.wraps)4. 类装饰器5. 方法装饰器(在类中使用) 参考文献 概述 Python装饰器是一种高级功能,允许你在不修改函数或方法定义的…

Springboot应用开发:配置类整理

目录 编写目的 一、线程池 1.1 setCorePoolSize 1.2 setMaxPoolSize 1.3 setQueueCapacity 1.4 setKeepAliveSeconds 1.5 setThreadNamePrefix 1.6 setRejectedExecutionHandler 1.7 示例代码 二、Durid数据库连接池 2.1 ServletRegistrationBean 2.2 FilterRegist…

【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)

🔥个人主页: 中草药 🔥专栏:【Java】登神长阶 史诗般的Java成神之路 一、Bean的作用域 在 Java Spring 框架中,Bean 的作用域是一个关键概念,它决定了 Bean 的生命周期和实例化方式,对应用的性…

Excel 列名称转换问题 Swift 解答

文章目录 摘要描述题解答案Swift 实现代码:题解代码分析示例测试及结果 时间复杂度空间复杂度总结未来展望参考资料 摘要 本篇文章将通过 Swift 编程语言解答一个常见的算法问题:给定一个整数 columnNumber,将其转换为 Excel 表中的列名称。…

基于艾伦方差的频率稳定性分析

某个授时系统通过串口或网口采集时间间隔计数器、频率计数器、相位噪声分析仪设备的重要信息,用于评估和分析频率源的频率稳定度,确保测量的准确性和可靠性。 数据处理: 读取保存在文件中的时间间隔计数器测量的时差数据,计算时间稳定度(用TDEV表示)并保存。TDEV包括秒稳…