
希望实现子域名访问对应端口,如下:
sub1.domain.com -- ip:3000
sub2.domain.com -- ip:4000
在域名解析供应商处完成如下配置

参考以下步骤,在服务器上完成 apache2 反向代理配置子
在 Apache 中,你可以使用mod_proxy模块来设置反向代理,从而隐藏后端服务的真实端口号。通过这种方式,用户访问子域名时就像访问普通的 HTTP 或 HTTPS 网站一样,而不会看到后端服务运行的具体端口。
以下是基于 Apache 完成反代配置的步骤:
确保安装了 Apache 和必要的模块: 确保你的 Apache 服务器已经安装了mod_proxy、mod_proxy_http等模块。如果没有安装,可以通过以下命令安装(以 Debian/Ubuntu 系统为例):
sudo a2enmod proxy sudo a2enmod proxy_http 安装完成后需要重启 Apache 服务:
sudo systemctl restart apache2 配置虚拟主机: 在 Apache 的配置文件目录下(通常是/etc/apache2/sites-available/),创建一个新的虚拟主机配置文件,或者编辑现有的配置文件。假设你想要为子域名service.example.com配置反向代理,并且该子域名将指向本地机器上运行的一个服务,例如运行在 3000 端口上的 Web 应用。
添加反向代理配置: 编辑配置文件并添加如下内容:
<VirtualHost *:80> ServerName service.example.com # 可选:重定向所有请求到 HTTPS Redirect permanent / https://service.example.com/ </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerName service.example.com # SSL 证书配置 SSLEngine on SSLCertificateFile /path/to/certificate.crt SSLCertificateKeyFile /path/to/private.key # 如果有中间证书 SSLCertificateChainFile /path/to/chain.pem # 开启日志记录 ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # 反向代理配置 ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://localhost:3000/ ProxyPassReverse / http://localhost:3000/ </VirtualHost> </IfModule> 这个配置做了几件事:
启用站点并重启 Apache: 保存更改后的配置文件,然后启用这个站点配置:
sudo a2ensite your-config-file.conf sudo systemctl reload apache2 测试配置: 使用浏览器或其他工具(如 curl )访问http://service.example.com,应该会被自动重定向到https://service.example.com,并且最终可以看到运行在 8080 端口上的服务内容。
完成配置后,访问http://sub1.example.com ,无法访问,提示 502
上述配置方法可能是哪里出错了?请有实操经验的大佬指导下
除了上面这个方法,有没有其他方法?(已尝试宝塔面板)
ProxyVia On SSLProxyEngine On RequestHeader set Front-End-Https "On" # 必须设置,否则无法全局替换 RequestHeader set Accept-Encoding "" #禁用同源策略,否则 DuckDuckGo 资源无法加载 Header unset Content-Security-Policy # 反代地址 ProxyPass "/" "https://duckduckgo.com/" ProxyPassReverse "/" "https://duckduckgo.com/" ProxyPassReverseCookieDomain "duckduckgo.com" "ddg.example.com" AddOutputFilterByType SUBSTITUTE text/html text/css text/Javascript application/Javascript # 在其他的状态码页面也进行替换 SetEnv filter-errordocs # 替换规则 Substitute "s|external-content.duckduckgo.com|ddgec.example.com|ni" Substitute "s|duckduckgo.com|ddg.example.com|ni" 反代 Google 时也遇到了 recaptcha 验证码,无法正常使用。 求大佬帮助。
]]>这几台 apache 平时运行过程中总是有子进程不断退出并创建出新的子进程( 10 秒左右就会发生),在即将创建出子进程的时候,全连接队列会积压( Recv-Q 大概能到 40 )。用 perf trace 追踪了一下某个子进程的系统调用,发现退出码都是 0,看上去是正常退出的?
系统日志 /var/log/message 和 dmesg 以及 apache 日志都没有异常,这个现象是今年 4 月发生的,但是发生故障前后我们并没有变更过 apache 的配置,进程模型用的 event 。所以有点疑惑,大家有啥思路吗?
]]>docker run -t -p 80:80 -d -v /home:/h5ai --name h5ai ilemonrain/h5ai:full 部署完毕后,通过 h5ai 浏览目录,链接,预览中文都是没有问题。但是直接通过链接+文件名(raw)直接访问时,文本类型文件(txt,md)等有中文内容都会显示乱码.
# README 这是一个文档共享平å°ã€‚ 查看了下应用服务器是 apache
Apache/2.4.33 (Unix) Server at xxx.xxx.xxx.xxx Port 80 去网上搜索了多个文本浏览中文乱码的方案,都失败了。
vim /etc/httpd/conf/httpd.conf ...
修改保存后,重启 docker 容器,浏览文本 raw,还是乱码。
]]> ProxyPass /webapp/ balancer://webapp-proxy/ ProxyPassReverse /webapp/ balancer://webapp-proxy/ <Proxy balancer://webapp-proxy> BalancerMember http://10.61.16.28:8523/webapp/ </Proxy> ProxyPassMatch ^(/qa(/\w+)+) balancer://qa-proxy/ ProxyPassReverse ^(/qa(/\w+)+) balancer://qa-proxy/ <Proxy balancer://qa-proxy> BalancerMember http://10.61.16.27:8522/ </Proxy> ProxyPassMatch ^(/qa-client(/\w+)*.*) balancer://qa-client-proxy/ ProxyPassReverse ^(/qa-client(/\w+)*.*) balancer://qa-client-proxy/ <Proxy balancer://qa-client-proxy> BalancerMember http://10.61.16.28:8524/ </Proxy> ProxyPassMatch ^(/wx(/\w+)*.*) balancer://qa-wx-proxy/ ProxyPassReverse ^(/wx(/\w+)*.*) balancer://qa-wx-proxy/ <Proxy balancer://qa-wx-proxy> BalancerMember http://10.61.16.28:8525/ </Proxy> 为什么 ip 访问时正常,用域名访问时就会提示重定向次数过多。对了,Apache 配置文件里还有 webgate 单点登录拦截。
]]>分布式技术的发展,深刻地改变了我们编程的模式和思考软件的模式。值 2019 岁末,PingCAP 联合 InfoQ 共同策划出品“分布式系统前沿技术 ”专题, 邀请众多技术团队共同参与,一起探索这个古老领域的新生机。本文出自 StreamNative 联合创始人 Sijie Guo。
几十年前,消息队列开始兴起,它用于连接大型机和服务器应用程序,并逐渐在企业的服务总线与事件总线设计模式、应用间的路由和数据迁移中发挥至关重要的作用。自此,应用程序架构和数据角色经历了重大变化:例如,面向服务的架构、流处理、微服务、容器化、云服务和边缘计算,这些只是诸多变化中的冰山一角。这些变化创造了大量的新需求,这些新需求远远超出了原有消息队列的技术能力。
为了满足这些需求,处理消息队列的全新方法应运而生。现代应用对消息解决方案的要求不仅仅是主动连接、移动数据,而是要在持续增长的服务和应用中智能处理、分析和传输数据,并且在规模持续扩大的情况下不增加运营负担。
为了满足上述要求,新一代的消息传递和数据处理解决方案 Apache Pulsar 应运而生。Apache Pulsar 起初作为消息整合平台在 Yahoo 内部开发、部署,为 Yahoo Finance、Yahoo Mail 和 Flickr 等雅虎内部关键应用连接数据。2016 年 Yahoo 把 Pulsar 开源并捐给 Apache 软件基金会( ASF ),2018 年 9 月 Pulsar 毕业成为 ASF 的顶级项目,逐渐从单一的消息系统演化成集消息、存储和函数式轻量化计算的流数据平台。
Pulsar 的设计是为了方便和现有的 Kafka 部署集成,同时也方便开发人员将其连接到应用程序。Pulsar 最初就是为连接 Kafka 构建的。Pulsar 提供和 Kafka 兼容的 API,无需更改代码,只要使用 Pulsar 客户端库重新编译,现有应用程序即可连接到 Kafka。Pulsar 还提供内置的 Kafka 连接器,可以消费 Kafka topic 的数据或将数据发布到 Kafka topic。
系统架构是软件最底层的设计决策,一旦实施,就很难改变。架构决定了软件特性和根本不同。Apache Pulsar 在功能上有很多优势,例如统一的消费模型,多租户,高可用性等等,但最本质、最重要的区别还是 Apache Pulsar 的系统架构。Apache Pulsar 的设计架构与其他消息传递解决方案(包括 Apache Kafka )的架构有着本质不同,Pulsar 从设计时就采用了分层分片式的架构,以提供更好的性能、可扩展性和灵活性。
现实生活中,存在的消息系统有很多,Yahoo 为什么研发自己的消息系统呢?因为已有的消息系统无法解决 Yahoo 遇到的问题和规模,Yahoo 需要多租户,能够支撑上百万的 topics,同时满足低延迟、持久化和跨地域复制要求。而现有的消息系统,存在如下诸多问题:
分区模型紧耦合存储和计算,不是云原生( Cloud Native )的设计。
存储模型过于简单,对文件系统依赖太强。
IO 不隔离,消费者在清除 Backlog 时会影响其他生产者和消费者。
运维复杂,替换机器、服务扩容需重新均衡数据。
于是,我们决定开始研发 Pulsar 来解决消息队列的扩展性问题。解决扩展性问题的核心思路是数据分片,Pulsar 从设计时就采用了分层分片式的架构,以提供更好的性能、可扩展性和灵活性。
下面我们从技术角度来详细解析 Apache Pulsar 的架构。
从数据库到消息系统,大多数分布式系统采用了数据处理和数据存储共存于同一节点的方法。这种设计减少了网络上的数据传输,可以提供更简单的基础架构和性能优势,但其在系统可扩展性和高可用性上会大打折扣。
Pulsar 架构中数据服务和数据存储是单独的两层:数据服务层由无状态的 “Broker” 节点组成,而数据存储层则由 “Bookie” 节点组成。
这种存储和计算分离的架构给 Pulsar 带来了很多优势。首先,在 Pulsar 这种分层架构中,服务层和存储层都能够独立扩展,可以提供灵活的弹性扩容。特别是在弹性环境(例如云和容器)中能够自动扩容缩容,并动态适应流量的峰值。并且,Pulsar 这种分层架构显著降低了集群扩展和升级的复杂性,提高了系统可用性和可管理性。此外,这种设计对容器是非常友好的,这使 得 Pulsar 也成为了流原生平台的理想选择。
Pulsar 系统架构的优势也包括 Pulsar 分片存储数据的方式。Pulsar 将主题分区按照更小的分片粒度来存储,然后将这些分片均匀打散分布在存储层的 “bookie” 节点上。这种以分片为中心的数据存储方式,将主题分区作为一个逻辑概念,分为多个较小的分片,并均匀分布和存储在存储层中。这种架构设计为 Pulsar 带来了更好的性能,更灵活的扩展性和更高的可用性。
Pulsar 架构中的每层都可以单独设置大小,进行扩展和配置。根据其在不同服务中的作用不同,可灵活配置集群。对于需要长时间保留的用户数据,无需重新配置 broker,只要调整存储层的大小。如果要增加处理资源,不用重新强制配置存储层,只需扩展处理层。此外,可根据每层的需求优化硬件或容器配置选择,根据存储优化存储节点,根据内存优化服务节点,根据计算资源优化处理节点。
而大多数消息队列技术(包括 Apache Kafka )都采用单体架构,其消息处理和消息持久化(如果提供了的话)都在集群内的同一个节点上。这种体系结构在大多数传统的数据库平台以及 Hadoop 等大数据系统中也较为常见,与昂贵的外部存储阵列的常见替代方案相比,其设计目的在于将数据的计算与存储放到同一台机器上来处理,以减少网络流量和访问延迟,同时降低存储成本。这种方法在小型环境中很容易部署,但在性能、可伸缩性和灵活性方面存在明显问题。随着固态磁盘的广泛使用,网络带宽的迅速提升以及存储延迟的显著降低,已经没有必要采用单体架构进行这种权衡处理了。
接下来,我们结合数据处理中各种不同的 IO 访问模式来深入了解 Pulsar 系统架构的优势。
流系统中通常有三种 IO 访问模式:
写( Writes ):将新数据写入系统中;
追尾读( Tailing Reads ):读取最近写入的数据;
追赶读( Catch-up Reads ):读取历史的数据。例如当一个新消费者想要从较早的时间点开始访问数据,或者当旧消费者长时间离线后又恢复时。
和大多数其他消息系统不同,Pulsar 中这些 IO 访问模式中的每一种都与其他模式隔离。在同样 IO 访问模式下,我们来对比下 Pulsar 和其他传统消息系统(存储和服务绑定在单个节点上,如 Apache Kafka )的不同。
传统消息系统(图 3 左侧图)中,每个 Broker 只能利用本地磁盘提供的存储容量,这会给系统带来一些限制:
Broker 可以存储和服务的数据量受限于单个节点的存储容量。因此,一旦 Broker 节点的存储容量耗尽,它就不能再提供写请求,除非在写入前先清除现有的部分数据。
对于单个分区,如果需要在多个节点中存储多个备份,容量最小的节点将决定分区的最终大小。
相比之下,在 Apache Pulsar (图 3 右侧图)中,数据服务和数据存储是分离的,Pulsar 服务层的任意 Broker 都可以访问存储层的所有存储节点,并利用所有节点的整体存储容量。在服务层,从系统可用性的角度来看,这也有着深远的影响,只要任一个 Pulsar 的 Broker 还在运行,用户就可以通过这个 Broker 读取先前存储在集群中的任何数据,并且还能够继续写入数据。
下面我们来详细看一下在每种 IO 访问模式下的架构优势。
在传统消息系统架构中,一个分区的所有权会分配给 Leader Broker。对于写请求,该 Leader Broker 接受写入并将数据复制到其他 Broker。如图 4 左侧所示,数据首先写入 Leader Broker 并复制给其他 followers。数据的一次持久化写入的过程需要两次网络往返。
在 Pulsar 系统架构中,数据服务由无状态 Broker 完成,而数据存储在持久存储中。数据会发送给服务该分区的 Broker,该 Broker 并行写入数据到存储层的多个节点中。一旦存储层成功写入数据并确认写入,Broker 会将数据缓存在本地内存中以提供追尾读( Tailing Reads )。
如图 4 所示,和传统的系统架构相比,Pulsar 的系统架构并不会在写入的 IO 路径上引入额外的网络往返或带宽开销。而存储和服务的分离则会显著提高系统的灵活性和可用性。
对于读取最近写入的数据场景,在传统消息系统架构中,消费者从 Leader Broker 的本地存储中读取数据;在 Pulsar 的分层架中,消费者从 Broker 就可以读取数据,由于 Broker 已经将数据缓存在内存中,并不需要去访问存储层。
这两种架构只需要一次网络往返就可以读取到数据。由于 Pulsar 在系统中自己管理缓存中的数据,没有依赖文件系统缓存,这样 Tailing Reads 很容易在缓存中命中,而无需从磁盘读取。传统的系统架构一般依赖于文件系统的缓存,读写操作不仅会相互竞争资源(包括内存),还会与代理上发生的其他处理任务竞争。因此,在传统的单片架构中实现缓存并扩展非常困难。追赶读
追赶读(Catch-up Reads)非常有趣。传统的系统架构对 Tailing reads 和 Catch-up reads 两种访问模式进行了同样的处理。即使一份数据存在多个 Broker 中,所有的 Catch-up reads 仍然只能发送给 Leader Broker。
Pulsar 的分层架构中历史(旧)数据存储在存储层中。Catch-up 读可以通过存储层并行读取数据,而不会与 Write 和 Tailing Reads 两种 IO 模式竞争或干扰。
最有趣的是当你把这些不同的模式放在一起时,也就是实际发生的情况。这也正是单体架构的局限性最令人痛苦的地方。传统的消息系统架构中,所有不同的工作负载都被发送到一个中心( Leader Broker )位置,几乎不可能在工作负载之间提供任何隔离。
然而,Pulsar 的分层架构可以很容易地隔离这些 IO 模式:服务层的内存缓存为 Tailing Reads 这种消费者提供最新的数据;而存储层则为历史处理和数据分析型的消费者提供数据读取服务。
这种 IO 隔离是 Pulsar 和传统消息系统的根本差异之一,也是 Pulsar 可用于替换多个孤立系统的关键原因之一。Apache Pulsar 的存储架构读、写分离,能保证性能的一致性,不会引起数据发布和数据消费间的资源竞争。已发布数据的写入传递到存储层进行处理,而当前数据直接从 broker 内存缓存中读取,旧数据直接从存储层读取。
上面讨论了 Pulsar 的分层架构如何为不同类型的工作负载提供高性能和可扩展性。Pulsar 分层架构带来的好处远远不止这些。我举几个例子。
并行访问流式计算中的最新数据和批量计算中的历史数据,是业界一个普遍的需求。
由于 Pulsar 基于分片的架构,Pulsar 的一个主题在理论上可以达到无限大小。当容量不足时,用户只需要添加容器或存储节点即可轻松扩展存储层,而无需重新平衡数据;新添加的存储节点会被立即用于新的分片或者分片副本的存储。
Pulsar 将无界的数据看作是分片的流,分片分散存储在分层存储( tiered storage )、BookKeeper 集群和 Broker 节点上,而对外提供一个统一的、无界数据的视图。其次,不需要用户显式迁移数据,减少存储成本并保持近似无限的存储。因此,Pulsar 不仅可以存储当前数据,还可以存储完整的历史数据。
Pulsar 有能力存储数据流的完整历史记录,因此用户可以在其数据上使用各种数据工具。Pulsar 使用 Pulsar SQL 查询历史消息,使用 Presto 引擎高效查询 BookKeeper 中的数据。Presto 是用于大数据解决方案的高性能分布式 SQL 查询引擎,可以在单个查询中查询多个数据源的数据。Pulsar SQL 允许 Presto SQL 引擎直接访问存储层中的数据,从而实现交互式 SQL 查询数据,而不会干扰 Pulsar 的其他工作负载。Pulsar 与 Presto 的集成就是一个很好的例子,如下是使用 Pulsar SQL 查询的示例。
批处理是对有界的数据进行处理,通常数据以文件的形式存储在 HDFS 等分布式文件系统中。流处理将数据看作是源源不断的流,流处理系统以发布 /订阅方式消费流数据。当前的大数据处理框架,例如 Spark、Flink 在 API 层和执行层正在逐步融合批、流作业的提交与执行,而 Pulsar 由于可以存储无限的流数据,是极佳的统一数据存储平台。Pulsar 还可以与其他数据处理引擎(例如 Apache Spark 或 Apache Flink )进行类似集成,作为批流一体的数据存储平台,这进一步扩展了 Pulsar 消息系统之外的角色。下图展示了 Pulsar 的周边生态。
Apache Pulsar 是云原生的分布式消息流系统,采用了计算和存储分层的架构和以 Segment 为中心的分片存储,因此 Apache Pulsar 具有更好的性能、可扩展性和灵活性,是一款可以无限扩展的分布式消息队列。
Apache Pulsar 是一个年轻的开源项目,拥有非常多吸引人的特性。Pulsar 社区的发展迅猛,在不同的应用场景下不断有新的案例落地。期待大家能和 Apache Pulsar 社区深入合作,一起进一步完善、优化 Pulsar 的特性和功能。
作者介绍:Sijie Guo,StreamNative 联合创始人,Apache BookKeeper 和 Apache Pulsar PMC 成员和 Committer。之前是 Twitter 消息组的技术负责人,与他人共同创建了 Apache DistributedLog。加入 Twitter 之前,他曾在 Yahoo !从事推送通知基础架构工作。
本文是「分布式系统前沿技术」专题文章,目前该专题在持续更新中,欢迎大家保持关注👇
基础功能配置如虚拟主机配置成功了,但 SSL 配置一直没有成功过,更高级的配置也不敢乱动。Apache 的官方文档也没有针对 macOS 的指南。有专业的资料供参考吗?
]]><IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP:From-Https} !^on$ [NC,OR] #如果某些页面没有 301,上一句改为:RewriteCond %{HTTPS} !^on$ [NC,OR] RewriteCond %{HTTP_HOST} ^iamverylovely.com$ [NC] RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R=301,L] </IfModule> 结果是: http://iamverylovely.com http://www.iamverylovely.com https://iamverylovely.com
全部跳转至: https://www.iamverylovely.com
记录一下。
备注:使用命令:curl -I 加上 URL,可以快速查看 Header。
]]>SSL 证书是申请的腾讯云免费证书
配置文件 default-ssl.conf https://paste.ubuntu.com/p/M33F5jVmzZ/ 已软链到 /etc/apache2/sites-enabled 各项什么 mods 也都软链到 /etc/apache2/mods-enable 了
配置跟着 https://cloud.tencent.com/document/product/400/35243#step6 走的
新人小透明请求帮助...
]]>Apache2的问题,我在服务器上同时运行了 Nginx ( 80 端口绑定的主域名),和 Apache2 ( 8080 端口绑定了子域名),可以通过localhost:8080访问Apache2的网站,但是访问子域名sub.domain.com或者sub.domain.com:8080时,会出现 Nginx 80 端口的400 Bad Request错误,可是我子域名明明绑定的是 Apache2 的 8080 端口啊😂 有通过netstat -tlpn查看端口情况, 确定 tcp6 是 apache2 的 8080 端口,tcp 是 nginx 的 80 端口,有执行lsof -i TCP:8080 -s TCP:LISTEN, 需要重启的服务都重启过.....
求助,感谢
]]>
作者:个推平台研发工程师 祥子 在个推的推送场景中,消息队列在整个系统中占有非常重要的位置。
当 APP 有推送需求的时候, 会向个推发送一条推送命令,接到推送需求后,我们会把 APP 要求推送消息的用户放入下发队列中,进行消息下发;当同时有多个 APP 进行消息下发时,难免会出现资源竞争的情况, 因此就产生了优先级队列的需求,在下发资源固定的情况下, 高优先级的用户需要有更多的下发资源。
针对以上场景,个推基于 Kafka 设计了第一版的优先级队列方案。Kafka 是 LinkedIn 开发的一个高性能、分布式消息系统; Kafka 在个推有非常广泛的应用,如日志收集、在线和离线消息分发等。
架构
在该方案中,个推将优先级统一设定为高、中、低三个级别。具体操作方案如下:
对某个优先级根据 task (单次推送任务)维度,存入不同的 Topic,一个 task 只写入一个 Topic,一个 Topic 可存多个 task ;
消费模块根据优先级配额(如 6:3:1),获取不同优先级的消息数,同一优先级轮询获取消息;这样既保证了高优先级用户可以更快地发送消息,又避免了低优先级用户出现没有下发的情况。
Kafka 方案遇到的问题
随着个推业务的不断发展,接入的 APP 数量逐渐增多,第一版的优先级方案也逐渐暴露出一些问题:

基于上述问题,个推进行了新一轮的技术选型, 我们需要可以创建大量的 Topic, 同时吞吐性能不能比 Kafka 逊色。经过一段时间的调研,Apache Pulsar 引起了我们的关注。
Apache Pulsar 是一个企业级的分布式消息系统,最初由 Yahoo 开发,在 2016 年开源,并于 2018 年 9 月毕业成为 Apache 基金会的顶级项目。Pulsar 已经在 Yahoo 的生产环境使用了三年多,主要服务于 Mail、Finance、Sports、Flickr、the Gemini Ads platform、Sherpa (Yahoo 的 KV 存储)。
架构 
Topic 数量 Pulsar 可以支持百万级别 Topic 数量的扩展,同时还能一直保持良好的性能。Topic 的伸缩性取决于它的内部组织和存储方式。Pulsar 的数据保存在 bookie (BookKeeper 服务器)上,处于写状态的不同 Topic 的消息,在内存中排序,最终聚合保存到大文件中,在 Bookie 中需要更少的文件句柄。另一方面 Bookie 的 IO 更少依赖于文件系统的 Pagecache,Pulsar 也因此能够支持大量的主题。
消费模型 Pulsar 支持三种消费模型:Exclusive、Shared 和 Failover。
Exclusive (独享):一个 Topic 只能被一个消费者消费。Pulsar 默认使用这种模式。
Shared(共享):共享模式,多个消费者可以连接到同一个 Topic,消息依次分发给消费者。当一个消费者宕机或者主动断开连接时,那么分发给这个消费者的未确认(ack)的消息会得到重新调度,分发给其他消费者。
Failover (灾备):一个订阅同时只有一个消费者,可以有多个备份消费者。一旦主消费者故障,则备份消费者接管。不会出现同时有两个活跃的消费者。
Exclusive 和 Failover 订阅,仅允许一个消费者来使用和消费每个订阅的 Topic。这两种模式都按 Topic 分区顺序使用消息。它们最适用于需要严格消息顺序的流(Stream)用例。
Shared 允许每个主题分区有多个消费者。同一个订阅中的每个消费者仅接收 Topic 分区的一部分消息。Shared 最适用于不需要保证消息顺序队列(Queue)的使用模式,并且可以按照需要任意扩展消费者的数量。
存储 Pulsar 引入了 Apache BookKeeper 作为存储层,BookKeeper 是一个专门为实时系统优化过的分布式存储系统,具有可扩展、高可用、低延迟等特性。具体介绍,请参考 BookKeeper 官网。
Segment BookKeeper 以 Segment (在 BookKeeper 内部被称作 ledger) 作为存储的基本单元。从 Segment 到消息粒度,都会均匀分散到 BookKeeper 的集群中。这种机制保证了数据和服务均匀分散在 BookKeeper 集群中。
Pulsar 和 Kafka 都是基于 partition 的逻辑概念来做 Topic 存储的。最根本的不同是,Kafka 的物理存储是以 partition 为单位的,每个 partition 必须作为一个整体(一个目录)存储在某个 broker 上。 而 Pulsar 的 partition 是以 segment 作为物理存储的单位,每个 partition 会再被打散并均匀分散到多个 bookie 节点中。
这样的直接影响是,Kafka 的 partition 的大小,受制于单台 broker 的存储;而 Pulsar 的 partition 则可以利用整个集群的存储容量。 
扩容 当 partition 的容量达到上限后,需要扩容的时候,如果现有的单台机器不能满足,Kafka 可能需要添加新的存储节点,并将 partition 的数据在节点之间搬移达到 rebalance 的状态。
而 Pulsar 只需添加新的 Bookie 存储节点即可。新加入的节点由于剩余空间大,会被优先使用,接收更多的新数据;整个扩容过程不涉及任何已有数据的拷贝和搬移。 
Broker 故障 Pulsar 在单个节点失败时也会体现同样的优势。如果 Pulsar 的某个服务节点 broker 失效,由于 broker 是无状态的,其他的 broker 可以很快接管 Topic,不会涉及 Topic 数据的拷贝;如果存储节点 Bookie 失效,在集群后台中,其他的 Bookie 会从多个 Bookie 节点中并发读取数据,并对失效节点的数据自动进行恢复,对前端服务不会造成影响。 
Bookie 故障 Apache BookKeeper 中的副本修复是 Segment (甚至是 Entry)级别的多对多快速修复。这种方式只会复制必须的数据,这比重新复制整个主题分区要精细。如下图所示,当错误发生时,Apache BookKeeper 可以从 bookie 3 和 bookie 4 中读取 Segment 4 中的消息,并在 bookie 1 处修复 Segment 4。所有的副本修复都在后台进行,对 Broker 和应用透明。
当某个 Bookie 节点出错时,BookKeeper 会自动添加可用的新 Bookie 来替换失败的 Bookie,出错的 Bookie 中的数据在后台恢复,所有 Broker 的写入不会被打断,而且不会牺牲主题分区的可用性。 
在设计思路上,Pulsar 方案和 Kafka 方案并没有多大区别。但在新方案中,个推技术团队借助 Pulsar 的特性,解决了 Kafka 方案中存在的问题。

dbStorage_rocksDB_blockCacheSize 设置的足够大;当消息体量大,出现 backlog 大量堆积时, 使用默认大小(256M)会出现读耗时过大情况,导致消费变慢。backlogQuotaDefaultLimitGB 设置的足够大(默认 10G), 避免因为默认使用producer_request_hold 模式出现 block producer 的情况;当然可以根据实际业务选择合适的 backlogQuotaDefaultRetentionPolicy。现在, 个推针对优先级中间件的改造方案已经在部分现网业务中试运行,对于 Pulsar 的稳定性,我们还在持续关注中。 作为一个 2016 年才开源的项目,Pulsar 拥有非常多吸引人的特性,也弥补了其他竞品的短板,例如跨地域复制、多租户、扩展性、读写隔离等。尽管在业内使用尚不广泛, 但从现有的特性来说, Pulsar 表现出了取代 Kafka 的趋势。在使用 Pulsar 过程中,我们也遇到了一些问题, 在此特别感谢翟佳和郭斯杰(两位均为 Stream Native 的核心工程师、开源项目 Apache Pulsar 的 PMC 成员)给我们提供的支持和帮助。
参考文献:
[1] 比拼 Kafka, 大数据分析新秀 Pulsar 到底好在哪( https://www.infoq.cn/article/1UaxFKWUhUKTY1t_5gPq)
[2] 开源实时数据处理系统 Pulsar:一套搞定 Kafka+Flink+DB( https://juejin.im/post/5af414365188256717765441)
]]>127.0.0.1 - - [02 /AUG/2018:16:00:05 +0800] "OPTIONS * HTTP/1.0" 200 -
127.0.0.1 - - [02 /AUG/2018:16:00:04 +0800] "OPTIONS * HTTP/1.0" 200 -
127.0.0.1 - - [02 /AUG/2018:16:00:03 +0800] "OPTIONS * HTTP/1.0" 200 -
127.0.0.1 - - [02 /AUG/2018:16:00:02 +0800] "OPTIONS * HTTP/1.0" 200 -
127.0.0.1 - - [02 /AUG/2018:16:00:01 +0800] "OPTIONS * HTTP/1.0" 200 -
之后加大了 MaxSpareServers 的数值(默认为 10,已加到 50 ),还是老样子,有大神遇到类似问题的不?这该如何解决,求指教,万分感谢!
]]><IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /index.php?/$1 [QSA,PT,L] </IfModule> /abc/123.php 是真实存在的文件,内容是不接收传参,也没有跳转的,也就是不会收到外部影响。 根据以上规则,此 URL 是不走伪静态的,实际效果也确实如此。 但是会偶尔出现这个 url 打开的是伪静态后响应的内容 也就是 RewriteCond %{REQUEST_FILENAME} !-f 这条规则偶尔会失效,继续匹配到下面 RewriteRule ^(.*)$ /index.php?/$1 [QSA,PT,L] 这条规则上去了
请问有经验的大佬这个问题是由于什么而引发的呢,怎么解决这个问题呢?
]]>2.安装环境:
搬瓦工 VPS ubuntu16.04 apache 2.4.18 php5.6 3.具体问题 apache2 已经安装完成,浏览器输入 HostIp/ 是可以看到 Apache2 Ubuntu Default Page 的,说明阿帕奇工作了。然后新建这个文件 /var/www/html/test.php 内容为 </?php phpinfo(); /?> (去掉斜杠) 理论上,浏览器打开 HostIp/test.php 可以看到一个带有 php 版本信息的页面(之前我的本地 ubuntu PC 上这样试过时可以的)。 但是实际上,浏览器看到的是 403 - Forbidden。
是否 VPS 有特殊的设置?还是说访问 html 文件夹下的内容需要单独设置什么权限?
]]>httpd 版本 Server version: Apache/2.4.6 (CentOS) Server built: Apr 20 2018 18:10:38
有没有参考的配置文件,httpd.conf 和 ssl.conf 以及个人站点的配置
万分感谢
]]>我想别人在访问 http://192.168.89.41:8080,自动跳往 https://192.168.89.41:8080 但按目前调试的配置,访问 http://192.168.89.41:8080,浏览器会显示出一个 html 的代码明文:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> Reason: You're speaking plain HTTP to an SSL-enabled server port.<br /> Instead use the HTTPS scheme to access this URL, please.<br /> <blockquote>Hint: <a href="https://localhost:8080/"><b>https://localhost:8080/</b></a></blockquote></p> </body></html> 下面是节选 httpd.conf,配置有多个 VirtualHost,但是只想 8080 这个主机启用 https, mod_ssl 确定是装好的,证书已经使用上的了,
cat /etc/httpd/conf/httpd.conf
#8080,Test <VirtualHost *:8080> SSLEngine on SSLCertificateFile "/etc/httpd/conf/ssl_key/server.crt" SSLCertificateKeyFile "/etc/httpd/conf/ssl_key/server.key" SSLOptions StdEnvVars SSLProtocol all -SSLv2 -SSLv3 SSLHonorCipherOrder on SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW:!RC4: DocumentRoot /opt/test1 DocumentRoot "/opt/test1" <Directory "/opt/test1"> Options Indexes FollowSymLinks #Options FollowSymLinks #Options Indexes AllowOverride None Order allow,deny Allow from all </Directory> </VirtualHost> #9090,Test2 <VirtualHost *:9090> DocumentRoot /opt/test2 DocumentRoot "/opt/test2" <Directory "/opt/test2"> Options Indexes FollowSymLinks #Options FollowSymLinks #Options Indexes AllowOverride None Order allow,deny Allow from all </Directory> </VirtualHost> cat /opt/test1/.htaccess
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L] ]]>首先,我是按照这个教程去配置我的 app,目录结构是一样的,只是目录的名字不一样,这个是教程链接: https://www.digitalocean.com/community/tutorials/how-to-deploy-a-flask-application-on-an-ubuntu-vps
然后,我的 /etc/apache2/sites-available/Item-Catalog.conf 配置请参考此图: https://imgur.com/uaJ9IWm
问题是,当我 sudo a2ensite Item-Catalog.conf,再用 sudo service apache2 reload 后,会提示如下:
我觉得应该是我的配置写得哪里不对了,可以指点一二吗?万分感谢!
]]>然后,现在已经可以使用了。
现在想配置一套 测试环境,想着能不能在同一个域名下,再搭建一套 Laravel 的项目呢?
我今天下午试了一下,现在通过
a.xyz.com ==> laravel_1
b.xyz.com ==> laravel_2
Apache 添加两个虚拟主机,这么访问没有问题,通过两个二级域名,访问两套 Laravel 的项目。
但是由于微信的限制,需要认证,所以只能填写一个二级域名,现在手头也没有多余的认证公众号,所以就想着,能不能在同一个域名下,再搭建一套 Laravel 的环境?
a.xyz.com ==> laravel_1
a.xyz.com/test ==> laravel_2
像上面这样走。
不在 Laravel 里面配置 routes/web.php ,能不能通过 Apache 来转发?
1、先不考虑微信认证的问题,单纯说能不能这么搭建两套系统? 2、考虑微信认证的情况下,还可以行吗?还需要再配置一下微信认证的链接嘛?
谢谢!
]]>由于上海电信把家庭宽带 443 端口封掉,导致我的微信公众号“游戏打折情报”( yxdzqb )无法从微信服务器直连。于是我用 PHP 写了一个类似反向代理的转发器布署在外服务器上,用途是:把来自 80/443 的微信服务转发给家庭宽带的其它未封端口上。
这里做个广告:微信公众号 游戏打折情报 可以查询 Steam/杉果 /Humble Bundle 的打折 /最低价情况,还有一些免费领取的推送,不会推垃圾信息,可以自行查看推送历史。
一般情况下可以正常使用,但过了一段时间以后微信公众号会出现无响应(经判断是拒绝服务),重启 Apache 后即恢复正常。把 log 调到 Debug 模式以后发现如下可疑行:
中文 Windows 系统: [mpm_winnt:warn] (OS 64)指定的网络名不再可用。 AH00341: winnt_accept: Asynchronous AcceptEx failed. 英文 Windows 系统: (OS 64)The specified network name is no longer available. AH00341: winnt_accept: Asynchronous AcceptEx failed. 在 MPM 里调试了很久没找到问题,后来找到了这个讨论: https://communities.ca.com/thread/241692373
解决方法是升级到 Apache 2.4.24 以后的版本,如果执行的是 2.4.23 或以前的版本,也可以在 httpd.conf 中改如下行:
AcceptFilter https connect AcceptFilter http connect 我看到很多中文网站(都是抄的同一个来源)说:
加入: Win32DisableAcceptEx 或者: AcceptFilter https none AcceptFilter http none 并不完全正确,Win32DisableAcceptEx 只适用于 Apache 2.2 而 AcceptFilter https none 不用 Filter 会有一些安全风险。
在这里记录一下分享给大家,也以免自己忘了。
]]>httpd.conf 里面的配置是 <VirtualHost :80> DocumentRoot /www/www/ ProxyPassMatch ^/(..php)$ fcgi://127.0.0.1:9000/www/www/$1 DirectoryIndex index.html index.php </virtualhost>
比如在.htaccess 中写入 <Files "wp-login.php"> Require all denied </files>
发现还是可以访问的,是不是因为 php 请求以及被转发到后端 fcgi 进程了? 那要怎么弄呢
]]>Options +FollowSymlinks -Multiviews FollowSymlinks 会影响性能吗? 每次都检查 符号链接 Multiviews 啥意思? 第二条问题:
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] E=PATH_INFO:$1 这个啥意思?
]]>ftp 根目录设置为 /var/www/username
权限给了 username:www-data
然后在 apache 里新建了站点,站点根目录也设定为 /var/www/username 然后整个目录及下属给了 755 的权限
安装 wordpress,发现没有写入的权限,在站点里无法写入权限,提示需要机器的 ftp 账号和密码
之前自己的站,因为不需要给自己开 ftp 账号,从来都是用 root 连接机器的,所以自己站的目录都给了 www-data:www-data
希望懂行的大佬们指引指引
]]>百度查询了 Rewrite 重写规则,没有发现有有关实现需求的内容,特来 V 站询问各位大牛
]]>RewriteEngine on RewriteCond %{REQUEST_URI} !^(/aaa/bbb)$ [NC] RewriteCond %{SERVER_PORT} =80 [NC] RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [NC,L,R=301] RewriteRule !\.(dfk|tsv|pdf|PDF|js|ico|gif|GIF|jpg|JPG|jpeg|JPEG|png|PNG|css|src|csv|txt|TXT|xml|XML|xls|XLS|php|PHP|json|ttf|woff|woff2|svg|swf|eot|htc|lic|mp4)$ index.php [NC,L] 当我使用 80 端口并且 URI 不为 /aaa/bbb 的时候 不跳转 https
这样写怎么直接跳到 https://www.test.com/index.php 上面了?
]]>求大神指点
]]>网站根路径下有一个.htaccess ,根目录下的文件夹 test 中也有一个.htaccess ,那么,访问 http://localhost/test/xyz 会有什么结果呢( test 下不存在名为 xyz 的文件),或者说如果两个.htaccess 都会对错误的访问进行处理,谁的优先级更高?
根路径下:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteRule ^.*$ https://baidu.com [R=301,L]
test 路径下:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [L]
RewriteRule ^.*$ https://bing.com [R=301,L]
测试结果是 test 路径下的.htaccess 起效了,也就是在浏览器上访问 http://localhost/test/xyz 实际上跳转到了 Bing 。当我把 test 下的.htaccess 移除后则会跳转到 Baidu.
罗列一些细节
$N 匹配的是 RewriteRule 中正则匹配的内容(RewriteRule backreferences),而%N 匹配的是 RewriteCond 中正则匹配的内容(RewriteCond backreferences),而\N 则是正则表达式中原生的反向引用 有时候出现的::并不是特殊的符号,只是方便使用的分隔符而已,喜欢的话可以用##等替代 12 RewriteCond TestString CondPattern 中, TestString 可以是以下内容构成的:
RewriteRule backreferences
RewriteCond backreferences
RewriteMap expansions 3
Server-Variables 4
RewriteRule Pattern Substitution [flags]中, pattern 匹配的是什么?就我的理解来说,如果访问的链接是 http://localhost:80/test/hello/hahahaha?x=100 ,
如果它由网站根目录下的.htaccess 来处理,它匹配的内容就是 test/hello/hahahaha; 如果它由根目录 /test/.htaccess 来处理,它匹配的内容就是 hello/hahahaha
What is matched?5 In VirtualHost context, The Pattern will initially be matched against the part of the URL after the hostname and port, and before the query string (e.g. “/app1/index.html ”). In Directory and htaccess context, the Pattern will initially be matched against the filesystem path, after removing the prefix that led the server to the current RewriteRule (e.g. “ app1/index.html ” or “ index.html ” depending on where the directives are defined). If you wish to match against the hostname, port, or query string, use a RewriteCond with the %{HTTP_HOST}, %{SERVER_PORT}, or %{QUERY_STRING} variables respectively. In any case, remember that regular expressions are substring matches. That is, you don ’ t need the regex to describe the entire string, just the part that you wish to match. Thus, using a regex of . is often sufficient rather than .*, and the regex abc is not the same as ^abc$.
以后再补充。。。。。
]]>使用的.htaccess 规则是官方提供的
https://github.com/symphonycms/symphony-2/blob/master/install/includes/htaccess.txt
因为这个规则是针对网站在根目录的,而我的 bluehost 下有多个网站,所以我就把里面的 RewriteBase / 改成了 RewriteBase /abc.com/
现在导致的问题是,访问其中的网站,首页可以显示,但是里面的链接的 url 多次重叠,比如我有个网站 eyesion.com ,进去之后随便访问一个链接, url 都变成了 http://www.eyesion.com/eyesion.com/eyesion.com/eyesion.com/index.php/?symphony-page=eyesion.com/eyesion.com/eyesion.com/eyesion.com/index.php/&
这样的,想问下,这个问题要怎么解决,谢谢。
]]>是不是被挂马了呀?
]]>