一、Nginx 基本概念

Nginx 简介

Nginx 是主流的、高性能的 HTTP 服务器和反向代理 web 服务器,占有内存少,并发能力强。可以用于挂载网站、请求转发、负载均衡、网关路由等。

正向代理

正向代理和反向代理的优质文章:

博客园:正向代理与反向代理【总结】

知乎

正向代理是客户端的代理,客户端通过配置正向代理服务器,使用正向代理获取目标服务器的资源。

正向代理的作用:

  • 访问原来无法访问的资源
  • 可以做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证
  • 代理可以记录用户访问记录,对外隐藏用户信息

反向代理

反向代理是服务端的代理,反向代理对外透明,访问者不知道自己访问的是一个代理。

反向代理的作用:

  • 保证内网安全,防止 web 攻击
  • 负载均衡

负载均衡

负载均衡,见名知义,就是将请求分发到多台服务器上,将之前的集中式改为分布式,从而将负载分发到不同服务器上,使负载均衡。

动静分离

动态资源和静态资源由不同的服务器解析,加快解析速度,降低单个服务器的压力。

二、Nginx 安装

Linux 环境下安装:

  1. 安装依赖包

    1
    yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
  2. 下载并安装 Nginx

    1
    2
    3
    4
    5
    6
    cd /usr/local
    wget wget http://nginx.org/download/nginx-1.16.1.tar.gz
    tar -zxvf nginx-1.16.1.tar.gz
    cd nginx-1.16.1
    ./configure
    make && make install
  3. 启动 Nginx

    1
    2
    cd /usr/local/nginx/sbin
    ./nginx
  4. 开放 80 端口,重启防火墙

    1
    2
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    firewall-cmd --reload
  5. 访问:http://你的Linux主机ip:80,出现 Welcome 就成功咯

三、常用命令和配置文件

常用命令

使用 Nginx 命令的前提是进入到 /usr/local/nginx/sbin 目录

1
2
3
4
./nginx # 启动
./nginx -s stop # 停止
./nginx -s reload # 重新加载
./nginx -v # 查看版本

配置文件

Nginx 配置文件位置:/usr/local/nginx/conf/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#user  nobody;
worker_processes 1;

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

#pid logs/nginx.pid;

events {
worker_connections 1024;
}

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;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

第一部分:全局块

events 块之前的内容,主要设置一些 nginx 服务器整体运行的配置指令。

例如:

1
worker_processes  1;

这是并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是
会受到硬件、软件等设备的制约。

第二部分:events 块

events 块中的指令主要影响 nginx 服务器与用户的网络连接。

例如:

1
2
3
events {
worker_connections 1024; # 支持的最大连接数
}

第三部分:http 块

http 块是配置最频繁的部分,代理、缓存、日志定义等大部分功能都在 http 块中。

http 块包括:http 全局块和 server 块

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

② server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了
节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,每个 server 块就相当于一个虚拟主机。

一个 server 块包含全局 server 块、多个 location 块。

  • 全局 server 块
    最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
  • location 块
    这块的主要作用是基于 Nginx 服务器接收到的请求字符串,对虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

location 指令说明

location 指令用来匹配 URL。

语法:location [ = | ~ | ~* | ^~ ] uri {...}

参数 说明
无参 前缀匹配
= 精确匹配
~ 正则匹配,区分大小写
~* 正则匹配,不区分大小写
^~ 前缀匹配,表示 URI 以某个常规字符串开头

匹配顺序:

  1. 精确匹配 =
  2. 前缀匹配 ^~
  3. 配置文件中的正则匹配 ~ | ~*
  4. 前缀匹配 无参
  5. 通用匹配 /

四、Nginx 的应用

反向代理

上边介绍了反向代理,请求访问资源时,实际上经过了反向代理服务器,nginx 会根据配置将特定的请求转发到对应的服务器。

例如:我们访问 Nginx localhost:80,会代理到 Tomcat localhost:8080 页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 反向代理配置
upstream servers {
server localhost:8080;
}

server {
listen 80;
server_name localhost;

location / {
root html;
proxy_pass http://servers;
index index.html index.htm;
}
}

负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
}

server {
listen 80;
server_name your_domain.com;

location / {
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}

在这个配置中,我们创建了一个名为 backend 的上游服务器组,其中包含了两个后端服务器。然后,我们定义了一个HTTP服务器块,监听端口80,并且指定了服务器名。在 location / 块内,我们使用了 proxy_pass 指令将请求转发给上游服务器组。此外,还设置了一些 HTTP 头部,以确保后端服务器正确地获取客户端的真实 IP 地址和协议。

你可以根据自己的需求调整这个配置,比如更改负载均衡策略、添加健康检查等。完成配置后,通过测试来验证配置的正确性,并通过 nginx -t 命令来检查 Nginx 配置文件的语法错误。最后,使用 sudo systemctl restart nginx 重启NGINX以使配置生效。