热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

nginx原理详解(nginx作用和工作原理)

本文首先介绍nginx的反向代理、负载均衡、动静分离和高可用的原理,随后详解nginx的配置文件,最后通过实际案例实现nginx反向代理和负载均衡的具体配置。学会n

本文首先介绍 nginx 的反向代理、负载均衡、动静分离和高可用的原理,随后详解 nginx 的配置文件,最后通过实际案例实现 nginx 反向代理和负载均衡的具体配置。学会 nginx ,一篇足够了。

1. 简介

  nginx 是开源的轻量级 web 服务器、反向代理服务器,以及负载均衡器和 http 缓存器。其特点是高并发,高性能和低内存。
  nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,最大能支持 50000 个并发连接数。 nginx 还支持热部署,它的使用特别容易,几乎可以做到 7×24 小时不间断运行。 nginx 的网站用户有:百度、淘宝、京东、腾讯、新浪、网易等。

2. 反向代理2.1 正向代理

  nginx 不仅可以做反向代理,实现负载均衡,还能用做正向代理来进行上网等功能。

c++后端程序员必须彻底搞懂nginx,从原理到实战详解
2.2 反向代理

  客户端对代理服务器是无感知的,客户端不需要做任何配置,用户只请求反向代理服务器,反向代理服务器选择目标服务器,获取数据后再返回给客户端。反向代理服务器和目标服务器对外而言就是一个服务器,只是暴露的是代理服务器地址,而隐藏了真实服务器的ip地址。

c++后端程序员必须彻底搞懂nginx,从原理到实战详解
3. 负载均衡

  将原先请求集中到单个服务器上的情况改为增加服务器的数量,然后将请求分发到各个服务器上,将负载分发到不同的服务器,即负载均衡。

c++后端程序员必须彻底搞懂nginx,从原理到实战详解
4. 动静分离

  为了加快网站的解析速度,可以把静态页面和动态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

c++后端程序员必须彻底搞懂nginx,从原理到实战详解
5. 高可用

  为了提高系统的可用性和容错能力,可以增加nginx服务器的数量,当主服务器发生故障或宕机,备份服务器可以立即充当主服务器进行不间断工作。

c++后端程序员必须彻底搞懂nginx,从原理到实战详解

分享更多关于c/c++ linux后端开发网络底层原理知识学习提升,完善技术栈,内容知识点包括linux,nginx,zeromq,mysql,redis,fastdfs,mongodb,zk,流媒体,cdn,p2p,k8s,docker,tcp/ip,协程,dpdk等等。后台私信【架构】获取

c++后端程序员必须彻底搞懂nginx,从原理到实战详解
6. nginx配置文件6.1 文件结构

  nginx 配置文件由三部分组成。

... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [pattern] #location块
{
...
}
location [pattern]
{
...
}
}
server
{
...
}
... #http全局块
}

  • 第一部分 全局块
      主要设置一些影响 nginx 服务器整体运行的配置指令。  比如: worker_processes 1; , worker_processes 值越大,可以支持的并发处理量就越多。
  • 第二部分 events块
      events 块涉及的指令主要影响nginx服务器与用户的网络连接。  比如: worker_connections 1024; ,支持的最大连接数。
  • 第三部分 http块
      http 块又包括 http 全局块和 server 块,是服务器配置中最频繁的部分,包括配置代理、缓存、日志定义等绝大多数功能。 server块:配置虚拟主机的相关参数。 location块:配置请求路由,以及各种页面的处理情况。
6.2 配置文件

########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myformat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myformat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
7.配置实例7.1 反向代理7.1.1 实战一

实现效果:
  在浏览器输入 www.abc.com , 从 nginx 服务器跳转到 linux 系统 tomcat 主页面。
具体配置:

server {
listen 80;
server_name 192.168.4.32; #监听地址

location / {
root html; #/html目录
proxy_pass http://127.0.0.1:8080; #请求转向
index index.html index.htm; #设置默认页
}
}
7.1.2 实战二

实现效果:
  根据在浏览器输入的路径不同,跳转到不同端口的服务中。
具体配置:

