引言

Nginx是一款高性能的开源Web服务器和反向代理服务器,广泛应用于现代应用程序的部署和负载均衡。它具有轻量级、高并发和低内存消耗的特点,能够处理大量的并发连接和高流量的网络请求。

本博文将介绍Linux下Nginx的安装和卸载方法,以美西VPS(Ubuntu 22.04)为例,并重点探讨如何配置Nginx作为反向代理服务器。

Nginx的安装与卸载

安装

  1. 更新软件包列表

    1
    sudo apt update
  2. 安装Nginx

    1
    sudo apt install nginx
  3. 验证安装

    1
    nginx -v

    如果安装成功,将显示Nginx的版本信息。

卸载

  1. 卸载Nginx

    1
    sudo apt remove nginx
  2. 清理残留文件

    1
    sudo apt autoremove

反向代理的配置

什么是反向代理

反向代理是一种服务器架构模式,它充当位于客户端和目标服务器之间的中间层。当客户端发送请求时,反向代理服务器接收请求并将其转发到后端的目标服务器。然后,代理服务器将响应从目标服务器返回给客户端。通过这种方式,反向代理隐藏了后端服务器的真实身份和位置,为客户端提供了更高的安全性、负载均衡和缓存等功能。

配置Nginx作为反向代理服务器

下面是配置Nginx作为反向代理服务器的步骤:

方法一

Nginx的主要配置文件是 nginx.conf,通常位于 /etc/nginx/ 目录下。通过编辑此文件,我们可以进行各种配置。

1
sudo nano /etc/nginx/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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
worker_connections 768;
# multi_accept on;
}

http {

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip on;

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;


}

#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}

在Nginx的配置文件中,eventshttpmail是三个不同的块,用于配置不同的功能和模块。下面是对这些块的解释:

  1. events

events块用于配置Nginx的事件处理机制。它定义了与客户端的连接和网络事件相关的参数,如并发连接数、连接超时等。在这个块中,您可以设置以下参数:

  • worker_connections:指定每个worker进程可同时处理的连接数。
  • multi_accept:允许一个worker进程同时接受多个连接。
  • 其他与事件相关的参数。

例如,在示例配置中,events块中设置了worker_connections参数为768,表示每个worker进程可以同时处理768个连接。

  1. http

http块是Nginx配置文件中最常见的块,用于配置HTTP服务器和相关功能。它包含了与HTTP请求、响应和代理等相关的配置指令。在这个块中,您可以设置以下内容:

  • 基本设置:如sendfiletcp_nopushtypes_hash_max_size等。
  • SSL/TLS设置:如ssl_protocolsssl_prefer_server_ciphers等。
  • 日志设置:如access_logerror_log等。
  • Gzip设置:如启用或禁用gzip压缩。
  • 虚拟主机配置:使用server块来定义不同的虚拟主机。

在示例配置中,http块包含了基本设置、SSL设置、日志设置和Gzip设置,并通过include指令包含了额外的配置文件和虚拟主机配置。

  1. mail

mail块是用于配置Nginx作为邮件代理服务器的功能。它定义了与POP3和IMAP协议相关的配置指令。在这个块中,您可以设置代理服务器的监听端口和协议,以及与认证和代理相关的配置。

在示例配置中,mail块被注释掉了,因此在此示例中并不会实际使用邮件代理功能。

请注意,http块是最常见和常用的块,用于配置Nginx作为HTTP服务器和反向代理服务器。events块和mail块是可选的,根据您的需求和使用场景进行配置。

http块内部,可以添加多个server块来定义不同的虚拟主机。每个server块可以针对特定的域名、IP地址或端口进行配置。

一般来说,server块的添加位置可以在http块中的任何位置,只要它在文件中的唯一位置即可。通常,建议将默认的server块放在http块的开头,以处理未匹配到其他虚拟主机的请求。然后,可以根据需要添加其他server块来处理其他域名或IP地址的请求。

因此,如果要在nginx.conf文件中加入新的server块,建议加入到http块的最后面,即include部分的后面,因为include部分调用了默认server块。

下面是一个示例,展示了http块中的位置以及如何添加多个server块:

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
http {
# Basic Settings

# SSL Settings

# Logging Settings

# Gzip Settings

server {
listen <监听端口>;
server_name <域名或IP地址>;

# 配置指令和内容
}

server {
listen 443 ssl;
server_name <域名或IP地址>;

ssl_certificate <SSL证书文件路径>;
ssl_certificate_key <SSL私钥文件路径>;
}
# 其他server块...

}

