nginx

120 阅读7分钟

什么是nginx: 是一款轻量级的Web服务器/反向代理服务器

nginx 的应用场景

  • HTTP服务器

    Nginx本身是一个静态资源服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,例如当一个网站只有静态页面的话,就可以通过这种方式来实现部署;

  • 静态资源服务

    静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就可以从该静态服务器中获取。

  • 反向代理服务器

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

  • 负载均衡

    负载均衡也是Nginx常用的一个功能,负载均衡的意思是分摊到多个操作单元上进行执行,例如将服务器 分为多类型服务器,Web服务器、FTP服务器、企业关键应用服务器和其他关键任 务服务器等,从而共同完成工作任务。当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。

    我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。 用了反向代理来实现的

  • 动静分离

    动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好 拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思想。

正向代理

正向代理服务器是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

即正向代理中目标服务器并不知道访问它的真实用户是谁,因为和它交互的是代理服务器。

image.png

反向代理

正向代理中目标服务器不知道用户是谁,反向代理中则相反,是用户不知道目标服务器是谁

用户将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器并获取数据后,再返回给客户端,这个过程中用户并不知道真正的请求发送到哪台服务器上了。 反向代理,其实是"代理服务器"代理了"目标服务器",去和"客户端"进行交互。

image.png

基础常规配置

http {
    client_max_body_size 10m;           # 请求体大小限制
    
    server {
       listen         80;               # 监听的端口
       server_name    localhost;        # 域名/ip
       location / {
            root  /home/admin/frontend/;         # 前端打包后的项目目录
            index  index.html index.htm;         # 入口文件
        }
    }
}

反向代理

// nginx.config
server {
    listen: 80; // 监听的端口
    server_name localhost // 域名/ip
    location / {
        proxy_pass http://127.0.0.1:8000;  // 定义后端服务器的地址。
        proxy_set_header Host $host;  //修改从客户端传递到代理服务器的请求头,将原始请求中的Host信息也放到转发的请求里,如果不加,转发的请求不会带host字段,
        proxy_set_header Cookie $http_cookie; //将原始请求中的所有Cookie信息等原样传递到反向代理服务请求。
   
}

会通过 location 功能匹配指定的 URI,然后把接收到的符合匹配 URI的请求通过 proxy_pass 转移



###### 模块解析


| 名称 | 作用 |
| --- | --- |
| 全局块 | 配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等 |
| events块 | 配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等 |
| streamk块 | 配置四层协议的转发、代理或者负载均衡等 |
| http块 | 可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等 |
| server块 | 配置虚拟主机的相关参数,一个http中可以有多个server |
| location块 | 配置请求的路由,以及各种页面的处理情况 |

配置Gzip

```js
server{
    gzip on;  # 于开启或 关闭gzip模块
    gzip_buffers 32 4K; # 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。
    gzip_comp_level 6;  # 压缩级别,1-10,数字越大压缩的越好,压缩级别越高压缩率越大,压缩时间越长。
    gzip_min_length 100;  # 设置允许压缩的页面最小字节数,页面字节数从相应消息头的Content-length中进行获取。
    gzip_types application/javascript text/css text/xml;
    gzip_disable "MSIE [1-6]\.";  # IE6对Gzip不友好,对Gzip(可以通过该指令对一些特定的User-Agent不使用压缩功能)
    gzip_proxied on: # 用于设置启用或禁用从代理服务器上收到相应内容gzip压缩。
    gzip_http_version  1.1;   # 识别HTTP协议版本,其值可以是 1.1 或 1.0
    gzip_proxied : off; # 用于设置启用或禁用从代理服务器上收到相应内容gzip压缩。
    gzip_vary on;  # 用于在响应消息头中添加Vary:Accept-Encoding,使代理服务器根据请求头中的Accept-Encoding识别是否启用gzip压缩。
}

配置跨域

location / {
    # 其他配置...

    # 设置允许来自所有域名请求。如果需要指定域名,将'*'替换为您的域名。
    add_header 'Access-Control-Allow-Origin' '*';

    # 允许的请求方法。
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

    # 允许的请求头。
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';

    # 允许浏览器缓存预检请求的结果,单位为秒。
    add_header 'Access-Control-Max-Age' 1728000;

    # 允许浏览器在实际请求中携带用户凭证。
    add_header 'Access-Control-Allow-Credentials' 'true';

    # 设置响应类型为JSON。
    add_header 'Content-Type' 'application/json charset=UTF-8';

    # 针对OPTIONS请求单独处理,因为预检请求使用OPTIONS方法。
    if ($request_method = 'OPTIONS') {
        return 304;
    }
}

配置文件示例

# 全局段配置
# ------------------------------

# 指定运行nginx的用户或用户组,默认为nobody。
#user administrator administrators;

# 设置工作进程数,通常设置为等于CPU核心数。
#worker_processes 2;

# 指定nginx进程的PID文件存放位置。
#pid /nginx/pid/nginx.pid;

# 指定错误日志的存放路径和日志级别。
error_log log/error.log debug;

# events段配置信息
# ------------------------------
events {
    # 设置网络连接序列化,用于防止多个进程同时接受到新连接的情况,这种情况称为"惊群"。
    accept_mutex on;

    # 设置一个进程是否可以同时接受多个新连接。
    multi_accept on;

    # 设置工作进程的最大连接数。
    worker_connections  1024;
}

# http配置段,用于配置HTTP服务器的参数。
# ------------------------------
http {
    # 包含文件扩展名与MIME类型的映射。
    include       mime.types;

    # 设置默认的MIME类型。
    default_type  application/octet-stream;

    # 定义日志格式。
    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;

    # 允许使用sendfile方式传输文件。
    sendfile on;

    # 限制每次调用sendfile传输的数据量。
    sendfile_max_chunk 100k;

    # 设置连接的保持时间。
    keepalive_timeout 65;

    # 定义一个上游服务器组。
    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块,用于匹配特定的请求URI。
        location  /{
           # 设置请求的根目录。
           #root path;

           # 设置默认页面。
           #index vv.txt;

           # 将请求转发到上游服务器组。
           proxy_pass  http://mysvr;

           # 定义访问控制规则。
           deny 127.0.0.1;
           allow 172.18.5.54;          
        } 
    }
}