什么是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;
        }
		
    }

}
相关推荐
Ztiddler4 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh
小小不董4 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba
IPdodo全球网络4 小时前
如何利用静态住宅IP优化Facebook商城的网络稳定性与运营效率
运维·服务器
运维&陈同学5 小时前
【模块一】kubernetes容器编排进阶实战之k8s基础概念
运维·docker·云原生·容器·kubernetes·云计算
40kuai5 小时前
Ingress nginx 公开TCP服务
nginx·ingress
m0_519523106 小时前
Linux——简单认识vim、gcc以及make/Makefile
linux·运维·vim
mit6.8246 小时前
[Docker#4] 镜像仓库 | 部分常用命令
linux·运维·docker·容器·架构
zyp2468106 小时前
Linux之DNS服务器
linux·运维·服务器
wdxylb6 小时前
将C++搭建的简单HTTP服务器升级为 HTTPS 服务器
运维·服务器·https
Denzel张7 小时前
ubuntu_dpkg_dep_list
linux·运维·ubuntu