1. 概述
1. 用户----->代理--->Web节点,后面只有一个节点,一般使用的是nginx代理功能即可
2. 后面如果是集群需要使用nginx负载均衡功能
2. 代理分类
代理分类 | 方向 | 应用 |
---|---|---|
正向代理 | 用户(服务器)-->代理--->外部(某网站) | 服务器通过代理实现共享上网/访问公网 |
反向代理 | 用户(app/浏览器)--->代理--->网站web服务器 | 给网站设置个统一入口,后面是网站集群(可以使用负载均衡功能) |
3. 极速上手指南
3.1 环境概述
角色 | 主机名 | ip |
代理服务器 | lb01 | 10.0.0.5/172.16.1.5 |
web服务器 | nginx_xing | 10.0.0.8/172.16.1.8 |
3.2 给lb01配置nginx
参考链接:
Web集群服务-Nginx-CSDN博客https://blog.csdn.net/qq_63826739/article/details/142857315
nginx启动后默认是web服务器.
需要使用对应的模块:proxy模块(代理),upstream模块(负载均衡模块)
3.3 web服务器
##注释所有nginx子配置文件
##创建proxy.conf配置文件
server{
listen 80;
server_name proxy.oldboylinux.cn;
error_log /var/log/nginx/proxy/error.log notice;
access_log /var/log/nginx/proxy/access.log main;
root /app/code/proxy;
location / {
index index.html;
}
}
nginx -t
systemctl reload nginx
##创建站点目录
mkdir -p /app/code/proxy
##创建日志文件
mkdir -p /var/log/nginx/proxy
##创建首页文件内容
echo 'proxy.oldboylinux.cn web' >/app/code/proxy/index.html
##测试
curl -H Host:proxy.oldboylinux.cn 10.0.0.8
3.4 lb01代理服务器
1. 不需要配置站点目录
2. 仅仅需要转发proxy_pass
##创建proxy.conf配置文件
server{
listen 80;
server_name proxy.oldbooylinux.cn;
location /{
proxy_pass http://10.0.0.8:80;
proxy_set_header Host $http_host;
}
}
nginx -t
systemctl reload nginx
##测试
curl -H Host:proxy.oldboylinux.cn http://10.0.0.5
浏览器访问10.0.0.5
3.5 web记录用户真实ip地址
现象:
用户请求经过代理,然后访问web,web服务器没有记录真实的客户端的ip地址,而是记录了代理的ip
解决:
1. 在代理上面修改请求头,proxy_set_header X-Forwarded-For $remote_addr;
2. 最后在web服务器上记录了真实的ip地址,$http_x_forwarded_for"
##修改proxy.conf配置文件
server{
listen 80;
server_name proxy.oldbooylinux.cn;
error_log /var/log/nginx/proxy/error.log notice;
access_log /var/log/nginx/proxy/access.log main;
location /{
proxy_pass http://10.0.0.8:80;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr; ##只会一个ip地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ##多层代理的时候,会记录每个代理的ip地址.相当于记录了多个
}
}
nginx -t
systemctl reload nginx
浏览器访问,查看web服务器的日志
生产建议:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
3.6 部署nginxconf 站点并访问
##web01服务器配置文件
server{
listen 80;
server_name cfg.oldboylinux.cn;
access_log /var/log/nginx/cfg/access.log main;
error_log /var/log/nginx/cfg/error.log notice;
root /app/code/cfg;
location /{
index index.html;
}
}
##代理服务服务器配置文件
upstream cfg_pools{
server 10.0.0.8:80; ##资源池,以后可以写多个web服务器地址
server 10.0.0.7:80; ##创建分组/池塘,proxy_pass中使用即可
server 10.0.0.6:80;
}
server{
listen 80;
server_name cfg.oldboylinux.cn;
access_log /var/log/nginx/cfg/access.log main;
error_log /var/log/nginx/cfg/error.log notice;
location /{
proxy_pass http://cfg_pools;
proxy_set_header Host $http_host;
proxy_set_header X_Real_Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3.7 负载均衡模块的选项
upstream模块 sever 指令支持的选项:
upstrem pools {
server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10s;
server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=10s;
server 10.0.0.9:80 backup; server 10.0.0.9:80 backup;
}
server后面可以加的选项 | 说明 | 应用场景 |
---|---|---|
weight | 权重,根据权重nginx分配请求 | 如果web服务端配置不同,1c2g, 2c8g. 代码更新与测试的时候,给测试服务器较小的权重 |
max_fails | nginx具备一些健康检查功能,指定失败的次数,超过这个次 数就认为节点挂了 | 一般情况下可以设置1-3即可. 不太重要,缓存业 务,可以设置为10 |
fail_timeout | 认为节点挂了后间隔多久再次检查健康情况. 默认是 10s. | 根据要求设置时间即可,可以长一些.30/60s |
backup | 备胎服务器,其他所有服务器都挂了的时候,才启用 | 使用的时候需要考虑雪崩的情况 |
4. wordpress接入负载均衡
1. 接入nfs挂载
2. db数据库库,用户
3. web01,web02 部署环境ngx+php,测试,部署代码,挂载nfs
4. 接入负载
4.1 nfs存储
参考:数据服务-存储服务(NFS)-CSDN博客
##编写存储目录
vim/etc/exports
/wp-uploads/ 172.16.1.0/24(rw,all_squash)
##创建目录
mkdir -p /wp-uploads/
chown -R nfsnobody.nfsnobody /wp-uploads/
systemctl restart nfs
4.2 db数据库
参考:Web集群服务-Nginx-CSDN博客
4.3 web01
yum install -y nfs-utils
mount -t nfs 172.16.1.31:/wp-uploads /app/code/blog/wp-content/uploads/ ##挂载
4.4 接入负载均衡
upstream blog_pools{
server 10.0.0.8:80;
}
server {
listen 80;
server_name blog.oldboylinux.cn;
error_log /var/log/nginx/blog/error.log notice;
access_log /var/log/nginx/blog/access.log main;
location /{
proxy_pass http://blog_pools;
proxy_set_header Host $http_host;
proxy_set_header X_Real_Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginx -t
systemctl reload -nginx
5. 会话保持
5.1 概述
用户的请求,登录的请求,经过负载均衡后落到后面的web服务器上,登录的状态/信息也会记录在web服务器上,就会导致不通的web服务器 上,登录状态不统一,造成用户频繁需要登录
5.2 cookie vs session
技术 | 共同点 | 区别 |
---|---|---|
cookie | 存放用户的信息,登 录信息 | 存放在客户端浏览器上 |
session | 存放用户的信息,登 录信息 | 存放在服务器上 |
5.3 会话保持方案
1. 登录状态写入cookie中
2. ip_hash方法
3. 通过redis实现phpmyadmin/kodbox会话共享
5.3.1 部署phpMyAdmin
db准备phpmyadmin的用户
grant all on *.* 'phpmyadmin@'172.16.1.%' identified by '1';
在nginx上写配置文件
server{
listen 80;
server_name phpadmin.oldboylinux.cn;
access_log /var/log/nginx/phpadmin/access.log main;
error_log /var/log/nginx/phpadmin/error.log notice;
root /app/code/phpadmin;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_buffering on;
fastcgi_buffers 64 64k;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
部署代码:
phpMyAdminhttps://www.phpmyadmin.net/
浏览器解析与访问
##修改权限
chown -R nginx.nginx /var/lib/php/session
##手动创建连接数据库的配置文件
cp /app/code/phpadmin/config.sample.inc.php /app/code/phpadmin/config.inc.php
##修改config.inc.php第三十行服务器地址改为数据库服务器地址
grep -n host config.inc.php
30:$cfg['Servers'][$i]['host'] = '172.16.1.51';
5.3.2 部署redis服务
##在数据库服务器上安装redis
yum install -y redis
##修改/etc/redis.conf
bind 127.0.0.1 172.16.1.51 ##增加本地网卡的ip
##服务启动和查看端口
systemctl enable now redis
ss -lntup|grep redis
5.3.3 负载均衡配置文件
upstream phpadmin_pools{
server 10.0.0.8:80;
}
server{
listen 80;
server_name phpadmin.oldboylinux.cn;
error_log /var/log/nginx/phpadmin/error.log notice;
access_log /var/log/nginx/phpadmin/access.log main;
location /{
proxy_pass http://phpadmin_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginx -t
systemctl reload nginx
5.3.4 php配置文件指定会话存放位置
##
cd /etc/php-fpm.d
cp www.conf session.conf
egrep -v '^$|;' session.conf
vim session.conf
##书写配置文件
[session] ###修改
user = nginx ##修改
group = nginx ##修改
listen = 127.0.0.1:9001 ###修改
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = redis ##修改
php_value[session.save_path] = tcp://172.16.1.51:6379 ##修改
php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache
##检查语法
php-fpm -t
systemctl reload php-fpm
ss -lntup|grep php ##有9001端口
5.3.5 修改ngx配置 admin转发到9001端口的php处理
server{
listen 80;
server_name phpadmin.oldboylinux.cn;
access_log /var/log/nginx/phpadmin/access.log main;
error_log /var/log/nginx/phpadmin/error.log notice;
root /app/code/phpadmin;
location / {
index index.php;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001; ##传递给9001端口
fastcgi_buffering on;
fastcgi_buffers 64 64k;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
nginx -t
systemctl reload nginx
5.3.6 最终测试
浏览器访问登录phpadmin,查看redis数据库是否有数据
##登录phpadmin后刷新页面,查看redis数据
redis-cli
KEYS *