目录
1. Nginx简介
Nginx(发音同engine x)是一个异步框架的 Web 服务器,也可以用作反向代理,负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。Nginx 是一款免费的开源软件,根据类 BSD 许可证的条款发布。一大部分Web服务器使用 Nginx ,通常作为负载均衡器。
如果嫌英文看不懂,这边推荐一下W3Schools的教程,W3Schools教程。
2.Nginx安装
前提需要先安装yum依赖
bash
yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
你可以进入nginx官网,右键复制链接选择不同版本,然后见下方代码,将链接放到wget后面。
bash
cd /opt 进入根目录下的 opt 目录
wget http://nginx.org/download/nginx-1.16.1.tar.gz 下载tar包
tar -zxvf nginx-1.16.1.tar.gz -C /usr/local/java 解压到 /usr/local/java 目录下(java目录需要自行创建)
解压完成后,你会在 /usr/lcoal/java 目录下会多出一个目录 nginx-1.16.1
cd /usr/local/java/nginx-1.16.1 进入 nginx-1.16.1 目录
./configure 执行 ./configure 命令
make && make install 编译并安装
编译安装完后,在 /usr/local/ 目录下会自动生成一个 nginx 目录,代表安装成功!
启动nginx
bash
cd /usr/local/nginx/sbin/ 进入 sbin 目录
./nginx 启动 Nginx
此时nginx已经启动,你可以在浏览器中输入ip端口:80,如果出现无法访问,可能是防火墙没有开启80端口。
Linux中有两种防火墙软件,ConterOS 7.0
以上使用的是 firewall
,ConterOS 7.0
以下使用的是 iptables
bash
firewall-cmd --zone=public --add-port=8080/tcp --permanent 开放8080端口
firewall-cmd --zone=public --remove-port=8080/tcp --permanent 关闭8080端口
firewall-cmd --reload 更新配置信息(这样就不需要重启防火墙了)
将80端口开放,如果没有安全考虑,就可以直接关掉防火墙。
bash
systemctl status firewalld 查看防火墙状态
systemctl start firewalld 启动防火墙
systemctl stop firewalld 关闭防火墙
systemctl restart firewalld 重启防火墙
systemctl enable firewalld 设置开机自启
systemctl disable firewalld 禁用开机启动
然后在次输入ip端口:80
出现这个界面,恭喜你成功安装好nginx。
3.Nginx做反向代理
有反向肯定有正向代理,这边不讨论,反向代理位于客户端和服务器之间,接收客户端的请求,然后根据配置规则将请求透明地转发到后端服务器,并将服务器的响应返回给客户端。客户端感知不到后端服务器的存在,仿佛所有请求都是直接与反向代理交互。其实说白了有点像中间商。
Nginx的反向代理配置主要在nginx.conf或包含的子配置文件(如/.conf)中进行。配置主要包括以下部分:
HTTP服务器块 (server): 定义监听的IP地址、端口以及与之关联的域名(server_name)。
位置块 (location): 根据请求URI进行匹配,并定义在此范围内应执行的操作,如反向代理。
反向代理指令 (proxy_pass): 指定请求应被转发到的后端服务器的URL。Nginx将替换匹配到的位置块中的URI,并将其发送到指定的后端服务器。
以下是一个代码示例:
java
http {
# 基本HTTP服务器配置
server {
listen 80; # 监听端口
server_name example.com; # 绑定域名
# 匹配所有请求,将它们转发到后端服务器
location / {
proxy_pass http://backend-server:8080; # 后端服务器地址与端口
proxy_set_header Host $host; # 保留原始Host头
proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # 传递请求协议(http/https)
# 其他可选配置,如缓存、超时、重试等
}
}
}
代码注释:
listen: 指定Nginx监听的IP地址和端口,这里为标准HTTP端口80。
server_name: 设置服务器块所关联的域名,即客户端请求的域名。
location /: 匹配所有以根路径("/")开头的请求。
proxy_pass: 设置后端服务器的URL。此处将所有匹配到的请求转发到http://backend-server:8080。
proxy_set_header: 设置请求转发时要修改或添加的HTTP头部。这些指令用于保持与后端服务器的正确交互,如:
Host: 保持原请求的Host头,确保后端服务器能够正确识别请求的目的主机。
X-Real-IP: 传递真实的客户端IP地址,防止后端服务器因反向代理而获取到Nginx服务器的IP。
X-Forwarded-For: 传递经过代理链的客户端IP列表,多个代理时会追加。
X-Forwarded-Proto: 传递原始请求的协议(http或https),以便后端服务器识别请求是否经过SSL加密。
如果要配置https的反向代理,则还需要添加SSL证书和私钥,以下是一个代码示例:
java
server {
listen 443 ssl; # 监听HTTPS端口
server_name example.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
# 其他SSL配置项,如CA证书、密码、加密套件等...
location / {
proxy_pass http://backend;
# 保持或调整与HTTPS相关的HTTP头
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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 https;
}
}
4.Nginx做负载均衡
什么是负载均衡,单从字面理解可以解释为N台服务器平均分担负载,不会因为某台服务器负载高宕机而出现某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,目的是达到整个系统的高性能和高可用性。
在深入探讨Nginx作为反向代理的负载均衡功能时,我们可以发现它与普通负载均衡软件之间存在一些关键的区别。例如,LVS这样的负载均衡器主要负责对请求数据包进行转发,可能还会对数据包进行一些修改。在直接路由(DR)模式下,从负载均衡器后面的节点服务器的视角来看,接收到的请求仍然源自访问负载均衡器的真实用户。
相比之下,Nginx的反向代理功能则更为复杂。它不仅接收用户的请求,而且会代表用户向代理下的节点服务器重新发起请求。在这个过程中,节点服务器接收到的请求看起来就像是来自反向代理服务器,而非原始的客户端用户。
简而言之,LVS等负载均衡器的工作是转发用户请求的数据包,而Nginx的反向代理则是在接收到用户请求后,代表用户向节点服务器发起新的请求。这种差异使得Nginx在处理请求时能够提供更高级的控制和灵活性,同时也为实现更复杂的负载均衡策略提供了可能。
接下来我将给出nginx负载均衡的具体配置,前提是你已经安装好了nginx
1.编辑Nginx的配置文件 ,通常位于/etc/nginx/nginx.conf
或/etc/nginx/sites-available/
目录下。你需要添加或修改upstream
和server
部分。
2.定义上游服务器组: 在配置文件中定义一个upstream
块,列出所有后端服务器的地址和端口。例如:
bash
upstream myapp {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
3.配置服务器块 :在server
块中,使用location
指令指定要代理的路径,并使用proxy_pass
指令将请求转发到上游服务器组。例如:
java
server {
listen 80;
location / {
proxy_pass http://myapp;
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;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
4.配置负载均衡策略 :Nginx支持多种负载均衡策略,如轮询(默认)、最少连接、IP哈希等。你可以通过upstream
块中的least_conn
或ip_hash
等指令来指定策略。
这里我给出轮询和最少连接这两种最常用负载均衡策略
轮询:
轮询是Nginx的默认负载均衡策略,它将请求轮流分配给后端服务器。
java
http {
upstream myapp {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
# 其他代理设置...
}
}
}
在这个配置中,upstream
块定义了三个后端服务器,Nginx将自动使用轮询策略将请求分配给这些服务器。
最少连接:
最少连接策略会将请求分配给当前连接数最少的后端服务器。
java
http {
upstream myapp {
least_conn; # 指定使用最少连接策略
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
# 其他代理设置...
}
}
}
在upstream
块中,通过添加least_conn;
指令,指定了使用最少连接策略。这样,Nginx会优先选择当前活跃连接数最少的服务器来处理新的请求。
5.配置连接超时和缓冲 :根据需要配置proxy_read_timeout
、proxy_send_timeout
、proxy_buffer_size
等参数。
6.配置SSL:如果需要HTTPS,还需要配置SSL证书和密钥。
7.测试配置 :在保存配置文件后,使用nginx -t
命令测试配置文件是否有语法错误。
8.重启Nginx :如果测试通过,使用sudo systemctl restart nginx
或sudo service nginx restart
命令重启Nginx以应用配置。