Nginx 详解

2023-05-16

文章目录

  • Nginx 详解
    • 一、简介
    • 二、四大应用场景
      • 1. HTTP 服务器
      • 2. 反向代理
      • 3. 负载均衡
      • 4. 动静分离
    • 三、Linux 环境下安装Nginx
    • 四、Nginx 服务常用命令
    • 五、Nginx 配置文件
      • 1、全局块
        • 1.1 user
        • 1.2 worker_processes
        • 1.3 pid
        • 1.4 error_log
        • 1.5 include
      • 2、events 块
        • 2.1 worker_connections
        • 2.2 use
      • 3、http 块
        • 3.1 http 全局块
          • 3.1.1 MIME-TYPE
          • 3.1.2 access_log
          • 3.1.3 keepalive_timeout
          • 3.1.4 gzip
        • 3.2 server 块
          • 3.2.1 server 全局块
            • 3.2.1.1 listen
            • 3.2.1.2 server_name
          • 3.2.2 location 块
            • 3.2.2.1 root
            • 3.2.2.2 alias
            • 3.2.2.3 return
            • 3.2.2.4 proxy_pass
    • 六、Nginx 场景实践
      • 1、反向代理
        • 正向代理和反向代理
      • 2、负载均衡
        • 2.1 upstream 命令
        • 2.2 负载均衡策略
          • 2.2.1 轮询(默认)
          • 2.2.2 权重
          • 2.2.3 ip_hash
          • 2.2.4 url_hash
          • 2.2.5 fair
      • 3、动静分离
      • 4、跨域问题

Nginx 详解

在这里插入图片描述

一、简介

Nginx 是一款轻量级的 Web 服务器反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。

Nginx 专为性能优化而开发,使用异步非阻塞事件驱动模型。

Nginx 优点:

  • 它可以高并发连接,官方测试能够支撑 5 万并发连接,在实际生产环境中可以支撑 2 到 4 万并发连接。
  • 内存消耗少
  • 开源软件,可以免费试用,并且可用于商业用途。
  • 稳定性高,用于反向代理(负载均衡),宕机的概率微乎其微。
  • 支持热部署。在不间断服务的情况下,对软件版本升级。

二、四大应用场景

1. HTTP 服务器

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

2. 反向代理

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

3. 负载均衡

负载均衡也是 Nginx 常用的一个功能,负载均衡就是一个 Web 服务器解决不了的问题可以通过多个 Web 服务器来平均分担压力来解决,并发过来的请求被平均分配到多个后台 Web 服务器来处理,这样压力就被分解开来。

4. 动静分离

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

三、Linux 环境下安装Nginx

安装 Nginx 之前要确定虚拟机网络可用,以及 yum 可用,以及关闭防火墙

安装插件依赖

[root@localhost opt]# yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

如果一次性安装 4 个有问题,就分开安装

yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

插件的作用:

  • gcc:安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境

  • pcre pcre-devel:pcre 是一个 perl 库,包括 perl 兼容的正则表达式库,nginx 的 http 模块使用 pcre 来解析正则表达式

  • zlib zlib-devel:zlib 库提供了很多种压缩和解压缩方式,nginx 使用 zlib 对 http 包的内容进行 gzip

  • openssl openssl-devel:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库

下载 Nginx 压缩包

[root@localhost opt]# wget https://nginx.org/download/nginx-1.22.1.tar.gz

tar 包地址在 Nginx 官网可以查看,建议下载稳定版本。

安装 Nginx 步骤

# 解压到当前目录
[root@localhost opt]# tar -zxvf /opt/nginx-1.12.2.tar.gz

# 进入解压目录
[root@localhost opt]# cd nginx-1.22.1/

# 配置参数(具体参数可以./configure --help命令查看)
[root@localhost nginx-1.22.1]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

# 编译
[root@localhost nginx-1.22.1]# make

# 安装
[root@localhost nginx-1.22.1]# make install

# 验证
[root@localhost nginx-1.22.1]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.22.1

# 查看安装路径
[root@localhost nginx-1.22.1]# whereis nginx
nginx: /usr/local/nginx

四、Nginx 服务常用命令

在 Linux 平台下,启动 Nginx 服务器直接运行安装目录下 sbin 目录中的二进制文件即可。

例如:/usr/local/nginx/sbin/nginx

参数:

  • -h:命令帮助
  • -v :打印版本号
  • -V:打印版本号和配置
  • -t:测试配置正确性并退出
  • -q:测试配置时只显示错误
  • -s:向主进程发送信号(reload 重新加载配置文件、stop 停止服务)
  • -p:指定Nginx服务器路径前缀
  • -c: 指定Nginx配置文件路径
  • -g: 指定Nginx附加配置文件路径

