原文链接:https://www.haicheng.website/...
简介
Nginx是一款轻量级的Web服务器和反向代理服务器及电子邮箱代理服务器。Nginx主要提供反向代理、负载均衡、动静分离等服务。
安装Nginx
- 从镜像网站选择合适的Nginx版本并复制其地址,在服务器端使用
wget
命令下载
wget https://mirrors.huaweicloud.com/nginx/nginx-1.16.1.tar.gz
- 解压压缩文件
tar -zxvf nginx-1.16.1.tar.gz
- 安装必要的依赖
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel -y
- 配置
# 进入nginx-1.16.1目录,并分别执行
./configure
make & make install
- 进入
/usr/local/nginx/sbin
目录执行启动服务器
./nginx
- 如果使用的是云服务器需要开启服务器自身的端口(Nginx默认80端口)和安全组策略
# 开启防火墙
systemctl start firewalld
# 开放80端口
firewall-cmd --add-port=80/tcp --permanent
# 重新加载配置
firewall-cmd --reload
# 查看已开放的端口
firewall-cmd --list-ports
- 检查进程并查看页面,至此Nginx已经安装成功
正向代理与反向代理
- 正向代理
手动配置代理服务器IP和端口,客户端请求代理服务器,再由代理服务器代替客户端访问Web服务器;
- 反向代理
客户端访问代理服务器,再由代理服务器根据策略访问具体的Web服务器;
- 总结
正向代理服务于客户端,此时Web服务器无法获取客户端信息
反向代理服务于服务器端,此时客户端无法获取Web服务器的真实信息
配置Nginx
Nginx的配置文件是/usr/local/nginx/conf
目录下的nginx.conf
。配置文件由三部分组成
- 全局块
从文件开始到至events之间就是全局块,这里定义了工作进程的数量,错误日志及项目pid的保存路径。Nginx有一个主进程(master process)和几个工作进程(worker process)。主进程主要用于读取配置文件和评估配置,以及维护工作流程;工作进程主要用于处理请求。配置文件中的worker_processes表示工作进程数量,一般配置为CPU核心数。
- events块
events主要影响Nginx与用户的网络连接,worker_connections表示每个worker进程支持的最大连接数
- http块
Nginx最重要的的配置区域,负载均衡,请求代理都在此配置。http块由多个server块组成。
http {
# 用于配置文件拆分
include mime.types;
# 默认响应类型
default_type application/octet-stream;
server {
# 监听端口
listen 80;
# 虚拟主机名称
server_name localhost;
location / {
....
}
}
}
加载配置文件
在
/usr/local/nginx/sbin
目录下进行配置文件的验证,重新加载
- 验证配置文件是否正确
./nginx -t
- 重新加载配置文件
./nginx -s reload
- 关闭nginx(立即关闭)
./nginx -s stop
- 优雅的关闭nginx(等待工作进程完成当前请求后,再关闭nginx)
./nginx -s quit
实例
静态文件缓存
对于项目开发中涉及到的图片、视频和文件等内容,可以使用Nginx完成文件的下载和引用。日常开发中,有些资源需要保存方便后期使用,那么可以搭建一个基于Nginx的文件下载服务器。
- 在服务器创建保存文件的目录
- 配置Nginx
location /download {
# 静态文件保存路径
alias /tmp/download;
# 开启索引功能
autoindex on;
# 显示文件大小(kb,mb,gb)
autoindex_exact_size off;
# 显示本机时间而非GMT时间
autoindex_localtime on;
# utf-8防止中文文件名的乱码
charset utf-8;
}
- 访问
http://ip/download
就可以看到创建的文件夹,受限于服务器的配置,文件下载速度最大在600上下。这里是我自己的一个下载站,保存了常用的软件。 在之前的配置中使用了
root
,现在又使用了alias
,两者的区别如下:root:root会追加location中的路径到url后面;例如:
location /download { root /tmp/file; }
用户访问http://192.168.1.1/download,但Nginx访问的文件路径是:/tmp/file/download
alias:只映射配置的路径,不做任何调整
location /download { alias /tmp/file; }
用户访问http://192.168.1.1/download,Nginx访问的文件路径是:/tmp/file
请求转发
对于后端接口,常通过在url添加后缀代理至真实的项目。例如:在服务器端启动Tomcat后,因为某种原因无法开放8080端口,可以使用如下配置:
# 访问地址:http://127.0.0.1就会跳转tomcat界面
server {
listen 80;
server_name localhost;
location / {
# 将80端口的请求代理至8080端口
proxy_pass http://localhost:8080/;
}
}
# 访问地址:http://127.0.0.1/tomcat就会跳转tomcat界面
server {
listen 80;
server_name localhost;
location /tomcat {
# 将80端口的请求代理至8080端口
proxy_pass http://localhost:8080/;
}
}
负载均衡
基于Nginx的负载均衡属于软负载。在多个应用实例前部署负载均衡组件是会优化资源利用率,最大化吞吐量,减少延迟和确保容错配置;Nginx目前支持的负载均衡算法是:轮询(round-robin)、最少连接(least-connected)、权重(Weighted )、ip-hash。在服务器端部署三个实例,通过设置不同的负载均衡算法,显示相应的内容;接口如下所示:
@GetMapping(value = "/get")
public String get() {
// 第一个 第二个 第三个
return "第一个";
}
轮询(默认负载均衡算法)
通过如下配置,请求被均分到8081、8082、8083端口所至的服务
http {
...
upstream tomcat {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
server {
...
location / {
root /get;
proxy_pass http://tomcat/;
}
...
}
}
浏览器依次显示:
最小连接
根据服务器当前的连接情况进行负载均衡的,当请求到来时,会选取当前连接数最少的一台服务器来处理请求
http {
...
upstream tomcat {
leasst_conn;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
server {
...
location / {
root /get;
proxy_pass http://tomcat/;
}
...
}
}
权重
通过给每个实例配置权重,实现请求访问倾斜
http {
...
upstream tomcat {
server 127.0.0.1:8081 weight=4;
server 127.0.0.1:8082 weight=2;
server 127.0.0.1:8083;
}
server {
...
location / {
root /get;
proxy_pass http://tomcat/;
}
...
}
}
访问页面,“第一个”出现的频率明显多于“第二个”和“第三个”
ip_hash
通过客户端的IP地址决定访问那个实例
http {
...
upstream tomcat {
ip_hash;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
server {
...
location / {
root /get;
proxy_pass http://tomcat/;
}
...
}
}
配置后,我此时的IP只能访问第一个实例,页面返回”第一个“