文章目录
- 一、Nginx 介绍
- 1.1 反向代理
- 1.2 负载均衡
- 1.3 动静分离
- 二、安装 Nginx (Ubuntu 20.04下)
- 三、Nginx 常用命令
- 四、Nginx 配置简介
- 五、配置反向代理
- 5.1 简单的反向代理
- 5.2 根据请求路径转发到不同的服务器
- 六、配置负载均衡
- 七、配置动静分离
一、Nginx 介绍
Nginx 是一个开源、快速、轻量级和高性能的 web 服务器,可直接作为静态网页服务器使用。它是用 c 语言实现的,内存占用少,启动极快,高并发能力强,官方数据测试表明它能够支持高达50000个并发连接数。是目前最流行的 web 服务器。
除了 web 服务,它还提供了其他一些功能,比如:
1.1 反向代理
- 正向代理:
正向代理是代理服务器代替客户端去访问所有其他服务器,并将响应返回。
例子不举了,改来改去还是通不过审核😾 - 反向代理:
而反向代理恰恰相反,它代理的是服务端。我们以访问百度为例。
百度的服务器肯定不止一台,但是我们访问时,永远只需要访问baidu.com
。这是因为我们实际上访问的是百度的反向代理服务器,反向代理服务器收到请求后,将请求发送给真正的百度服务器中的其中一台,并将服务器的响应返回给客户端。
反向代理是反向代理服务器替代服务端去接收客户端发来的请求,并将响应返回。
1.2 负载均衡
上面说过,通过反向代理可以将请求发送到多台服务器的其中一个上。这样做的目的就是避免大量请求进入时,某一台服务器的压力过大而崩溃。而这种做法被称为负载均衡。
Nginx 有很多种请求分配方法,我们看看常用的几个:
- 轮询:
按照请求进入的顺序,每台服务器轮流分配一个请求。 - 加权轮询:
在轮询基础上,给性能强一些的服务器增加权重,让其处理更多的请求。 - 最少连接数:
将下一个请求分配到连接数最少的那台服务器上。 - Ip_hash:
上面的几种会造成一个问题:客户端在 A 服务器上登陆, session 也被保存在 A 上,可下一次客户端请求可就不一定会被分配到 A 上,这显然会使客户端的登陆状态丢失。
解决方法就是使用 Ip_hsah,每个请求按访问 IP 的 hash 结果分配,这样每个 IP 固定访问一个后端服务器,解决了 session 的问题。
当然,在实际开发中,更加靠谱的还是使用 redis 做 session 共享。
1.3 动静分离
动静分离就是将静态文件html、css、js、jpg等)和动态文件(后台应用)区分开来处理,以提高用户访问静态文件的速度,降低对后台应用的访问,提高服务器响应速度和性能。
Nginx 作为静态文件服务器,给静态文件提供服务。就免去了应用服务器对静态文件请求的处理,降低了应用服务器的压力。
二、安装 Nginx (Ubuntu 20.04下)
- 安装必备组件:
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
- 导入官方的 nginx 签名密钥:
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
- 验证密钥:
gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
正常输出如下:
pub rsa2048 2011-08-19 [SC] [有效至:2024-06-14]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>
- 设置 apt 存储库(稳定版):
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
- 设置存储库固定,以优先选择官方包而不是 Ubuntu 提供的包:
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
- 安装:
sudo apt update
sudo apt install nginx
- 验证安装:打开 http://127.0.0.1:80,看到 nginx 就说明安装成功。
三、Nginx 常用命令
- 启动 Nginx:
sudo nginx # apt 安装,会自动启动
- 显示 nginx 的版本,编译器版本和配置参数:
nginx -V
- 快速退出:
sudo nginx -s stop
- 安全退出:
sudo nginx -s quit
- 检查配置文件:
sudo nginx -t -c /etc/nginx/nginx.conf
- 重新加载配置文件:
sudo nginx -s reload
通常,还要对防火墙进行操作,如开放端口等。但这不属于 Nginx 的范围,所以这里就不讲了。
四、Nginx 配置简介
nginx 的配置文件位置为:/etc/nginx/nginx.conf,配置文件以一对大括号{}
来表示一个部分,主要分为4块:
- 全局块,即 events 上面的部分,没有被大括号包裹:
user nginx; # nginx 进程的所属用户
worker_processes auto; # 工作进程数
error_log /var/log/nginx/error.log notice; # 错误日志路径及级别
pid /var/run/nginx.pid; # Nginx 服务启动的pid
- Event 块:
events { # nginx 工作模式的配置
worker_connections 1024; # 每个工作进程支持的最大连接数
}
- HTTP 块:
http {
include /etc/nginx/mime.types; # mime 类型定义
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 /var/log/nginx/access.log main; # 访问日志
sendfile on; # 优化静态资源
#tcp_nopush on; # nginx 不要缓存数据,而是一段一段发送
keepalive_timeout 65; # 给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。
#gzip on; # 压缩
include /etc/nginx/conf.d/*.conf; # 要包含的其他配置文件的路径,如下面的 default.conf
# 负载均衡相关配置,默认是没有的,需要我们自己添加
# upstream 任意名称{
# server 127.0.0.1:8000;
# }
}
- 通常,还有一个 server 块,单独保存在:/etc/nginx/conf.d/default.conf 中:
server {
listen 80; # 监听端口
server_name localhost; # 提供服务的域名或主机名
#access_log /var/log/nginx/host.access.log main;
location / { # 控制网站访问路径
root /usr/share/nginx/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; # 配置错误页
= /50x.html { # 错误代码重定向到新的 location
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
注意!不要直接修改配置文件,应该先做好原配置文件的备份。
五、配置反向代理
5.1 简单的反向代理
比如,当我们访问127.0.0.1:888
时,自动跳转到 python 的官网https://www.python.org/。
server {
listen 888;
server_name 127.0.0.1;
location / {
proxy_pass https://www.python.org/; # 增加请求转发路径
}
}
5.2 根据请求路径转发到不同的服务器
比如:
- 访问
127.0.0.1:888/AAA/
时,自动跳转到 AAA 服务器。 - 访问
127.0.0.1:888/BBB/
时,自动跳转到 BBB 服务器。
server {
listen 888;
server_name 127.0.0.1;
location ~/AAA/ { # ~ 表示 URI 包含正则表达式
proxy_pass AAA 的ip地址和端口;
}
# 增加一个 location
location ~/BBB/ {
proxy_pass BBB 的ip地址和端口; # 地址不能带路径,末尾的 / 也不行
}
......
}
说明:
~
:表示 URI 包含正则表达式,并区分大小写。~*
:表示 URI 包含正则表达式,不区分大小写。=
:表示 URI 不包含正则表达式,要求路径与 URI 严格匹配。^~
:表示 URI 不包含正则表达式, 如果匹配到普通的 location,就不再去匹配包含正则表达式的 location。
六、配置负载均衡
http {
......
upstream 任意名称{
请求分配方法;
server 服务器1的地址;
server 服务器2的地址;
......
}
......
}
server {
......
location / {
proxy_pass upstream 的名称;
}
......
}
请求分配方法:
- 轮询:是默认的,不写策略用的就是轮询。
- 加权轮询:
upstream 任意名称{
server 服务器1的地址;
server 服务器2的地址 weight=100;
......
}
权重越重,分配到的请求就越多。
- 最少连接数:
upstream 任意名称{
last_conn;
server 服务器1的地址;
server 服务器2的地址;
......
}
- ip_hash:
upstream 任意名称{
ip_hash;
server 服务器1的地址;
server 服务器2的地址;
......
}
七、配置动静分离
server {
......
location /访问路径/ {
root 存放静态文件目录的路径;
autoindex on; # 对目录进行索引,展示目录下有什么内容
index 文件名1 文件名2 ...... # NGINX 会按指定顺序查找文件并返回它找到的第一个文件
}
......
}