Nginx 详解

文章目录

  • 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 详解_第1张图片

一、简介

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:设置预检请求。

你可能感兴趣的:(Nginx,nginx,服务器,运维)