Nginx 默认端口号为 80。-v、-t、-s 参数最为常用

#查看命令帮助
[root@localhost sbin]# /usr/local/nginx/sbin/nginx -h
nginx version: nginx/1.22.1
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
             [-e filename] [-c filename] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit #查看版本
  -V            : show version and configure options then exit
  -t            : test configuration and exit #测试配置正确性
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  # stop 快速关闭服务、quit 等待工作进程处理完成后关闭、reopen 重启nginx、reload 重新加载配置文件,热重启
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/local/nginx/)
  -e filename   : set error log file (default: logs/error.log)
  -c filename   : set configuration file (default: conf/nginx.conf)
  -g directives : set global directives out of configuration file

#启动nginx
[root@localhost sbin]# /usr/local/nginx/sbin/nginx

#查看版本
[root@localhost sbin]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.22.1

#测试nginx配置是否正确
[root@localhost sbin]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

#重新加载配置文件
[root@localhost sbin]# /usr/local/nginx/sbin/nginx -s reload

[root@localhost sbin]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.22.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

五、Nginx 配置文件

Nginx 配置文件大致分为 3 部分,分别为 全局块、events 块、http 块,而其中 http 块配置修改的最为频繁。

  • 全局块(全局配置,对全局生效)

  • events 块

  • http 块

    • http 全局块

    • server 块(可以有多个)

      • server 全局块

      • location 块(可以有多个)

1、全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响 Nginx 服务器整体运行的配置指令。

主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 文件存放路径、日志文件存放路径和类型以及配置文件的引入等。

1.1 user

1)作用:用于配置运行Nginx服务器用户(组)的指令

2)语法:user root [group];

所有用户都可以启动 Nginx 进程的两种方式:

  • 注释 user 指令
# user [user] [group];
  • 把用户(用户组)设置为 nobody
user nobody [nobody];

注意:在 Nginx 配置文件中,每一条指令配置都必须以 “;” 分号结束。

1.2 worker_processes

1)作用:配置允许生成 worker_processes 数

2)语法:worker_processes number;

worker_processes 是 Nginx 服务器实现并发处理的关键所在。worker processes 值越大,可以支持的并发处理量也越多(并不是越大越好,因为会受到硬件、软件等设备的制约)

number 指定 Nginx 进程最多可以产生的 worker_processes 数。默认配置为 1

worker_processes  1;

查看进程

[root@localhost conf]# ps -ef | grep nginx
root      34587      1  0 10:08 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    34627  34587  0 10:09 ?        00:00:00 nginx: worker process
root      53787  96815  0 15:41 pts/1    00:00:00 grep --color=auto nginx

1.3 pid

1)作用:配置 Nginx 进程 PID 存放路径

2)语法:pid filepath;

Nginx 进程作为系统的守护进程运行,我们需要在某个文件中保存当前运行程序的主进程号。

pid        logs/nginx.pid;

注意:在指令path的时候,一定要包括文件名,如果只设置了路径,没有设置文件名,会报错。

可以使用相对路径,也可以使用绝对路径。相对路径是以 Nginx 的安装目录为基本目录。

1.4 error_log

1)作用:配置错误日志的存放路径

2)语法:error_log filepath [日志级别];

在全局块、http 块和 server 块都可以对 Nginx 服务器的日志进行相关配置。位置不同,他们的作用域则不同。

指定的文件对于运行 Nginx 进程的用户要有写权限,否则会报错。

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
error_log  logs/error.log  warn;

日志级别有:debug、info、notice、warn、error、crit、alert

1.5 include

1)作用:配置文件的引入

2)语法:include filepath;

在一些情况下,我们可能需要将其他的 Nginx 配置或者第三方模块的配置引用到当前的主配置文件中,这时候就可以使用 include 指令

新引用进来的文件同样要求运行 Nginx 进程的用户对其具有写权限,并且符合 Nginx 配置文件规定的相关语法和结构。此指令可以放在配置文件的任意地方。并且支持相对路径。

2、events 块

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。

这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

2.1 worker_connections

1)作用:配置最大连接数

2)语法:worker_connections number;

指令 worker_connections 主要用来设置允许每一个 worker_processes 同时开启的最大连接数,默认为 1024。

events {
    worker_connections  1024;
}

当前 Nginx 服务器能够处理的并发请求数量 = 每个工作进程能够处理的最大连接数 × 工作进程数量

worker_connections × worker_processes

2.2 use