server块的主要组成部分包括:

  1. listen指令:

    listen指令用于指定Nginx服务器监听的端口。可以是一个具体的端口号(如80),也可以是IP地址加端口号(如192.168.0.1:8080)。还可以使用特殊的监听地址,如default_server用于指定默认的虚拟主机。

  2. server_name指令:

    server_name指令用于指定虚拟主机所对应的域名或IP地址。可以使用具体的域名(如example.com)或使用通配符(如*.example.com)来匹配多个域名。

  3. 配置指令和内容:

    server块中,可以设置各种配置指令和内容来定义特定虚拟主机的行为。这些指令可以包括但不限于:

    • root:指定虚拟主机的根目录。
    • index:指定默认的索引文件。
    • location:用于定义请求路径的处理规则。
    • SSL/TLS配置:如ssl_certificatessl_certificate_key等用于启用HTTPS的指令。

以下是一个示例,展示了server块的基本格式和一些常见的配置指令

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
server {
listen 80;
server_name a.example.com;

root /var/www/a.example.com;
index index.html;

location / {
# 处理根路径的请求
}

location /images {
# 处理/images路径的请求
}

# 其他配置指令和内容...
}

server {
listen 443 ssl;
server_name b.example.com;

ssl_certificate <SSL证书文件路径>;
ssl_certificate_key <SSL私钥文件路径>;

root /var/www/b.example.com;
index index.html;

location / {
# 处理根路径的请求
}
# 其他配置指令和内容...
}

在上述示例中,第一个server块定义了一个虚拟主机,监听80端口,即通过http访问,对应的域名是http://a.example.com。根目录为/var/www/a.example.com,默认索引文件为index.html。此外,使用location块定义了对根路径和/images路径的请求处理规则。

第二个server块定义了一个虚拟主机,监听443端口,即通过https访问,对应的域名是https://b.example.com。根目录为/var/www/b.example.com,默认索引文件为index.html。此外,使用location块定义了对根路径和/images路径的请求处理规则。

请注意,可以在同一个Nginx配置文件中定义多个server块,以配置多个虚拟主机或监听多个端口。每个server块表示一个独立的虚拟主机配置。根据需要,可以根据域名、IP地址或端口来定义多个server块。

在完成配置文件的编辑后,需要重载Nginx配置以使更改生效。

  1. 检查Nginx配置文件是否正确,若提示successful,则证明配置没问题。
1
sudo nginx -t
  1. 如果配置文件没有错误,重新加载Nginx配置
1
sudo systemctl reload nginx

或者,使用以下命令(适用于非systemd系统)

1
sudo service nginx reload
  1. 验证反向代理

访问代理服务器的域名或IP地址,验证是否能够成功访问到,能访问到证明nginx反代成功

方法二

server块不写入到nginx.conf文件中,而是在nginx文件目录下的sites-available文件夹中新建.conf文件,并写入对应的server块。

  1. sites-available文件夹中创建一个新的配置文件,例如my-proxy.conf,可以使用任何你喜欢的名称,但要确保文件扩展名是.conf

  2. 使用文本编辑器打开新创建的配置文件,并添加反向代理的配置信息。以下是一个示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    server {
    listen 80;
    server_name example.com;

    location / {
    proxy_pass http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

    在上述示例中,配置了一个基本的反向代理。当访问example.com时,请求将被代理到backend_server

    请根据实际情况修改以下内容:

    • listen:指定Nginx监听的端口,可以是80或443等。
    • server_name:指定要进行反向代理的域名。
    • proxy_pass:指定后端服务器的地址,可以是IP地址或域名。
    • proxy_set_header:设置代理请求的头信息,如Host、X-Real-IP和X-Forwarded-For等。这些设置可根据需要进行调整。
  3. 保存并关闭配置文件。

创建一个符号链接,将配置文件链接到sites-enabled文件夹中。可以使用ln -s命令来创建符号链接。

1
ln -s /etc/nginx/sites-available/my-proxy.conf /etc/nginx/sites-enabled/

创建符号链接后,sites-enabled文件夹就会出现my-proxy.conf文件,如果sites-available文件夹中的proxy.conf的内容发生改变,sites-enabled就会同步发生改变。

  1. 确保新添加的配置文件没有语法错误,可以使用以下命令检查Nginx配置文件是否有效
1
nginx -t
  1. 如果配置文件有效,则重新加载Nginx配置,使更改生效
1
nginx -s reload