超全Nginx反向代理服务器原理+实战篇1

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 超全Nginx反向代理服务器原理+实战篇

1.Nginx简介和安装部署

1.1.什么是Nginx

  • 高性能的[HTTP]和反向代理的web服务器,用c语言编写,高性能支持单机千万级连接,强大的第三方库支持,负载均衡、静态文件服务器等。

1.2.Nginx的用途

  • 搭建前端静态资源服务器、文件服务器
  • 负载均衡Upstream配置实战、后端节点高可用性探测、全局异常兜底数据配置
  • Nginx封禁恶意IP、配置跨域、location和rewrite实战
  • Websocket配置、后端业务数据缓存前置、静态资源压缩
  • 阿里云ESC部署配置HTTPS证书
  • Nginx整合Openresty开发内网访问限制、文件资源下载限速实现原理
  • LVS+KeepAlived高可用配置

1.3.正向代理服务器

  • 客户端和目标服务器之间的服务器,客户端想代理发送一个请求指定目标服务器,然后代理向目标服务器请求并获得内容,并返回给客户端,平时说的代理服务器一般是正向代理服务器。
  • 核心:用户知道自己要访问的目标服务器
  • 场景:跳板机,访问原来无妨访问的网站
  • 109e3128d71b40c3899ca19eba1eed75.jpg

1.4.反向代理服务器

  • 客户端和目标服务器之间的服务器,客户端向代理发送一个请求,然后代理向目标服务器请求并获得内容,并返回给客户端。反向代理隐藏了真是的服务器。
  • 核心:客户端不知道要访问的目标服务器是哪台服务器,代理会根据一定的策略选择一个真是的服务器进行请求。
  • 场景:域名映射

b29f87072bbf4b59803bc8c9c8c986a7.jpg

1.5.nginx安装部署

  • 安装依赖
  • yum -y install gcc zlib zlib-devel pcre-devel opensslopenssl-devel
  • 解压nginx.tar.gz压缩包
  • tar -xvf nginx-1.18.0.tar.gz
  • 执行命令

./configure --prefix=/usr/local/nginx && make && make install

阿里云开放网络安全组或者虚拟机开发80端口firewall-cmd --permanent --add-port=80/tcp

启动nginx:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

989d3d6042624a69be9b487c5b2076b3.jpg

1.6.线上访问服务器应用流程解析

  • 一个http请求基本流程
  • 客户端通过发起域名资源请求->DNS解析获取IP->寻找服务器获取资源
  • 域名和IP的关系,DNS作用
  • DNS:Domain Name Server域名服务器,域名虽然便于人们记忆,但网络中的计算机只能通过IP相互通信,他们之间的转换共做成为域名解析,域名解析需要由专门的与专门解析服务器完成,DNS就是进行域名解析的服务器。
  • 什么是a记录和cname
  • a记录
  • 用户可以在此设置域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器(lixiang.com->192.168.10.103)
  • cname
  • 别名指向,可以为一个主机设置别名。比如设置lixiang123.com,用来指向lixiang.com那么以后就可以用lixiang123.com代替lixiang.com来访问,相当于多了一条通道。

1.7.本地虚拟机配置宿主机域名映射

  • C:\Windows\System32\drivers\etc
  • 修改hosts文件

2.Nginx核心基础知识

2.1.Nginx目录结构

(1)源码安装指定安装路径

  • /usr/local/nginx

(2)目录核心介绍


cec67cfb822440fd80ef66056e89351a.jpg

conf #所有配置文件的目录
  nginx.conf #默认的主要配置文件
  nginx.conf.default #默认模板
html #这是编译安装时Nginx的默认站点目录
  50x.html #错误页面
  index.html #默认首页
logs #nginx默认的日志路径,包括错误日志以及访问日志
  error.log  #错误日志
  nginx.pid  #nginx启动后的进程id
  access.log #nginx访问日志
sbin #nginx命令目录
  nginx #启动命令

(3)常见命令

./nginx #默认配置文件启动
./nginx -s reload #重启,加载默认的配置文件,conf/nginx.conf
./nginx -s stop #停止nginx
./nginx -c /usr/local/nginx/conf/nginx.conf #指定配置文件启动
#nginx进程有master process和worker process,关闭master进程即可,其他都被关掉