server {
listen 9000;
server_name 192.168.4.32; #监听地址

location ~ /example1/ {
proxy_pass http://127.0.0.1:5000;
}
location ~ /example2/ {
proxy_pass http://127.0.0.1:8080;
}
}

location 指令说明:

  • ~ : 表示uri包含正则表达式,且区分大小写。
  • ~* : 表示uri包含正则表达式,且不区分大小写。
  • = : 表示uri不含正则表达式,要求严格匹配。
7.2 负载均衡7.2.1 实战一

实现效果:
  在浏览器地址栏输入
http://192.168.4.32/example/a.html
,平均到 5000 和 8080 端口中,实现负载均衡效果。
具体配置:

upstream myserver {
server 192.167.4.32:5000;
server 192.168.4.32:8080;
}

server {
listen 80; #监听端口
server_name 192.168.4.32; #监听地址

location / {
root html; #html目录
index index.html index.htm; #设置默认页
proxy_pass http://myserver; #请求转向 myserver 定义的服务器列表
}
}

nginx 分配服务器策略

  • 轮询(默认)
      按请求的时间顺序依次逐一分配,如果服务器down掉,能自动剔除。
  • 权重
      weight 越高,被分配的客户端越多,默认为 1。比如: upstream myserver { server 192.167.4.32:5000 weight=10; server 192.168.4.32:8080 weight=5; }
  • ip
      按请求 ip 的 hash 值分配,每个访客固定访问一个后端服务器。比如: upstream myserver { ip_hash; server 192.167.4.32:5000; server 192.168.4.32:8080; }
  • fair
      按后端服务器的响应时间来分配,响应时间短的优先分配到请求。比如: upstream myserver { fair; server 192.167.4.32:5000; server 192.168.4.32:8080; }

  恭喜!目前为止你已经掌握了 nginx 的基本原理,并且能够配置反向代理和负载均衡。

分享更多关于c/c++ linux后端开发网络底层原理知识学习提升,完善技术栈,内容知识点包括linux,nginx,zeromq,mysql,redis,fastdfs,mongodb,zk,流媒体,cdn,p2p,k8s,docker,tcp/ip,协程,dpdk等等。后台私信【架构】获取

c++后端程序员必须彻底搞懂nginx,从原理到实战详解


推荐阅读
  • 2019我的金三银四
    先讲一下自己的情况吧,二本学生,17年毕业,目前在一家跨境电商从事Java技术开发工作(不是阿里,没那么厉害),技术栈目前偏向于容器云、持续集成持续交付这一块,也就是SpringBoot、Kuber ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • 分布式大型互联网企业架构!
    2019独角兽企业重金招聘Python工程师标准摘要:开发工具1.EclipseIDE:采用Maven项目管理,模块化。2.代码生成: ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • DockerDataCenter系列(四)-离线安装UCP和DTR,Go语言社区,Golang程序员人脉社 ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • Docker安装Rabbitmq(配合宝塔)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker安装Rabbitmq(配合宝塔)相关的知识,希望对你有一定的参考价值。一、事前准备 ... [详细]
  • 什么是网关服务器初学linux服务器开发时,我们的服务器是很简单的,只需要一个程序完成与客户端的连接,接收客户端数据,数据处理,向客户端发送数据。但是在处理量很大的情况下,一 ... [详细]
  • PartI:取经处: http:www.ramkitech.com201210tomcat-clustering ... [详细]
  • k8shelm官网:https:helm.sh点击charts:https:artifacthub.iopackagessearch?sortrelevance&page11.1h ... [详细]
  • 大家好,这是一个为了梦想而保持学习的博客。这个专题会记录我对于KAFKA的学习和实战经验,希望对大家有所帮助,目录形式依旧为问答的方式,相当于是模拟面试。一、概述在对kafka有了 ... [详细]
  • 黄东旭: 关于基础软件产品价值的思考
    黄东旭:关于基础软件产品价值的思考-好久没写东西了,正好趁着春节的节后综合症发作写写文章热身一下,记得前几年偶尔会写一些关于TiDB产品功能解读的文章,TiDB5.0发了那么长时间 ... [详细]
author-avatar
guanchunlei
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有