热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CentOS系统中配置Nginx服务器实现反向代理和负载均衡

所谓代理。比如我不能上网,而局域网中其它一个IP能上网,我可以通过他来连接外网,他就充当了代理的角色。这种通过别人来连接外网的方式叫正向代理。当我们为外网提供服务时,外网用户要访问我们服务器内部的资源。而有些资源是在局域网中的,而这些资源无
所谓代理。比如我不能上网,而局域网中其它一个IP能上网,我可以通过他来连接外网,他就充当了代理的角色。这种通过别人来连接外网的方式叫正向代理。
当我们为外网提供服务时,外网用户要访问我们服务器内部的资源。而有些资源是在局域网中的,而这些资源无法直接在外网访问。这时候就需要在局域网中有一个类似上面代理的角色,请外部的请求转到内部的资源上。这种方式叫反向代理

Upstream 模块是 Nginx 负载均衡的主要模块,它提供了简单的办法来实现在轮询和客户端IP之间的后端服务器负载均衡,并可以对服务器进行健康检查。它的配置方式是:
nginx.conf 中加入:
upstream somename{
server domain1.abc.com weight=5;
server domain2.abc.com:8080
}

这样就声明了一个负载均衡的服务器集合.而我们的服务都是在 server 模块中定义的,所以可以想象,如果我们要对服务进行负载均衡,肯定要在 server 模块中进行和 upstream 的关联。如:
server{
listen 80;
server_name www.domain1.com
location /message/
{
proxy_pass http://somename/
proxy_set_header Host $host;
}
}

上面这段配置的意思就是,当访问 www.domain1.com/message/时,会反向代理到前面 upstream 定义的 somename 这一个服务器集合中。默认的负载均衡方式是轮询.Upstream 中的 server 指令用于指定服务器的名称和参数,服务器的名称可以是一个域名,一个IP地址,或 unix socket.
server 模块中可以通过如上所示的 proxy_pass 或 fastcgi_pass 进和向代理 upstream 服务器集群.
proxy_set_header 用于在向反向代理的web服务器发起请求时添加指定的 Header 头信息。比如服务器A上有多个虚拟主机,我们通过反向代理将请求转向服务器A,如何能确定是要转向哪个虚拟主机呢,就是通过 proxy_set_header 来进行的。
使用反向代理后,后端WEB服务器(以PHP为例),就不能直接通过$_SERVER['REMOTE_ADDR']来获得用户的真实IP了,它获得的是Nginx 负载均衡服务器的IP。这时候要通过在Nginx反向代理时添加Header头信息X-Forwarded-For让服务器通过$_SERVER['HTTP_X_FORWARDED_FOR']来获得真实的IP.

下面贴上一些完整的配置文件:
user  www www;
worker_processes 4;
error_log  /home/wwwlogs/nginx_error.log  crit; pid        /usr/local/nginx/logs/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
}
http
{
include       mime.types;
default_type  application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush     on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
gzip on;
gzip_min_length  1k;
gzip_buffers     4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types       text/plain application/x-Javascript text/css application/xml;
gzip_vary on;
#limit_zone  crawler  $binary_remote_addr  10m;
# 定义两组服务器
upstream php_server_pool{
server 127.0.0.1:8081 weight=4 max_fails=2 fail_timeout=30s;
}
upstream bbs_server_pool{
server 127.0.0.1:8082 weight=1 max_fails=2 fail_timeout=30s;
}

# 第一个虚拟主机,反向代理 php_server_pool 这组服务器
server
{
listen       80;
server_name test1.mydomain.cn;
index index.html index.htm index.php;
root  /home/wwwroot/test1;
location /
{
# 如果后端服务器返回 502,504,超时等.将自动把请求转发到 upstream 池中的另一台服务器中实现故障转移
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://php_server_pool;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
log_format  access  ‘$remote_addr ? $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” $http_x_forwarded_for’;
access_log  /home/wwwlogs/test1.log  access;
}
server
{
listen       80;
server_name test2.mydomain.cn;
index index.html index.htm index.php;
root  /home/wwwroot/test2;
location /
{
proxy_pass http://bbs_server_pool;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log  /home/wwwlogs/test2.log   access;
}
server
{
listen       8081;
server_name test1.mydomain.cn;
index index.html index.htm index.php;
root  /home/wwwroot/test1;
location /
{
fastcgi_pass  unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fcgi.conf;
}
access_log  /home/wwwlogs/test1.log   access;
}
server
{
listen       8082;
server_name test2.mydomain.cn;
index index.html index.htm index.php;
root  /home/wwwroot/test2;
location /
{
fastcgi_pass  unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fcgi.conf;
}
access_log  /home/wwwlogs/test2.log   access;
}
include vhost/*.conf;
}

上面配置的解释:
在同一台服务器上,两个虚拟主机监听 80 端口。但当它们接收到各自的请求后,将请求转向 8081 和 8082 端口。同时,nginx 还监听着 8081 和 8082 端口。
这里是在同一台机器上监听着这么多个端口。在实际应用中,会将请求转向同一局域网中的其它 ip 的机器。而 80 端口只是负责转发,这样以实现负载均衡。

推荐阅读
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 本文旨在回顾并总结近期学习的.NET Core基础知识,通过具体的操作指南加深理解,并为初学者提供实用建议,避免常见的错误和陷阱。内容涵盖CentOS的安装配置、.NET Core环境搭建及网站部署等。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 在项目中使用 Redis 时,了解其不同架构模式(如单节点、主从复制、哨兵模式和集群)对于确保系统的高可用性和扩展性至关重要。本文将详细探讨这些模式的特点和应用场景。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
author-avatar
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有