2.2.Nginx核心配置文件

  • 全局配置
  • server主机配置
  • location(URL匹配特定位置的设置)
#每个配置项有配置指令和指令参数够成 nginx配置文件全部用的相对路径
#user nobody; #指定nginx用户组
worker_processes 1; #指定worker process进程的数量
#error_log logs/error.log;  #错误日志存放的路径
#error_log logs/error.log notice; #告警日志 
#error_log logs/rttor/log info; #平常日志
#pid logs/nginx.pid #nginx进程的启动PID
#事件模块指令,用来指定Nginx的IO模型,Nginx支持的所有select、poll、kqueue、epoll等
#不同的是epoll用在linux平台上,而kqueue用在BSD系统上
events{
  use epoll;
  #指定每个worker进程的最大连接数,作为服务器来说,最大连接数为worker_connections * worker_processes
  #作为反向代理来说,最大连接数为worker_connections * worker_processes / 2
  worker_connections 1024;
}
#HTTP模块
http{
  #资源的媒体类型
  include mime.types; 
  #默认为下载,浏览器访问到未定义的扩展名的时候,就默认为下载该文件
  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日志,main 日志定义的格式
  #access_log logs/access/log main;
  #是否开启高效传输模式 on开启,off关闭
  sendfile on; 
  #减少网络报文段的数量
  #tcp_nopush on; 
  #客户端连接保持活动的超时时间,超过这个时间服务器会自动关闭
  keepalive_timeout 65;
  #是否开启压缩
  #gzip on;
  #虚拟主机配置
  server {
    #虚拟主机的服务端口
    listen 80;
    #用来指定IP地址和域名,可以有多个用空格分开
    server_name localhost;
    #charset koi8-r;
    #access_log日志,main 日志定义的格式
    #access_log logs/host.access.log main;
    #URL地址配置
    location /{
      #服务默认启动目录
      root html;
      #默认访问文件,按照顺序找
      index index.html;
    }
    #URL地址配置
    location ~ \.php${
      #反向代理的地址
      proxy_pass http://127.0.0.1;
    }
  }
  server {
    ....
  }
}

2.3.Nginx搭建前端静态服务器

(1)什么是虚拟主机

  • 指在一台物理主机上划分出多个磁盘空间,每个磁盘空间都是有一个虚拟主机,每台虚拟主机都可以对外提供Web服务,并且互不干扰,类似虚拟机
  • 利用虚拟主机把多个不同域名的网站部署在同一台服务器上,节省了服务器硬件成本和相关的维护费用


43455f9a82e443d499ee03602927c09c.jpg

(2)Nginx虚拟主机配置

#use nobody;
worker_processes 1;
events{
  use epoll;
  worker_connections 1024;
}
http{
    server{
        listen 80; #监听的端口
        server_name www.nginx.com #请求的域名
        location /{
            root /usr/local/software/nginx/html #目录
            index index.html #跳转的页面
        }
    }
    server{
        listen 80;
        server_name www.lixiang.com #请求的域名
        location /{
            root /usr/local/software/nginx/html #目录
            index lixiang.html
        }
    }
}

重启nginx : ./nginx -s reload




6f1cadcdb9964c49beb1ecda2fd16d00.jpg

2.4.Nginx搭建图片服务器

(1)图片服务器

  • 学javaweb、node、或者其他基础web项目,基本都是图片上传到项目本身,这个是很少用的
  • 公司一般都会使用图片服务器或者云厂商提供CDN
  • (2)访问流程:前端提交图片->后端处理->存储到数据库->拼接好访问路径保存到数据库,存储到文件服务器

203630a2f4f54ed593fe6adf48061d16.jpg


(3)配置虚拟主机

server { 
  listen 80;
  server_name www.lixiang.com;
  location /app/img/ {
    alias /usr/local/software/nginx/img/;
  }
}

656a9abed9724a2b9cc0991a1f43d32a.jpg

注意:

  • 在location / 中配置root目录
  • 在location /path中配置alias虚拟目录,目录后面“/”符号一定要带上

3.Nginx挖掘accessLog日志

3.1.Nginx访问日志简介

(1)access.log日志用处

  • 统计站点访问IP来源、某个时间段的访问频率
  • 查看访问最频的页面、Http响应状态码、接口性能
  • 接口秒级访问量、分钟访问量、小时和天访问量

(2)默认配置解析

#log_format  main  '$remote_addr $remote_user [$time_local] "$request" '
#                  '$status $body_bytes_sent "$http_referer" '
#                  '"$http_user_agent" "$http_x_forwarded_for"';

(3)案例

122.70.148.18 - [04/Aug/2020:14:46:48 +0800] "GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1" 200 48 "https://xdclass.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"

(4)日志解析

$remote_addr #访问的客户端IP地址,对应的是122.70.148.18
$remote_user #远程访问的用户,没有就用“-”表示
$time_local  #访问的时间,对应04/Aug/2020:14:46:48 +0800
$request     #URL请求的地址参数类型等,对应"GET /user/api/v1/product/order/query_state product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1"
$status    #访问的状态码,200表示正常
$body_bytes_sent #对应的是多少字节,48字节,响应的body大小
$http_referer #访问源,对应是"https://xdclass.net/",如是直接在浏览器刷新时,referer就会为“-”
$http_user_agent #对应是客户端浏览器访问的类型
$http_x_forwarded_for #获取用户的真实ip

3.2.Nginx统计站点访问量

(1)查看访问最频繁的前100个IP

awk '{print$1}' access_temp.log | sort | uniq -c | sort -rn | head -100

(2)统计访问最多的url前20名

awk '{print$7}' access_temp.log | sort | uniq -c | sort -rn | head -20
awk是文本处理工具,默认按照空格切分,$N是切割第几个元素,$1就是切割第一个
sort命令用于将文本内容进行排序,-n按照数值排,-r倒序来排,默认从小到大
uniq去除重复出现的列,-c 显示重复的次数

(3)自定义日志格式,统计接⼝响应耗时

  • 日志格式增加$request_time
$request_time:从接受用户请求的第一个字节到发送完响应数据的时间,既包括接受数据的时间、程序响应时间、输出相应时间
$upstream_response_time:指从Nginx像向后端建立连接开始到接受完数据然后关闭连接为止的时间。
#定义日志格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$request_time"';
#引用日志模板
access_log  logs/access.log  main;

(4)统计耗时接口, 列出传输时间超过 2 秒的接口,显示前5条

awk '$NF>2{print$7}' access.log | sort| uniq -c | sort -rn | head -5

4.Nginx负载均衡策略

4.1.负载均衡简介

  • 分布式系统中一个非常重要的概念,当访问的服务具有多个实例,需要根据某种”均衡“的策略决定请求发往哪个节点,这就是所谓的负载均衡。

  • 原理是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,从而提高了数据的吞吐量。

4.2.负载均衡的种类

  • 通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但比较昂贵。
  • 通过软件来进行解决,常见的软件有LVS、Nginx等,他们是基于Linux系统并且开源的负载均衡策略。
  • 目前来说公司用的较多的就是Nginx

4.3.upstream负载均衡配置

upstream lbs{
  server 192.168.10.111:8080;
  server 192.168.10.111:8081;
}
server{
  listen 80;
  server_name www.lixiang.com; 
  location /api/{
    proxy_pass http://lbs;
    proxy_redirect default;
  }
}

4.4.Nginx负载均衡策略

  • 节点轮询(默认)
  • 简介:每个请求按照顺序分配到不同的后端服务器
  • 场景:会造成可靠性低和负载分配不均衡,适合静态文件服务器
upstream lbs{
  server 192.168.10.111:8080;
  server 192.168.10.111:8081;
}
  • weight权重配置
  • 简介:weight和访问比率成正比,数字越大,分配得到的流量越高
  • 场景:服务器性能差异较大的情况使用
upstream lbs{
  server 192.168.10.111:8080 weight=5;
  server 192.168.10.111:8081 weight=10;
}
  • ip_hash(固定分发)
  • 简介:根据请求按照访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器。
  • 场景:服务器业务分区、业务缓存、Session需要单点的情况。
upstream lbs{
  ip_hash;
  server 192.168.10.111:8080;
  server 192.168.10.111:8081;
}
  • upstream还可以为每个节点设置状态值
  • down表示当前的server暂时不能参与负载