Nginx 服务器提供了多种事件驱动模型来处理网络消息。我们可以通过 use 指令来强制 Nginx 服务器选择哪种事件驱动模型进行消息处理。

1)作用:配置事件驱动模型

2)语法:use method;

method 可选择的内容有:select、poll、kqueue、epoll、rtsig、dev/poll 以及 eventport。

3、http 块

Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里

3.1 http 全局块

http 全局块配置的指定包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

3.1.1 MIME-TYPE

1)作用:自定义 MIME-TYPE

在常用的浏览器中,可以显示的内容有 HTML、XML、GIF 及 Flash 等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME TYPE

换言之,MIME TYPE 是网络资源的媒体类型。Nginx 服务器作为 Web 服务器,必须能够识别前端请求的资源类型。

include   mime.types;

MIME-TYPE 中包含了浏览器能够识别的后缀名,部分如下:

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;
    ......
}
3.1.2 access_log

记录 Nginx 服务器提供服务过程应答前端请求的日志,我们将其称为服务日志以示区分。

Nginx 服务器支持对服务日志的格式、大小、输出等进行配置,需要使用两个指令,分别是 access _log 和 log_format 指令。

1)作用:自定义服务日志

2)语法:access_log filepath [format[buffer=size]];

说明:

  • filepath:配置服务日志的文件存放的路径和名称。
  • format:可选项,自定义服务日志的格式字符串,也可以通过 “格式串的名称” 使 log_format 指令定义好的格式。“格式串的名称” 在 log_format 指令中定义。
  • size:配置临时存放日志的内存缓存区大小。

和 access_log 联合使用的另一个指令是 log_format,它专门用于定义服务日志的格式,并且可以为格式字符串定义一个名字,以便 access_log 指令可以直接调用。其语法格式为:log_format name string … ;

说明:

  • name:格式字符串的名字,默认的名字为 combined。
  • string:服务日志的格式字符串。在定义过程中,可以使用 Nginx 配置预设的一些变量获取相关内容,变量的名称使用双引号括起来,string 整体使用单引号括起来。
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;

日志格式设置:

  • $remote_addr 与 $http_x_forwarded_for 用以记录客户端的 IP 地址;
  • $remote_user:用来记录客户端用户名称;
  • $time_local: 用来记录访问时间与时区;
  • $request: 用来记录请求的url与http协议;
  • $status: 用来记录请求状态,成功是200;
  • $body_bytes_sent :记录发送给客户端文件主体内容大小;
  • $http_referer:用来记录从那个页面链接访问过来的;
  • $http_user_agent:记录客户浏览器的相关信息;

通常 web 服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过 $remote_addr 拿到的 IP 地址是反向代理服务器的 IP 地址。

反向代理服务器在转发请求的 http 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的 IP 地址和原来客户端的请求的服务器地址。

3.1.3 keepalive_timeout

与用户建立会话连接后,Nginx 服务器可以保持这些连接打开一段时间,指令 keepalive_timeout 就是用来设置此时间的。

1)作用:配置连接超时时间

2)语法:keepalive_timeout timeout;

timeout:服务器端对连接的保持时间。默认值为 75s 。

注意:keepalive_timeout 指令还可以出现在 server 块和 location 块中。

#keepalive_timeout  0;
keepalive_timeout  65;
3.1.4 gzip

Nginx 开启 gzip 压缩功能,可以使网站的 css、js 、xml、html 文件在传输时进行压缩,提高访问速度,进而优化 Nginx 性能。

gzip 压缩可以配置 http,server 和 location 块下,位置不同,作用域不同

1)作用:将响应报⽂发送⾄客户端之前可以启⽤压缩功能,这能够有效地节约带宽,并提⾼响应⾄客户端的速度。

2)语法:gzip

指令含义
gzip on;决定是否开启 gzip 模块,on 代表开启,off 代表关闭
gzip_min_length 1100;设置允许压缩的页面最小字节(从header头的Content-Length中获取) ,当返回内容大于此值时才会使用 gzip 进行压缩,以 K 为单位,当值为 0 时,所有页面都进行压缩。建议大于1k
gzip_buffers 16 8k;设置 gzip 申请内存的大小,其作用是按块大小的倍数申请内存空间。此处指按照原始数据大小以 8k 为单位的 16 倍申请内存
gzip_comp_level 6;设置 gzip 压缩等级,等级越底压缩速度越快,文件压缩比越小,反之速度越慢文件压缩比越大;等级1-9,最小的压缩最快 但是消耗 cpu
gzip_disable “msie6”(IE5.5 和 IE6 SP1使用 msie6 参数来禁止 gzip 压缩 )指定哪些不需要 gzip 压缩的浏览器(将和User-Agents进行匹配),依赖于 PCRE 库
gzip_types text/plain text/css …设置需要压缩的MIME类型,非设置值不进行压缩,即匹配压缩类型
http {
    gzip on;
    gzip_min_length 1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 9;
    gzip_types       text/plain  application/x-javascript  text/css  application/xml  text/javascript  application/x-httpd-php  application/javascript  application/json;
    gzip_disable "msie6";
    gzip_vary on;
}

