nginx配置之server_name不再迷惑
off999 2025-01-03 18:13 21 浏览 0 评论
Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,大家常用的应该就是静态服务器和反向代理了:
静态资源服务配置:
location /images/ {
root /data/images;
#这里是一个hello world...
}反向代理配置:
location ~/api {
proxy_pass http://127.0.0.1;
}以上不是我要说的重点。
但是如果有人在服务器上如下配置:
server {
listen ip1:port;
server_name a.com;
...
}
serever {
listen ip2:port;
server_name b.com;
...
}我的请求 curl http://a.com:port 会被哪个server处理???[可怜]
如果你能很确定的回答上来,那就看看文末的答案和你想得是否一致,如果不确定那就继续读下去,我相信都到最后你能给出一个明确的答案
跟着搞,我嘴对嘴地告诉你步骤:
- 首先查看我的服务端ip
查看到该主机ip10.0.0.189,新增两个虚拟ip
ip addr add 10.0.0.100/24 dev 你的网卡名称
ip addr add 10.0.0.101/24 dev 你的网卡名称2.再次查看ip,可明确看到新增的两个ip成功
3.建立nginx资源目录(默认/var/www/html,我直接在nginx的目录搞了)如下:
index.html内容很简单,分别对应目录输出A、B、C
4.编写nginx配置
server {
listen 10.0.0.189;
location / {
root /etc/nginx/www/a;
index index.html;
}
}
server {
listen 10.0.0.100;
location / {
root /etc/nginx/www/b;
index index.html;
}
}
server {
listen 10.0.0.101;
location / {
root /etc/nginx/www/c;
index index.html;
}
}5.客户端机器编辑 hosts 文件新增服务端解析,如下
6.在客户端验证结果:
由于我比较懒,所以写了个脚本验证
#!/bin/bash
echo "a.com AA" # 访问 a.com 期望输出 A
curl http://a.com
echo "b.com BB"
curl http://b.com
echo "c.com CC"
curl http://c.com
echo "10.0.0.189 AA" #访问 10.0.0.189 期望输出 A
curl http://10.0.0.189
echo "10.0.0.100 BB"
curl http://10.0.0.100
echo "10.0.0.101 CC"
curl http://10.0.0.101- 验证结果(listen ip:port; 没有server_name的情况下)
可以看到无论通过 ip 还是 server_name 结果和我们的预期都是一致的
2.更改nginx配置
server {
listen 80;
server_name a.com;
location / {
root /etc/nginx/www/a;
index index.html;
}
}
server {
listen 80;
server_name b.com;
location / {
root /etc/nginx/www/b;
index index.html;
}
}
server {
listen 10.0.0.100:80;
server_name c.com;
location / {
root /etc/nginx/www/c;
index index.html;
}
}结果:
a.com正常
b.com异常:b.com期望输出B但是结果输出了C,因为b.com通过hosts之后解析到了10.0.0.100,正好能匹配到c.com(listen 10.0.0.100:80)服务,所以打印了C
c.com异常:c.com通过hosts解析之后是10.0.0.101:80,但是配置的3个服务没有与这个相匹配的,所以取默认的第一个既a.com;
ip原理与上面一样域名解析一样
默认服务配置:
如果不配置,nginx会按照配置顺序取得第一个。
可通过default_server指定,不过0.8.21之前的版本使用default
更改nginx配置,在b.com中增加default_serevr
server {
listen 80;
server_name a.com;
location / {
root /etc/nginx/www/a;
index index.html;
}
}
server {
listen 80 default_serevr;
server_name b.com;
location / {
root /etc/nginx/www/b;
index index.html;
}
}
server {
listen 10.0.0.100:80;
server_name c.com;
location / {
root /etc/nginx/www/c;
index index.html;
}
}可以看到默认的A输出全部变成了b.com的B
nginx配置文件保持不变,再次进行如下访问:
因为 a.com 与 b.com 的监听没有指定 ip,所以请求头中的 Host 字段起了决定性作用
但是c.com的监听配置了ip对应b.com,所以请求头中的 Host 字段失效了
结论:
- 如果 listen ip:port;格式,则 nginx 首先判断ip是否有匹配,如果没有则在通过请求头中的 Host 路由,如果都失败了,那就使用默认路由
- 如果 listen port;格式,则 nginx 使用请求头中的 Host 判断路由,如果失败,则使用默认路由
所以我们开头的例子答案是什么呢?
server {
listen ip1:port;
server_name a.com;
...
}
serever {
listen ip2:port;
server_name b.com;
...
}请求 curl http://a.com:port
按照常理来说那就是a.com了。
但是
经过以上我们的实验,此时的客户机a.com解析出来是 ip2 结果是不是就不一样了呢?
- 上一篇:就是要让你搞懂Nginx,这篇就够了
- 下一篇:Nginx后端服务器组的配置
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
-
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
-
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
- 性能测试100集(12)性能指标资源使用率
-
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
- Linux 服务器常见的性能调优_linux高性能服务端编程
-
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
- Nginx性能优化实战:手把手教你提升10倍性能!
-
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
- Kubernetes 高并发处理实战(可落地案例 + 源码)
-
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
- 高并发场景下,Nginx如何扛住千万级请求?
-
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
-
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
- Docker-基础操作_docker基础实战教程二
-
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
- 你有空吗?跟我一起搭个服务器好不好?
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
- 部署你自己的 SaaS_saas如何部署
-
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
- Docker Compose_dockercompose安装
-
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
-
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
-
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