server 192.168.10.111:8080 down;
  • backup其他所有的非backup机器down的时候,会请求backup机器,这台机器压力会最轻,配置也相对低
server 192.168.10.111:8081 backup;

4.5.Nginx后端节点可用性探测配置

  • 如果某个应用挂了,请求不应该继续分发过去
  • max_fails:允许请求失败的次数,默认为1,当超过最大次数时就不会请求
  • fail_timeout:max_fails次失败后,暂停的时间。默认fail_timeout=10s
max_fails=N设定Nginx与后端节点通信的尝试失败的次数,在fail_timeout参数定义的时间内,如果失败的次数到达此值,Nginx就认为这个节点不可用,在下一个fail_timeout时间段到来之前,服务器不会在去尝试。失败尝试次数默认是1,如果设定为0就会停止统计尝试次数,认为服务器一直可用
  • 可以通过proxy_next_upstream来配置什么是失败的尝试。
  • 注意:默认情况下,http_404状态是不被认为是失败的尝试
  • 配置实操


upstream lbs{
  server 192.168.10.111:8080 max_fails=2 fail_timeout=60s;
  server 192.168.10.111:8081 max_fails=2 fail_timeout=60s;
}
server {
  listen 80;
  server_name www.nginx.com;
  location /api/{
    proxy_pass http://lbs;
    proxy_redirect default;
    proxy_next_upstream error timeout http_404 http_503 http_500;
  }
}
目录
打赏
0
0
1
0
60
分享
相关文章
Nginx七层(应用层)反向代理:HTTP反向代理proxy_pass篇
通过使用Nginx的反向代理功能,可以有效地提高Web应用的性能、安全性和可扩展性。配置过程中需要注意不同场景下的具体需求,如负载均衡、SSL终止和缓存策略等。正确配置和优化Nginx反向代理可以显著提升系统的整体表现。
174 20
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
228 60
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
309 60
nginx的正向代理和反向代理以及tomcat
Nginx的正向代理和反向代理功能在不同的场景中具有重要作用,正向代理主要用于客户端访问控制和匿名浏览,而反向代理则用于负载均衡和高可用性服务。Tomcat作为Java Web应用服务器,与Nginx结合使用,可以显著提升Web应用的性能和稳定性。通过合理配置Nginx和Tomcat,可以构建高效、稳定和可扩展的Web服务架构。
194 11
nginx反向代理bucket目录配置
该配置实现通过Nginx代理访问阿里云OSS存储桶中的图片资源。当用户访问代理域名下的图片URL(如 `http://代理域名/123.png`)时,Nginx会将请求转发到指定的OSS存储桶地址,并重写路径为 `/prod/files/2024/12/12/123.png`。
102 5
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
使用Nginx搭建流媒体服务器
本文介绍了流媒体服务器的特性及各种流媒体传输协议的适用场景,并详细阐述了使用 nginx-http-flv-module 扩展Nginx作为流媒体服务器的详细步骤,并提供了在VLC,flv.js,hls.js下的流媒体拉流播放示例。
276 1
2025年阿里云GPU服务器租用价格、选型策略与应用场景详解
随着AI与高性能计算需求的增长,阿里云提供了多种GPU实例,如NVIDIA V100、A10、T4等,适配不同场景。2025年重点实例中,V100实例GN6v单月3830元起,适合大规模训练;A10实例GN7i单月3213.99元起,适用于混合负载。计费模式有按量付费和包年包月,后者成本更低。针对AI训练、图形渲染及轻量级推理等场景,推荐不同配置以优化成本和性能。阿里云还提供抢占式实例、ESSD云盘等资源优化策略,支持eRDMA网络加速和倚天ARM架构,助力企业在2025年实现智能计算的效率与成本最优平衡。 (该简介为原文内容的高度概括,符合要求的字符限制。)
2025年阿里云企业云服务器ECS选购与配置全攻略
本文介绍了阿里云服务器的核心配置选择方法论,涵盖算力需求分析、网络与存储设计、地域部署策略三大维度。针对不同业务场景,如初创企业官网和AI模型训练平台,提供了具体配置方案。同时,详细讲解了购买操作指南及长期运维优化建议,帮助用户快速实现业务上云并确保高效运行。访问阿里云官方资源聚合平台可获取更多最新产品动态和技术支持。
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。