什么是Nginx?

1.Nginx概述

1.1.Nginx是什么?

Nginx是一个高性能的http和反向代理服务器,其特点是占用内存小,并发能力强。Nginx专为性能优化而开发,性能是其最重要的考量,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx 是免费的并可以商业化,配置使用也比较简单。

Nginx 的最重要的几个使用场景:

  • 静态资源服务,通过本地文件系统提供服务;
  • 反向代理服务,延伸出包括缓存、负载均衡等;
  • API 服务,OpenResty

1.2.Nginx重点

  • 反向代理
  • 负载均衡
  • nginx特点

学习Nginx的重点就理解什么是反向代理、负载均衡还有他的一些特点。

2.Nginx的相关功能

2.1.反向代理

这里说到反向代理,我们一定想知道什么是正向代理? 我们可以先来连接什么是正向代理。

代理是在服务器和客户端之间假设的一层服务器 ,代理将接收客户端的请求并将它转发给服务器,然后将服务端的响应转发给客户端。

不管是正向代理还是反向代理,实现的都是上面的功能。如果你对OSI 七层模型与 TCP/IP 四层模型不是很熟悉可以再回顾下。

正向代理一般是客户端架设的 ,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的 ,比如在自己的机器集群中部署一个反向代理服务器。

正向代理类似一个跳板机,代理访问外部资源,相当我们经常说的代理IP去爬。

比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了,面向客户端的。


正向代理的用途:

  1. 访问原来无法访问的资源,如google
  2. 可以做缓存,加速访问资源
  3. 对客户端访问授权,上网进行认证
  4. 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

反向代理

了解了正向代理,下面理解反向代理会相对比较简单了,就是代理服务器来接受Internet上的请求,然后发送给内部网路的服务器上,在将结果返回给客户,相当于一层服务器来对外开放。

反向代理是面向内部服务器的。

反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。

反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。
反向代理的作用:

  1. 保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
  2. 负载均衡,通过反向代理服务器来优化网站的负载

2.2.负载均衡

如果请求数过大,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器的情况改为请求分发到多个服务器上,就是负载均衡。

Upstream 指定后端服务器地址列表,在 server 中拦截响应请求,并将请求转发到 Upstream 中配置的服务器列表。

nginx 复制代码
upstream balanceServer {
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}

server { 
    server_name  fe.server.com;
    listen 80;
    location /api {
        proxy_pass http://balanceServer;
    }
}

上面的配置只是指定了 nginx 需要转发的服务端列表,并没有指定分配策略。

默认情况下采用的是轮询策略 ,将所有客户端请求轮询 分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。
Nginx支持的负载均衡调度算法方式如下:

  • weight轮询(默认,常用) :接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight) ,用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
  • ip_hash(常用):每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
  • fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。
  • url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。

2.3.动静分离

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

将静态资源部署在Nginx服务器上面请求的是静态资源直接Nginx返回数据。实现动静分离。

一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。

使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。

3.Nginx配置

上面是对配置的框架分析

nginx 复制代码
1、全局块
该部分配置主要影响Nginx全局,通常包括下面几个部分:

配置运行Nginx服务器用户(组)
worker process数
Nginx进程PID存放路径
错误日志的存放路径
配置文件的引入

2、events块
该部分配置主要影响Nginx服务器与用户的网络连接,主要包括:

设置网络连接的序列化
是否允许同时接收多个网络连接
事件驱动模型的选择
最大连接数的配置

3、http块

定义MIME-Type
自定义服务日志
允许sendfile方式传输文件
连接超时时间
单连接请求数上限

4、server块

配置网络监听
基于名称的虚拟主机配置
基于IP的虚拟主机配置

5、location块

location配置
请求根目录配置
更改location的URI
网站默认首页配置

一份配置清单例析

nginx 复制代码
#下面这一块是全局块
user  nobody  nobody;
worker_processes  3;
error_log  logs/error.log;
pid  logs/nginx.pid;

#events块
events {
	use epoll;
  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  logs/access.log  main;
    sendfile  on;
    keepalive_timeout  65;

    #当前nginx服务的一些配置
    server {
        # 当前服务的监听端口
        listen       8088;
        server_name  codesheep;
        access_log  /codesheep/webserver/server1/log/access.log;
        error_page  404  /404.html;
        # 当前uil下的跳转root 、页面
        location /server1/location1 {
            root   /codesheep/webserver;
            index  index.server2-location1.htm;
        }
        
        # location 配置2
        location /server1/location2 {
            root   /codesheep/webserver;
            index  index.server2-location2.htm;
        }

    }
    # 第二个Nginx服务器
    server {
        listen       8089;
        server_name  192.168.31.177;
        access_log  /codesheep/webserver/server2/log/access.log;
        error_page  404  /404.html;
		
        location /server2/location1 {
            root   /codesheep/webserver;
            index  index.server2-location1.htm;
        }

        location /srv2/loc2 {
            alias   /codesheep/webserver/server2/location2/;
            index  index.server2-location2.htm;
        }
        # 代理请求路径
        location /srv3/loc3 {
            proxy_pass	http://127.0.0.1:8080;
        }
        #代理请求路径2
        location /srv4/loc4/ {
            proxy_pass	http://127.0.0.1:8081;
        }
		    
        location = /404.html {
	        root /codesheep/webserver/;
	        index 404.html;
        }
		
    }

}
相关推荐
乘云数字DATABUFF2 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--4 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森4 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜5 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB6 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode7 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220708 天前
如何搭建本地yum源(上)
运维
ping某9 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树8811 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠11 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql