Linux入门攻坚——42、Nginx及web站点架构模式

news2024/12/20 4:15:12

对于lvs集群,是一个四层路由的集群,Director无需启用对端口的监控,直接将报文转发给后端业务服务器RealServer。

使用Nginx也可以实现集群功能,Nginx实现反向代理,实现的是七层上的转发,要求Nginx本身就是一个WEB服务器,监听在80端口,然后按照不同的请求,对后端业务服务器,这里叫做upstream server,上游服务器,再发起请求,获得结果后返回给客户端。

Nginx反向代理配置,主要是模块ngx_http_proxy_module:官网:http://nginx.org/en/docs/http/ngx_http_proxy_module.html
Module ngx_http_proxy_module

Nginx安装,可以下载.rpm包直接安装,而不必源码编译安装
http://nginx.org/packages/centos/7Server/x86_64/RPMS/

rpm -ivh nginx-1.26.0-1.el7.ngx.x86_64.rpm

配置:

location / {
    proxy_pass       http://localhost:8000;
    proxy_set_header Host      $host;
    proxy_set_header X-Real-IP $remote_addr;
}

在192.168.61.129上配置nginx
在192.168.61.130上部署httpd

配置/etc/nginx/conf.d/default.conf:

未重新启动nginx,访问192.168.61.129:

重新启动nginx后,再次访问192.168.61.129:

请求转发到后端的upstream server上了。查看upstream server上的httpd日志:

发现最后请求的客户端地址是192.168.61.129,而不是真正的客户端192.168.61.1

也可以对不同的请求进行不同的映射处理

访问192.168.61.129时,访问的是nginx的/usr/share/nginx/html/下的index.html,访问192.168.61.129/form/时,会访问192.168.61.130/bbs/下的index.html

使用模式匹配时,proxy_pass的http://192.168.61.130后不能加任何url,否则语法错误。
proxy_pass http://192.168.147.140/bbs/;

访问http://192.168.61.129/1.jpg --> http://192.168.61.130/1.jpg
http://192.168.61.129/bbs/1.jpg --> http://192.168.61.130/bbs/1.jpg
将匹配到的整个路径添加到proxy_pass后。

这种配置下,后端服务器的日志记录中客户端地址都是nginx代理服务器地址,hostname也都是后端服务器,可以使用nginx核心模块的内嵌变量进行信息传递。
ngx_http_core_module中:
    Embedded Variables

$arg_name
$args
$binary_remote_addr
$body_bytes_sent
$bytes_sent
$connection
$connection_requests
$connection_time
$content_length
$content_type
$cookie_name
$document_root
$document_uri
$host
$hostname
$http_name
$https
$is_args
$limit_rate
$msec
$nginx_version
$pid
$pipe
$proxy_protocol_addr
$proxy_protocol_port
$proxy_protocol_server_addr
$proxy_protocol_server_port
$proxy_protocol_tlv_name
        $proxy_protocol_tlv_alpn
        $proxy_protocol_tlv_0x01
        $proxy_protocol_tlv_ssl_version
        $proxy_protocol_tlv_ssl_0x21
$query_string
$realpath_root
$remote_addr
$remote_port
$remote_user
$request
$request_body
$request_body_file
$request_completion
$request_filename
$request_id
$request_length
$request_method
$request_time
$request_uri
$scheme
$sent_http_name
$sent_trailer_name
$server_addr
$server_name
$server_port
$server_protocol
$status
$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space
$time_iso8601
$time_local
$uri

在upstreamserver上,对httpd的日志进行配置:

此时再次访问后,查看httpd的日志:

客户端地址已经是实际的客户端地址了。

Nginx代理具有内置的缓存:
proxy_cache zone | off;
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size
proxy_cache_methods GET | HEAD | POST ...;
proxy_cache_min_uses number;
proxy_cache_purge string ...;
proxy_cache_revalidate on | off;
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
proxy_cache_valid [code ...] time;
修改/etc/nginx/nginx.conf:

修改/etc/nginx/conf.d/default.conf,对服务器中的location添加缓存:

重新启动nginx后,再次访问时,在/cache/nginx下就有缓存内容了,客户端再次访问时,内容就从缓存中取。

proxy_connect_timeout:连接超时时间。
proxy_hide_header:upstream响应的头部内容,不打算反馈给客户端。
proxy_read_timeout time:

upstream模块:Module ngx_http_upstream_module
在使用proxy_pass指令时,指定的是单个主机,可以使用upstream模块指定一组主机,实现负载均衡。
定义服务器组:proxy_pass、fastcgi_pass、uwsgi_pass
upstream只能定义在http中。

在http中定义好upstream后,在server的location中使用:

此时访问http://192.168.61.129/,不断刷新,就会交替访问128和130两个upstreamserver。
还可以对定义的server加权重:

此时,128权重为2,130权重默认1,访问时128出现2次130出现1次。

也可以指定调度方法,如ip_hash:

此时再访问,就固定在一个upstream server上了。

server参数除了weight外,还有:
max_fails=#,失败次数
fail_timeout=#,失败的时间,秒数

此时停止128的httpd,访问就固定到130上了。如果128启动httpd,又可以负载均衡了。

down参数,手工标记某服务器下线;
backup参数,标记某服务器为备用服务器;

此时访问,只有130响应,如果130故障,128才会上线,只要服务器组中有一个可用的server,backup服务器都不会上线。

proxy_cache_bypass string:设置在何种情形下nginx将不从cache取数据;
个人私有内容或设置某些标记的内容不会从缓存中获取
  $cookie_nocache  $arg_nocache  $http_authorization

根据IP绑定,会造成使用SNAT访问的众多客户端被绑定到同一台upstream server,而根据cookie进行绑定,即使是同一个客户端,使用不同的浏览器,在http看来也是两个不同的客户端,所以使用基于cookie的绑定,可以很好的解决SNAT的问题。(lvs无法实现,因为无法识别应用层的cookie)

基于sticky实现session绑定:
三种方法:cookie、route、learn
sticky cookie name [expires=time] [domain=domain] [httponly] [samesite=strict|lax|none|$variable] [secure] [path=path];
sticky route $variable ...;
sticky learn create=$variable lookup=$variable zone=name:size [timeout=time] [header] [sync];

least_conn:调度方法,最少连接;
keepalive connections:保持连接,一般是非http协议时使用;
health_check:在location上下文中使用,对proxy_pass的upstream server做健康检查;建议,关闭该location中的访问日志;可以带的参数:interval=time,fails=number,passes=number,uri=uri,match=name

upstream模块自带的内嵌变量:
$upstream_addr
$upstream_bytes_received
$upstream_bytes_sent
$upstream_cache_status
$upstream_connect_time
$upstream_cookie_name 
$upstream_header_time
$upstream_http_name
$upstream_last_server_name
$upstream_queue_time
$upstream_response_length
$upstream_response_time
$upstream_status
$upstream_trailer_name

在server上下文中可以使用add_header给响应头增加自定义头部信息。如增加信息
add_header X-Cache $upstream_cache_status;
向客户端提供本次请求是否缓存命中。

Module ngx_http_fastcgi_module  :allows passing requests to a FastCGI server.

客户端向nginx发起.php(或其他动态资源如jsp)的访问.
安装php-fpm:yum install php-fpm
修改nginx配置文件/etc/nginx/conf.d/default.conf:

运行php-fpm:
查看配置文件:/etc/php-fpm.conf、/etc/php-fpm.d/www.conf,其中配置了监听地址和端口,以及其他一些配置项。
启动:systemctl start php-fpm.service

修改nginx配置文件/etc/nginx/conf.d/default.conf

修改/etc/nginx/fastcgi_params:
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

访问:http://192.168.61.129/index.php,显示
index.php :<?php  phpinfo(); ?>
 

测试数据库连接:test.php
<?php 
    $conn=mysql_connect('127.0.0.1','root','');
    if ($conn)
        echo succ;
    else
        echo fail;
?>

这里实际上实现了动静分离的功能。静态资源请求转发到upstream server,动态资源转发到php-fpm服务器。
此时的架构:

一般的,会使用LNAMP架构:

对于动态资源,使用fastcgi,也可以使用缓存,跟proxy_cache类似:
在http上下文中定义fastcgi缓存:
fastcgi_cache_path    /cache/fastcgi/  levels=1:2  keys_zone=fastcache:10m inactive=3m max_size=1g;
在location中使用:
fastcgi_cache fastcache

再次访问index.php:

可以看到,相应报头中缓存是HIT,缓存命中,使用了缓存。

后续就是对相关模块的各个指令进行深入研究,进行精细化定制。

对于缓存,可以使用ab工具进行压力测试,可以感受到使用缓存后响应速度大增。
ab -n 100 -c 200  http://192.168.61.129/index.php

概念:一致性hash
一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 。
致性哈希算法将整个哈希值空间映射成一个虚拟的圆环,整个哈希空间的取值范围为0~2^32-1。整个空间按顺时针方向组织。0~2^32-1在零点中方向重合。接下来使用如下算法对服务请求进行映射,将服务请求使用哈希算法算出对应的hash值,然后根据hash值的位置沿圆环顺时针查找,第一台遇到的服务器就是所对应的处理请求服务器。当增加一台新的服务器,受影响的数据仅仅是新添加的服务器到其环空间中前一台的服务器(也就是顺着逆时针方向遇到的第一台服务器)之间的数据,其他都不会受到影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2262493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git merge 和 rebase的区别(附图)

在 Git 中&#xff0c;merge 和 rebase 是两种用于整合分支变化的方法。虽然它们都可以将一个分支的更改引入到另一个分支中&#xff0c;但它们的工作方式和结果是不同的。以下是对这两者的详细解释&#xff1a; Git Merge 功能&#xff1a;合并分支&#xff0c;将两个分支的…

密码编码学与网络安全(第五版)答案

通过如下代码分别统计一个字符的频率和三个字符的频率&#xff0c;"8"——"e"&#xff0c;“&#xff1b;48”——“the”&#xff0c;英文字母的相对使用频率&#xff0c;猜测频率比较高的依此为&#xff09;&#xff0c;t,*,5&#xff0c;分别对应s,o,n,…

我在广州学 Mysql 系列之 数据类型和运算符详解

ℹ️大家好&#xff0c;我是&#x1f606;练小杰&#xff0c;今天主要学习 Mysql的数据类型以及运算符操作~~ 上周五学习了“Mysql 系列之 数据“表”的基本操作”~ 想要了解更多&#x1f236;️MYSQL 数据库的命令行总结&#xff01;&#xff01;&#xff01; “我是你的敌人,…

SpringBoot中基于JWt的授权与续期方案

一、 SpringBoot中Token登录授权、续期和终止的方案RedisToken SpringBoot项目写登录注册之类的方案 使用Cookie或Session的话&#xff0c;它是有状态的&#xff0c;不符合分布式技术架构使用Security或者Shiro框架实现起来比较复杂&#xff0c;一般项目无需用那么复杂使用JW…

小程序快速实现大模型聊天机器人

需求分析&#xff1a; 基于大模型&#xff0c;打造一个聊天机器人&#xff1b;使用开放API快速搭建&#xff0c;例如&#xff1a;讯飞星火&#xff1b;先实现UI展示&#xff0c;在接入API。 最终实现效果如下&#xff1a; 一.聊天机器人UI部分 1. 创建微信小程序&#xff0c…

【OSS】php使用oss存储

阿里云oss官方文档&#xff1a;文档 1、前期工作 创建阿里云账号&#xff0c;登录创建bucket&#xff0c;注意修改权限&#xff0c;要不然可能读取不到 申请accessKeyId和accessKeySecret accessKey 2、项目中安装OSS扩展 composer require aliyuncs/oss-sdk-php3、基础使…

Elasticsearch02-安装7.x

零、文章目录 Elasticsearch02-安装7.x 1、Windows安装Elasticsearch &#xff08;1&#xff09;JDK安装 Elasticsearch是基于java开发的&#xff0c;所以需要安装JDK。我们安装的Elasticsearch版本是7.15&#xff0c;对应JDK至少1.8版本以上。也可以不安装jdk&#xff0c;…

【Qt】drawText字体大小问题探究

背景 软件的一个功能是&#xff1a; 打开图片在图片上绘制序号&#xff0c;序号的样式是圆圈内包含数字将带有序号的图片打印出来 实现思路也很简单&#xff0c;在屏幕上显示时重写paintEvent函数&#xff0c;利用QPainter完成图片和序号的绘制。打印时只需要将QPainter对应…

redis 缓存使用

工具类 package org.springblade.questionnaire.redis;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factor…

C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第一部分-表格边界框检测

目录 说明 效果 模型 项目 代码 frmMain.cs YoloDet.cs 参考 下载 其他 说明 百度网盘AI大赛-表格检测的第2名方案。 该算法包含表格边界框检测、表格分割和表格方向识别三个部分&#xff0c;首先&#xff0c;ppyoloe-plus-x 对边界框进行预测&#xff0c;并对置信…

创建项目以及本地仓库和远程仓库并上传项目

创建项目以及本地仓库和远程仓库并上传项目 其详细流程如下&#xff1a; 1、本地创建项目 2、创建本地仓库&#xff08;若使用idea在创建项目时选择了创建.git本地仓库&#xff0c;则此步骤省略&#xff09; 进入到你需要上传的项目的目录下&#xff0c;右键找到Git Bah He…

鸿蒙操作系统简介

华为鸿蒙系统&#xff08;HUAWEI HarmonyOS&#xff09;&#xff0c;是华为公司于2019年8月9日在东莞举行的华为开发者大会&#xff08;HDC.2019&#xff09;上正式发布的面向全场景的分布式操作系统&#xff0c;可以创造一个超级虚拟终端互联的世界&#xff0c;将人、设备、场…

MySQL存储引擎-概述

存储引擎 存储引擎&#xff08;Storage Engine&#xff09;是数据库管理系统中负责数据存储和检索的部分。之前在MySQL的历史地位中曾经讲过&#xff0c;存储引擎是可插拔的。5.5之前默认采用MyISAM存储引擎&#xff0c;从5.5开始采用InnoDB存储引擎。 9大存储引擎 可以通过…

【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析

【网络取证篇】取证实战之PHP服务器镜像网站重构及绕密分析 在裸聊敲诈、虚假理财诈骗案件类型中&#xff0c;犯罪分子为了能实现更低成本、更快部署应用的目的&#xff0c;其服务器架构多为常见的初始化网站架构&#xff0c;也称为站库同体服务器&#xff01;也就是说网站应用…

【数据结构进阶】AVL树深度剖析 + 实现(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、AVL树的概念 二、AVL树底层解析及实现 1. 节点的定义 2. 接口声明 3. AVL树的插入 3.1 更新平衡因子 3.2 旋转&#xff08;重点…

java_断点调试(debug)

按照如下配置好后&#xff0c;即可点击“F7”,进入相应的方法&#xff0c;查看源码 package com.hspedu.debug_;//debug对象创建的过程&#xff0c;加深对调试的理解 public class Debug01 {public static void main(String[] args) {//创建对象的流程//&#xff08;1&#xff…

YOLOv11融合[CVPR2024]Starnet中的star block特征提取模块

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《Rewrite the Stars》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2403.19967 代码链接&#xff1a;https://github.com/ma-xu/Rewri…

【kubernetes】k8s集群的简述与搭建

简述 Kubernetes&#xff08;简称 K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序 关键特性 自动化部署和回滚&#xff1a;Kubernetes 可以自动化地部署和回滚应用程序&#xff0c;确保应用程序始终处于预期的状态。服务发现…

SpringBoot+vue实现WebSocket通信

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务器主动向客户端推送数据。 WebSocket的主要特点&#xff1a; 全双工通信&#xff1a;客户端和服务器之间的数据可以同时双向传输低延迟&…

【BUG】记一次context canceled的报错

文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢&#xff1f; 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…