3.2 server 块

server 块主要负责配置虚拟主机。每个 http 块可以包含多个 server 块,而每个 server 块就相当于一个虚拟主机。

虚拟主机字面意思就是虚拟出来的主机。而这里的主机指的是网站服务器。虚拟主机提供了运行小型网站的基本配置,可以用来直接部署运行小型网站(PHP 网站或静态网站)。虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

server{

}
3.2.1 server 全局块
3.2.1.1 listen

1)作用:配置网络监听

2)语法:listen port 或 listen address:port

listen  80;

listen  192.168.43.100:8000
3.2.1.2 server_name

1)作用:配置虚拟主机的域名或者 IP

2)语法:server_name localhost

server_name  localhost;
3.2.2 location 块

一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

location [ = | ^~ | ~ | ~* ] uri {

}

匹配优先级由高到低为:=、 ^~、 ~、 ~*、 不带任何字符

  • =:用于不含正则表达式的 uri 前,要求请求字符串与 uri 精准匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。所谓继续向下搜索是指继续查找下面的 location。
  • ^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
  • ~:用于表示 uri 包含正则表达式,并且区分大小写
  • ~*:用于表示 uri 包含正则表达式,并且不区分大小写

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

3.2.2.1 root

Web 服务器接收到网络请求之后,首先要在服务器端指定目录中寻找请求资源。在 Nginx 服务器中,指定 root 就是用来配置这个根目录的。

1)作用:配置请求的根路径

2)语法:root path;

path:Nginx 服务器接收到请求以后查找资源的根目录路径。可以为绝对路径,也可以为相对路径(默认为 Nginx 安装位置)

location = /50x.html {
    root   html;
 }
 
location /hello {
    root   /opt;
    index  index.html;
}

以上含义为:

  • 当 Nginx 收到路径为 /50.html 请求时,将访问在 /usr/local/nginx/ 目录(Nginx 安装目录)下的 html/50x.html 资源。
  • 当 Nginx 收到路径为 /hello 请求时,将访问在 /opt/hello/ 目录下的 index.html 资源。
3.2.2.2 alias

与 root 指令作用一样,区别在于:alias 指定的目录是准确的,root 是指定目录的上级目录

1)作用:配置请求的路径

2)语法:alias path;

root 和 alias 的异同点:

  • 共同点:root 和 alias 二者都是用来指定 uri 和 磁盘文件的映射关系。
  • 不同点:root 会将定义路径与 uri 重叠;而 alias 只取定义路径。
location /hello {
    alias   /opt;
    index  index.html;
}

当 Nginx 收到路径为 /hello 请求时,将访问在 /opt/ 目录下的 index.html 资源。

3.2.2.3 return

1)作用:停止处理请求,直接返回响应码或重定向到其他 URL。执行 return 指令后,location 中后续指令将不会被执行。

2)语法:

  • return code [text];
  • return code URL;(主要用于重定向)
  • return URL;(需以 http 或 https 开头的)

常见状态码:

  • 200:请求成功
  • 301:永久转移到其他 URL
  • 404:请求资源不存在
  • 500:内部服务器错误
location /hello {
    alias   /opt/hello;
    index  hello.html;
}

location ^~ /return01 {
    return 200 'request success';
}

location ^~ /return02 {
    return 302 /hello;
}

location ^~ /return03 {
    return http://www.baidu.com;
}
3.2.2.4 proxy_pass

proxy 是代理的意思;pass 是传送的意思;合起来,proxy_pass 是请求转发的意思。

1)作用:该指令用来设置被代理服务器的地址,可以是主机名称、IP地址加端口号等形式。

2)语法:proxy_pass url;

url 为要设置的被代理服务器的地址,包含传输协议、主机名称或 ip 地址加端口号、uri 等要素。传输协议通常是 “http” 或者 “https”。

location ^~ /test/ {
	 proxy_pass http://192.168.43.100:8080/;
	 #以下为解决跨域问题
	 add_header 'Access-Control-Allow-Origin' '*';
	 add_header 'Access-Control-Allow-Credentials' 'true';
	 add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS';
	 add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
}

用浏览器访问 http://192.168.43.100:8888/test/ 即可看到 Tomcat 的界面

六、Nginx 场景实践

1、反向代理

正向代理和反向代理

**正向代理:**正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端。正向代理的情况下,客户端必须要进行一些特殊的设置才能使用。

**反向代理:**反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。对于客户端来说,反向代理就相当于目标服务器,只需要将反向代理当作目标服务器一样发送请求就可以了,并且客户端不需要进行任何设置。

相同点:

正向代理和反向代理所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端。

不同点:

  • 正向代理是客户端的代理,服务器不知道真正的客户端是谁;反向代理是服务器的代理,客户端不知道真正的服务器是谁
  • 正向代理是代理内网,访问外网;反向代理是代理外网,访问内网
  • 正向代理一般是客户端架设的;反向代理一般是服务器架设
  • 正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用。二者都能提高访问速度

Nginx 实现反向代理的主要命令为 proxy_pass

location ^~ /test/ {
	 proxy_pass http://192.168.43.100:8080/;
}

上面的配置即通过 Nginx 服务器透出来的 url 访问 Tomcat ,从而达到代理转发的功能。

2、负载均衡

负载均衡是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。

2.1 upstream 命令

负载均衡主要依赖于 upstream 命令,upstream 块不属于虚拟主机,只能在 http 块里配置,它定义了在反向代理时 Nginx 需要访问的后端服务器集群负载均衡策略

1)作用:代表上游服务器

2)语法:upstream name { server ip:port; … }

upstream 参数:(在 ip:port 后面配置)

  • max_conns:节点的最大连接数
  • slow_start:缓慢启动时间
  • down:节点下线
  • backup:备用节点
  • max_fails:允许的最大失败数
  • fail_timeout:超过最大失败数后的等待时间
server {
	listen 8888;
	server_name localhost;
	location ^~ /test/ {
		#转发原始请求的 host 头部
		proxy_set_header Host $host;
		#转发到upstream块定义的服务器集群
		proxy_pass http://test_balance;
	}
}

#上游服务列表
upstream test_balance {
	server 192.168.43.100:8080;
	server 192.168.43.101:8080;
	server 192.168.43.102:8080;
}

以上是将 Tomcat 放在了三台服务器上面,实际应用大多也是部署在多台服务器上面。

2.2 负载均衡策略

Nginx 负载均衡有 轮询(默认)、权重、ip_hash、url_hash、fair 五种策略,不同的应用场景使用不同的负载均衡策略。

2.2.1 轮询(默认)

轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡策略。

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

适用于后台机器性能一致的情况。

2.2.2 权重

根据权重来分发请求到不同的机器中,指定轮询几率,参数 weight 和 访问比率成正比。

权重越高的服务器实例,分担越大的负载量。所以硬件配置较好的服务器应该设置较高的权重。用于后端服务器性能不均的情况。

#上游服务列表
upstream test_balance {
	#weight配置指定当前服务器实例的权重
	server 192.168.43.100:8080 weight=2;
	server 192.168.43.101:8080 weight=10;
	server 192.168.43.102:8080 weight=5;
}
2.2.3 ip_hash

每个请求按访问 IP 的哈希结果分配,使来自同一个 IP 的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的 session 共享问题。俗称IP绑定。

  • 优势:没有 Session 不一致问题。
  • 局限性:固定服务器实例如果宕机,那么这台服务器上保存的 Session 信息会丢失。
upstream test_balance {
	# 负载均衡策略:ip_hash,固定ip由固定服务器实例处理
    ip_hash;
	server 192.168.43.100:8080;
	server 192.168.43.101:8080;
	server 192.168.43.102:8080;
}
2.2.4 url_hash

按访问的 URL 的哈希结果来分配请求,使每个 URL 定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。

Nginx 本身不支持 url_hash,如果需要这种调度算法,则必须安装 Nginx 的 hash 软件包。

2.2.5 fair

比 weight、ip_hash 更加智能的负载均衡算法,fair 算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。

Nginx 本身不支持 fair,如果需要这种调度算法,则必须安装 upstream_fair 模块。

3、动静分离

Nginx 动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。

严格意义上说应该是动态请求静态请求分开,可以理解成使用 Nginx 处理静态请求,Tomcat 处理动态请求。

  • 动:必须依赖服务器生存的文件 比如 jsp。
  • 静:不需要依赖容器的比如 css/js 或者图片等文件

在 Nginx 的 conf 目录下,有一个 mime.type 文件,里面列出了静态资源的类型,具体如上 http 块配置指令中 mime.type。

动静分离的好处:

  • Nginx 本身就是一个高性能的静态 web 服务器
  • 其实静态文件有一个特点就是基本上变化不大,所以动静分离以后我们可以对静态文件进行缓存、或者压缩提高网站性能

可以通过请求进行分离,也可以通过扩展名进行分离。

准备静态文件:在服务器中准备文件夹放置图片、css、js

mkdir -p /usr/local/nginx/static
  • 通过请求分离
upstream test_static {
	server 192.168.43.100:8080;
    server 192.168.43.101:8080;
    server 192.168.43.102:8080;
}
server {
    listen 8888;
    server_name localhost;
    location / {
        proxy_set_header Host $host;
        proxy_pass http://test_static;
    }
    #http://192.168.43.100:8888/static/css/my.css
    #http://192.168.43.100:8888/static/images/my.jpg
    location /static/ {
    	root static;
    }
}
  • 通过扩展名分离
upstream test_static {
	server 192.168.43.100:8080;
    server 192.168.43.101:8080;
    server 192.168.43.102:8080;
}
server {
    listen 8888;
    server_name localhost;
    location / {
        proxy_pass http://test_static;
        proxy_set_header Host $host;        
    }
    location ~ .*.(jpg | png | gif | css | js)$ {
    	root static;
    }
}

4、跨域问题

当一个请求URL的协议、域名、端口三者之间任意一个与当前页面 url 不同即为跨域。

出现跨域的原因:

出于浏览器的同源策略限制。同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

当前页面 url被请求页面 url是否跨域原因
http://www.test.com/http://www.test.com/index.html同源(协议、域名、端口号相同)
http://www.test.com/https://www.test.com/index.html跨域协议不同(http/https)
http://www.test.com/http://www.baidu.com/跨域主域名不同(test/baidu)
http://www.test.com/http://blog.test.com/跨域子域名不同(www/blog)
http://www.test.com:8080/http://www.test.com:8000/跨域端口号不同(8080/8000)

解决跨域问题只需要在 location 块中加入一下配置:

location ^~ /test/ {
	 proxy_pass http://192.168.43.100:8080/;
	 #以下为解决跨域问题
	 add_header 'Access-Control-Allow-Origin' '*';
	 add_header 'Access-Control-Allow-Credentials' 'true';
	 add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS';
	 add_header 'Access-Control-Allow-Headers' 'Content-Type,*';
}
  • Access-Control-Allow-Origin:表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。
  • Access-Control-Allow-Methods:明确了客户端所要访问的资源允许使用的方法或方法列表。
  • Access-Control-Allow-Headers:设置预检请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx 详解 的相关文章

  • 如何在 nginx.conf 中引用操作系统环境变量

    在 nginx conf 中 设置变量后set name value 我可以像这样参考它 name 但是当我导出操作系统环境变量时 经过env name from env like https nginx org en docs ngx c
  • 站点启用/中不允许使用 nginx“mail”和“stream”指令

    当我尝试在 nginx 中使用流或邮件指令时遇到问题 我正在使用 nginx 1 16 1 和 Ubuntu 18 04 4 LTS 这是我的 nginx conf user www data worker processes auto p
  • 为从 nginx 反向代理转发的请求添加唯一 id

    我们运行 nginx 作为反向代理 将请求转发到运行 Compojure 的 Clojure 应用程序 Compojure 是一个封装 Jetty 的库 为我们的应用程序提供服务 Web 请求的能力 目前 我们捕获 nginx 和 Cloj
  • 如何在 Docker 容器中运行 Nginx 而不停止?

    我在 Docker 容器上安装了 Nginx 并尝试像这样运行它 docker run i t p 80 80 mydockerimage usr sbin nginx 问题是 Nginx 的工作方式是 初始进程立即生成一个 Nginx 主
  • 命名 Docker 卷以共享构建而不更新

    我工作的公司的开发人员要求我用 Docker 做一些不同的事情 然后我也被使用了 目标是拥有 2 个具有以下职责的容器 容器A 节点容器将构建前端 React 应用程序并将捆绑包放入名为的目录中app dist 完成后 容器将停止运行 容器
  • Kong - 验证上游 ssl(ssl_proxy 打开)

    我已经成功为 API 安装了 kong 网关 该 API 通过上游负载平衡到多个目标 应用程序服务器 现在 我有一个我的应用程序服务器的自签名证书 kong 和目标之间的 ssl 握手应该失败 我推断 kong 不验证上游证书 经过一些研究
  • 为什么 nginx 接受 Host 标头与 server_name 不匹配的请求?

    我有一个这样设置的站点 nginx 作为代理服务器 通过 UNIX 套接字代理为 Django 站点提供服务的 Gunicorn 实例的请求 这是我的 nginx 配置 server listen 80 server name api my
  • 在“git pull”我的 Django 项目后重新启动/重新加载 Gunicorn(通过 Upstart)的更好方法

    我正在寻找比sudo restart projectname每次我发出git pull origin master 它会下载我对 Django 项目的最新更改 这restart我相信该命令与 Upstart 有关 我用它来启动 停止我的 G
  • Nginx反向代理(proxy_pass)不传递子文件夹

    我想在子文件夹配置中运行应用程序 Mattermost 例如 https www example com mattermost https www example com mattermost location mattermost gzi
  • `uwsgi_modifier1 30` 指令没有按照记录从 PATH_INFO 中删除 SCRIPT_NAME

    这是我的 nginx 虚拟主机配置 debian cat etc nginx sites enabled mybox server listen 8080 root www index index html index htm server
  • nginx - 记录 SSL 握手失败

    我正在运行启用了 SSL 的 nginx 服务器 我的协议 密码设置相当安全 我已经在 ssllabs com 上检查过它们 但是 因为这是一个由我无法控制的 http 客户端调用的 Web 服务 所以我担心兼容性 重点是 有没有办法在我的
  • kubernetes 集群中 django 应用程序的 Nginx 配置

    我在为部署在 kubernetes 中的 django 应用程序创建 nginx 配置文件时遇到困难 Nginx 和 app 是同一集群中的两个独立容器 据我了解 容器可以通过 127 0 0 1 XX 和主机名相互通信 我为此使用 min
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h
  • 使用 Nginx 或 Apache 来提供动态内容? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在运行 NGINX Docker 容器的 AWS EC2 上启用 HTTPS?

    我在 AWS 上有一个运行 Amazon Linux 2 的 EC2 实例 在上面 我安装了 Git docker 和 docker compose 完成后 我克隆了我的存储库并运行docker compose up让我的生产环境启动 我访
  • Django + uwsgi + ngnix + 调试关闭 = 服务器错误(500)

    我正在尝试设置一个由 Django uwsgi Nginx 组成的生产服务器 我正在关注的教程位于此处http www panta info blog 3 how to install and configure nginx uwsgi a
  • Http POST 删除 URL 中的端口

    我有一个用 Django 构建的网络应用程序 我目前正在家里的路由器后面的笔记本电脑上运行它 我将路由器配置为将发送到特定端口的所有流量路由到该笔记本电脑 我将 Nginx 作为 Apache 的反向代理 使用 mod wsgi 来运行 D
  • NGINX 上的 SSL 终止

    我已经购买了 SSL 证书 并在验证模数时正确地将其捆绑在一起 即https kb wisc edu middleware 4064 https kb wisc edu middleware 4064 那么哈希值是相同的 我已将证书和密钥移
  • 抑制 nginx 访问被拒绝错误日志

    我在 nginx 中设置了一些规则来拒绝 IP 访问 这很有效 但对于来自被拒绝 IP 的每个请求 都会记录以下开头的错误 error 7325 0 5761 access forbidden by rule client 有没有办法抑制这
  • Nginx merge_slashes 重定向

    我在我的 Java 应用程序中使用 nginx 我的问题是 nginx 正在合并斜杠 我无法将我的网站重定向到正确的版本 例如 http goout cz cs koncerty praha 被合并到 http goout cz cs ko

随机推荐

  • 多表的查询

    目录 一 为什么需要多表查询 xff1f x1f41f 查询一个员工名为 Abel 的人在哪个城市工作 xff1f 二 如何实现多表查询 1 出现笛卡尔积 xff08 交叉连接 xff09 的错误 错误的实现方式 错误的原因 2 多表查询的
  • MySQL数据类型

    目录 一 MySQL中的数据类型 常见数据类型的属性 关于属性 1 创建数据库时指明字符集 2 创建表的时候 xff0c 指明表的字符集 3 创建表 xff0c 指明表中的字段时 xff0c 可以指定字段的字符集 二 整数类型 xff08
  • 批量插入

    目录 一 批量插入数据 JDBC的批量处理语句的方法 二 高效的批量插入 1 举例 xff1a 向goods表中插入20000条数据 goods表的创建 方式一 xff1a 使用Statement 方式二 xff1a 使用PreparedS
  • Gateway新一代网关

    目录 一 概述 1 官网 2 介绍 3 作用 4 微服务架构中网关的位置 5 有Zuul了怎么又出来了gateway 我们为什么选择Gateway xff1f Zuul1 x模型 x1f41f Servlet的生命周期 gateway模型
  • android tensorflow文字识别身份证识别ocr文字识别商用源码

    一 xff0c 文字识别简介 计算机文字识别 xff0c 俗称光学字符识别 xff0c 英文全称是Optical Character Recognition 简称OCR xff0c 它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来
  • idea报错:无法访问org.springframework.web.bind.annotation.RestController和程序包com.sun.org.slf4j.internal不存在

    目录 1 错误具体信息 报错日志 2 原因 3 修改过程 4 程序包com sun org slf4j internal不存在 o 解决 1 错误具体信息 报错日志 INFO INFO maven compiler plugin 3 10
  • Java基础 —— 编程入门

    一 比特 bit 和字节 byte 一个0或者一个1存储为一个比特 bit xff0c 是计算机中最小的存储单位 计算机中是最基本的存储单元是字节 byte 每个字节由8个比特构成 计算机就是一系列的电路开关 每个开关存在两种状态 关 of
  • JDK、JRE、JVM的关系

    参考文章 xff1a 面试官 xff1a JDK JRE JVM 三者什么关系 xff1f 腾讯云开发者社区 腾讯云 tencent com 一 什么是JDK JDK xff1a Java Development Kit的简称 xff0c
  • 问题解决:Mybatis-Plus自增主键超级大!

    1 先瞅瞅是不是自增主键没加注解 xff1f xff08 加了哇 xff0c 没问题哇 xff0c 怎么还那么大呢 xff09 2 奥对 xff0c 看看是不是包导错了 似乎也没问题 再添几条数据试试 xff0c id越来越大 突然想到 x
  • FTP匿名登录

    介绍 从一个服务到另一个服务的目标 凭据可能会丢失在可公开访问的文件夹中的某个位置 xff0c 这将允许我们通过一个远程shell登录 xff0c 该shell不受监控 配置错误的服务可能会泄露信息 xff0c 使我们能够模拟受害者的数字身
  • Unable to start ServletWebServerApplicationContext due to missing ServletWeb解决办法

    当在springboot启动项目的时候报这种错误 xff1a 仔细一看 xff0c 报错原因是因为缺少ServletWebServerFactory的bean 既然是跟Servlet有关 xff0c 那么很可能是在web层面出现了问题 那么
  • 数据库锁概述

    行锁和表锁 主要是针对锁粒度划分的 xff0c 一般分为行锁 表锁 库锁 行锁 xff1a 访问数据库的时候 xff0c 锁定整个行数据 xff0c 防止并发错误 表锁 xff1a 访问数据库的时候 xff0c 锁定整个表数据 xff0c
  • Spring 常用注解

    Spring 常用注解 64 Component xff08 任何层 xff09 64 Controller 64 Service 64 Repository xff08 dao xff09 xff1a 用于实例化对象 64 Autowir
  • MyBatis 传递多个参数的4种方式

    MyBatis 传递多个参数的4种方式 方式1 xff1a 顺序传参 xff08 不推荐 xff09 span class token class name Employee span span class token function s
  • Java中String类的常用方法

    文章目录 Java 中 String 类的常用方法一 String 类的概念二 常用的构造方法三 常用方法1 toString 2 length 3 getBytes 4 toCharArray 5 charAt int index 6 i
  • ASR项目实战-数据

    使用机器学习方法来训练模型 xff0c 使用训练得到的模型来预测语音数据 xff0c 进而得到识别的结果文本 xff0c 这是实现语音识别产品的一般思路 本文着重介绍通用语音识别产品对于数据的诉求 对数据的要求 训练集 相关要求 xff0c
  • 如何写一棵简单的二叉查找树

    二叉查找树 完整代码 xff1a https github com problemin Algorithm blob master src Tree BSTree java 二叉排序树 xff08 Binary Sort Tree xff0
  • Redis常见的数据类型命令

    文章目录 Redis 常见的数据类型及命令一 常见的NoSQL二 Redis 简介三 key 键的一些操作命令四 Redis的五种基本数据结构1 String xff08 字符串 xff09 介绍常用命令1 1 set get1 2 app
  • Redis 的主从复制机制

    文章目录 Redis 的主从复制机制主从复制概述主从复制的作用主从复制环境的搭建主从复制的原理 哨兵模式概述哨兵模式的作用哨兵模式环境的搭建哨兵模式的原理 Cluster 模式 Redis 的主从复制机制 主从复制 概述 主从复制 xff0
  • Nginx 详解

    文章目录 Nginx 详解一 简介二 四大应用场景1 HTTP 服务器2 反向代理3 负载均衡4 动静分离 三 Linux 环境下安装Nginx四 Nginx 服务常用命令五 Nginx 配置文件1 全局块1 1 user1 2 worke