文章目录
一、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 会按指定顺序查找文件并返回它找到的第一个文件
}
......
}