文章目录
nginx Proxy 代理
知识点
1 YUM
-
主线- 开发版本
-
稳定版本 - 生产环境的版本
2 虚拟主机
server {
listen 80;
server_name www.xxx.com;
# http://www.xxx.com/a/b.jpg
# http://www.xxx.com # --> url / (根路由)
location / {
root /html;
index index.html;
}
location /a/ {
root /static/;
}
}
http://www.xxx.com/a/b.jpg ==> /static/a/b.jpg
------------
<img src="/a/b.jpg" >
3 反向代理
http{
server{
location / {
proxy_pass http://真实服务器的地址:端口号;
}
}
}
4 负载均衡
http {
upstream 服务器组名称{
# 这里写上提供相同网络资源的服务器,一行一个
server 11.1.1.10:80;
server 11.1.1.20:8020;
}
server {
location / {
proxy_pass http://服务器组名称;
}
}
}
一、负载均衡算法
upstream 支持4种负载均衡调度算法
A、轮询(默认)
:每个请求按时间顺序逐一分配到不同的后端服务器;
B、ip_hash
:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
C、url_hash
:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。
D、fair
:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx
本身是不支持 fair
的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair
模块。
二、配置实例[七层]
1、热备:
如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB…
upstream myweb {
server 172.17.14.2:8080;
server 172.17.14.3:8080 backup; #热备
}
2、轮询:
nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB…
upstream myweb {
server 172.17.14.2:8080;
server 172.17.14.3:8080;
}
3、加权轮询:
跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB…
upstream myweb {
server 172.17.14.2:8080 weight=1;
server 172.17.14.3:8080 weight=2;
}
4、ip_hash:
nginx会让相同的客户端ip请求相同的服务器。
upstream myweb {
server 172.17.14.2:8080;
server 172.17.14.3:8080;
ip_hash;
}
5、nginx负载均衡配置状态参数
- down,表示当前的server暂时不参与负载均衡。
- backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
- max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
- fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和fail_timeout一起使用。
upstream myweb {
server 172.17.14.2:8080 weight=2 max_fails=2 fail_timeout=2;
server 172.17.14.3:8080 weight=1 max_fails=2 fail_timeout=1;
}
如果你想跟多更深入的了解 nginx 的负载均衡算法,
nginx官方< http://www.nginx.org.>提供一些插件大家可以了解下。
6、配置负载均衡参数
[root@localhost ~]# vim /etc/nginx/conf.d/default.conf
upstream testapp {
server 192.168.116.155:80 max_fails=2 fail_timeout=2;
server 192.168.116.156:80 max_fails=2 fail_timeout=2;
}
7、确保web端打开nginx服务
a 检测状态
[root@localhost ~]# curl 192.168.116.157
234566
[root@localhost ~]# curl 192.168.116.157
hahaha 1234
为了方便,写了脚本进行测试
[root@localhost ~]# cat 负载均衡.sh
#!/usr/bin/bash
while :
do
curl 192.168.116.157
sleep 1
done
测试效果
[root@localhost ~]# sh 负载均衡.sh
234566
hahaha 1234
234566
hahaha 1234
b 关闭一台web服务器
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
c 清空nginx日志文件
[root@localhost ~]# > /var/log/nginx/access.log
[root@localhost ~]# > /var/log/nginx/error.log
测试结果
[root@localhost ~]# sh 负载均衡.sh
234566
234566
234566
234566
三、四层tcp负载
1 备份数据
[root@localhost nginx]# cp /etc/nginx/nginx.conf{,.bak}
2 修改监听端口
[root@localhost nginx]# vim /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/log/nginx.dir;
events {
worker_connections 1024;
}
stream {
upstream testapp {
server 192.168.116.155:80 max_fails=2 fail_timeout=2;
server 192.168.116.156:80 max_fails=2 fail_timeout=1;
}
server {
listen 82;
proxy_pass http://testapp;
}
}
测试结果
[root@localhost nginx]# curl 192.168.116.157:82
hahaha 1234
[root@localhost nginx]# curl 192.168.116.157:82
234566
[root@localhost nginx]# curl 192.168.116.157:82
hahaha 1234
查询mysql初始密码
grep ' password'/var/log/mysqld. log
修改密码
mysqladmin -uroot -p'4A0hMZD6kT!g' password Neko@123
3 负载均衡实现代理MySQL [四层负载]
创建新的数据库数据[库1]
mysql -uroot -pQianFeng@123 -e "create database db1;"
mysql -uroot -pQianFeng@123 -e "create table db1.t1(id int);"
mysql -uroot -pQianFeng@123 -e "insert into db1.t1 values(1);"
创建新的数据库数据[库2]
mysql -uroot -pQianFeng@123 -e "create database db1;"
mysql -uroot -pQianFeng@123 -e "create table db1.t1(id int);"
mysql -uroot -pQianFeng@123 -e "insert into db1.t1 values(1);"
mysql -uroot -pQianFeng@123 -e "insert into db1.t1 values(2);"
查询表格
mysql -uroot -pQianFeng@123 -A -e "select id from db1.t1;"
mysql -uroot -pQianFeng@123 -AB -e "select id from db1.t1;"
进入数据库1 添加新用户 并授权(root用户不会被远程登录)
mysql> use db1;
mysql> grant all on db1.* to Neko@'%' identified by 'Neko@123';
在另一个数据库2 上登录数据库1 的Neko账户
[root@localhost ~]# mysql -uNeko -pNeko@123 -h192.168.116.158
然后库2 也创建同样的用户及密码
[root@localhost nginx]# vim /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream {
include /etc/nginx/conf.d/*.conf;
upstream mysql {
server 192.168.116.155:3306;
server 192.168.116.156:3306;
}
server {
listen 3306;
proxy_pass mysql;
}
}
七层负载需要在主配置文件内添加 http{} 在里面也添加 include
[root@localhost ~]# cat /etc/nginx/conf.d/default.conf
upstream testapp {
server 192.168.116.158:80;
server 192.168.116.159:80;
}
server {
listen 82;
proxy_pass testapp;
}
代理机拷贝任意一个数据库文件
scp [email protected]:/usr/bin/mysql /usr/bin/mysql
刷新数据
nginx -s reload
查询库1的数据库文件
mysql -u用户
-p密码
-h地址
-A -e " 命令
"
[root@localhost tmp]# mysql -uNeko -pNeko@123 -h192.168.116.158 -A -e "select id from db1.t1;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| id |
+------+
| 1 |
+------+
查询库2
[root@localhost tmp]# mysql -uNeko -pNeko@123 -h192.168.116.159 -A -e "select id from db1.t1;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| id |
+------+
| 1 |
| 2 |
+------+
查询端口
ss -natl
以只读方式查看文件内容
less /etc/nginx/nginx.conf