应用架构之【Nginx+Keepalived】Web 集群方案

Nginx 是一个开源(遵循 BSD 协议)、高性能、高可靠的 Web 和反向代理服务器。主要用于 Web 应用的缓存和负载均衡,支持热部署、占用内存少、并发能力强,能支持高达 5w 个并发连接数。

Nginx 主要应用场景包括:
1、静态资源(静态 HTML 网站、文件、图片、音视频)的 Web 服务器;
2、Web 应用和服务的反向代理(负载均衡、缓存)服务器。

Keepalived是一个开源(遵循 GPLv2 协议)的、基于 VRRP 协议的轻量级服务高可用和负载均衡方案,提供避免服务器单点故障和请求分流的能力。它为 Nginx 扩展了高可用能力,共同组成完整的 Web 服务集群模式(高可用+负载均衡)。

目录

1.集群部署拓扑图

2.Web 应用服务器部署

3.Nginx 代理服务器的安装和配置

4.Keepalived 高可用中间件的安装和配置

附录一 Nginx 配置文件详解

附录二 Nginx 配置虚拟主机头

附录三 扩展 Nginx 客户端身份认证

附录四 扩展 Nginx 跨域访问

附录五 扩展 Nginx 网页压缩

附录六 Nginx 四层网络协议负载均衡


1.集群部署拓扑图

应用架构之【Nginx+Keepalived】Web 集群方案_第1张图片
Web应用集群部署拓扑图

网络资源规划:

1、Web 应用服务器节点

节点名 主机名 IP:PORT 程序 操作系统
Web 集群节点-1 Web-1 192.168.216.1:80 Python HttpServer CentOS8
Web 集群节点-2 Web-2 192.168.216.2:80 Python HttpServer CentOS8
Web 集群节点≥3 Web-3 192.168.216.3:80 Python HttpServer CentOS8

2、Nginx 高可用服务器节点

节点名 主机名 IP:PORT 程序 操作系统
Nginx 集群节点-1 Proxy-1 192.168.216.128:80 / 112 Nginx / Keepalived CentOS8
Nginx 集群节点≥2 Proxy-2 192.168.216.129:80 / 112 Nginx / Keepalived CentOS8

Keepalived Virtual IP:192.168.216.130。


2.Web 应用服务器部署

Web 应用服务器可以使用任何中间件部署 WebSite 、WebApp 或者是通过 Http 协议提供服务的资源。需要注意的是:作为 Web 负载均衡的节点,发布的服务通常需要具备完全一致性,包括但不限于:数据源一致性、程序一致性、配置一致性。

常见的 Web 开源中间件:

产品 独立部署 SpringBoot 嵌入 静态资源 静态站点 JavaWeb SSL
Tomcat
Undertow ×
Jetty ×
Nginx × ×
Apache Httpd × ×
Python HttpServer × × ×

本例采用 Python HttpServer 搭建静态站点的演示环境。

在各个 "Web 应用服务器节点" (Web-1、Web-2、Web-3)上制作、发布静态站点。以节点 "Web-1" 为例:

1、在用户主目录下创建静态站点。

使用文本编辑器创建 HTML 文件:

[centos@Web-1 ~ ]$ mkdir website
[centos@Web-1 ~ ]$ gedit ~/website/index.html

在文件中编写以下内容并保存:



  
    
    website-1
  
  
    【Nginx+Keepalived】Web 集群演示
  

注意: 为了演示 Nginx 负载均衡特性,""中定义各个站点的标识,三个 Web 站点依次为:"website-1"、"website-2"、"website-3";"<body />"中定义的内容必须一致,体现发布服务的一致性。</strong></p> <p><strong>2、进入静态站点目录并发布站点。</strong></p> <pre><code>[centos@Web-1 ~ ]$ cd website [centos@Web-1 website ]$ sudo python3 -m http.server 80 </code></pre> <p><strong>3、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"80"端口访问服务器。</strong></p> <pre><code>[centos@Web-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent [centos@Web-1 ~ ]$ sudo firewall-cmd --reload </code></pre> <p><strong>4、使用浏览器访问 Web 服务。</strong></p> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 593px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/12420747a0f740309e16605470234ded.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/12420747a0f740309e16605470234ded.jpg" width="650" height="339" alt="应用架构之【Nginx+Keepalived】Web 集群方案_第2张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"> Web 服务测试页面 </div> </div> <p><strong>注意:其他 "Web 应用服务器节点" 全部需要按照以上步骤配置。</strong></p> <hr> <h1>3.Nginx 代理服务器的安装和配置</h1> <p>在各个 "Proxy 集群节点" (Proxy-1、Proxy-2)安装、配置 Nginx,以 "Proxy-1" 为例:</p> <p><strong>1、打开 Nginx 下载页面【http://nginx.org/en/download.html】,下载 Nginx 的源代码 tar.gz 包到用户主目录中。</strong></p> <div class="image-package"> <div class="image-container" style="max-width: 560px; max-height: 662px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/25792f2785844fce82821927ba954dd1.png" target="_blank"><img src="http://img.e-com-net.com/image/info10/25792f2785844fce82821927ba954dd1.png" width="560" height="662" alt="应用架构之【Nginx+Keepalived】Web 集群方案_第3张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"> Nginx 下载页面 </div> </div> <p><strong>2、验证并安装依赖软件。通过源代码编译的方式安装 Nginx,需要依赖软件"make"、"gcc"、"pcre"、"pcre-devel"、"zlib"、"zlib-devel"、"openssl"、"openssl-devel",验证或安装依赖软件。</strong></p> <pre><code>[centos@Proxy-1 ~]$ sudo dnf install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel </code></pre> <p>补充知识:</p> <p>① "gcc"是一个C/C++、FORTRAN、JAVA、OBJC、ADA等多种语言的编译器,用来将源代码编译成可发布的软件程序。</p> <p>② "make"是一个工程管理工具,能够根据 Makefile 中的脚本执行编译、安装流程。</p> <p>③ "pcre"是一个正则表达式函数库;"pcre-devel"是它的开发库。</p> <p>④ "zlib"是一个数据压缩函数库;"zib-devel"是它的开发库。</p> <p>⑤ "openssl"是一个实现安全通信,避免窃听,同时确认另一端连接者身份的软件程序;"openssl-devel"是它的开发库。</p> <p><strong>3、解压缩 Nginx 的源代码 tar 包到用户主目录下。</strong></p> <pre><code>[centos@Proxy-1 ~]$ tar -zxvf nginx-1.18.0.tar.gz [centos@Proxy-1 ~]$ ll drwxr-xr-x. 8 centos centos 4096 4月 21 22:09 nginx-1.18.0 </code></pre> <p><strong>4、安装 Nginx,进入源代码目录,配置、编译、安装程序。</strong></p> <pre><code>[centos@Proxy-1 ~]$ cd nginx-1.18.0 [centos@Proxy-1 nginx-1.18.0]$ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream Configuration summary + using system PCRE library + OpenSSL library is not used + using system zlib library nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx/conf" nginx configuration file: "/usr/local/nginx/conf/nginx.conf" nginx pid file: "/usr/local/nginx/logs/nginx.pid" nginx error log file: "/usr/local/nginx/logs/error.log" nginx http access log file: "/usr/local/nginx/logs/access.log" nginx http client request body temporary files: "client_body_temp" nginx http proxy temporary files: "proxy_temp" nginx http fastcgi temporary files: "fastcgi_temp" nginx http uwsgi temporary files: "uwsgi_temp" nginx http scgi temporary files: "scgi_temp" [centos@Proxy-1 nginx-1.18.0]$ make [centos@Proxy-1 nginx-1.18.0]$ sudo make install [centos@Proxy-1 ~]$ ll /usr/local/nginx drwxr-xr-x. 2 root root 4096 5月 18 09:39 conf drwxr-xr-x. 2 root root 40 5月 18 09:39 html drwxr-xr-x. 2 root root 6 5月 18 09:39 logs drwxr-xr-x. 2 root root 19 5月 18 09:39 sbin </code></pre> <p>程序安装目录是"/usr/local/nginx"。</p> <p><strong>5、设置 Nginx 配置文件参数。</strong></p> <p>使用文本编辑器打开配置文件:</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf </code></pre> <p>修改或验证文件中的以下参数并保存(七层代理):</p> <pre><code>http { # 负载均衡 upstream website { server 192.168.216.1:80 weight=1; server 192.168.216.2:80 weight=1; server 192.168.216.3:80 weight=1; } server { # 监听端口 listen 80; # 服务器域名(主机头) server_name localhost; # 代理 Web 服务的 Url 前缀,一般是 Web 服务的虚拟目录(可以是正则表达式)。 location / { proxy_pass http://website; } } } </code></pre> <p>在文件中追加以下参数并保存(四层代理):</p> <pre><code>stream { # 负载均衡 upstream website { server 192.168.216.1:80 weight=1; server 192.168.216.2:80 weight=1; server 192.168.216.3:80 weight=1; } server { # 监听端口 listen 80; # 代理服务位置 proxy_pass website; } } </code></pre> <blockquote> <p><strong>注意:两种方案二选一即可。</strong></p> <p><strong>Web 代理一般使用七层协议代理,以便于实现主机头等站点路由功能;</strong><br> <strong>四层协议可用于 Web 代理以外的负载均衡场景,如:MySQL 数据库只读连接等。</strong></p> </blockquote> <p><strong>6、配置 Nginx 开机自启动。</strong></p> <p>使用文本编辑器创建配置文件:</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo gedit /usr/lib/systemd/system/nginx.service </code></pre> <p>编写文件内容并保存如下:</p> <pre><code>[Unit] Description=Nginx After=syslog.target network.target [Service] Type=forking User=root Group=root ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target </code></pre> <p>设置开机启动:</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl daemon-reload [centos@Proxy-1 ~ ]$ sudo systemctl enable nginx.service </code></pre> <p><strong>7、启动 Nginx 服务。</strong></p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl start nginx.service </code></pre> <p><strong>8、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"80"端口(Nginx 默认端口)访问服务器。</strong></p> <pre><code>[centos@Proxy-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent [centos@Proxy-1 ~ ]$ sudo firewall-cmd --reload </code></pre> <blockquote> <p>注意:其他 "Proxy 集群节点" 全部需要按照以上步骤配置。</p> </blockquote> <p><strong>9、Nginx 运维管理。</strong></p> <p>1)启动 Nginx 服务(任选一种方式)</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl start nginx.service </code></pre> <p>或者</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo -u /usr/local/nginx/sbin/nginx </code></pre> <p>2)停止 Nginx 服务(任选一种方式)</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl stop nginx.service </code></pre> <p>或者</p> <pre><code>[centos@Proxy-1 ~ ]$ /usr/local/nginx/sbin/nginx -s quit </code></pre> <p>3)重启 Nginx 服务</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl restart nginx.service </code></pre> <p>或者</p> <pre><code>[centos@Proxy-1 ~ ]$ /usr/local/nginx/sbin/nginx -s reload </code></pre> <p>4)查看 Nginx 服务状态</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl status nginx.service </code></pre> <p>或者</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo ps -ef | grep nginx root 119777 1 0 10:16 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx [centos@Proxy-1 ~ ]$ sudo netstat -ntap | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 119777/nginx: maste [centos@Proxy-1 ~ ]$ sudo tail /usr/local/nginx/logs/error.log [centos@Proxy-1 ~ ]$ sudo tail /usr/local/nginx/logs/access.log </code></pre> <p>5)启用 Nginx 服务开机自启动</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl enable nginx.service </code></pre> <p>6)禁用 Nginx 服务开机自启动</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl disable nginx.service </code></pre> <h2>4.Keepalived 高可用中间件的安装和配置</h2> <p>在各个 "Proxy 集群节点" (Proxy-1、Proxy-2)安装、配置 Keepalived,以 "Proxy-1" 为例:</p> <p><strong>1、安装 EPEL 的 Yum源。</strong></p> <p>使用文本编辑器创建仓库配置文件:</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo </code></pre> <p>在文件中编写以下内容并保存:</p> <pre><code>[epel-modular] name=Extra Packages for Enterprise Linux Modular $releasever - $basearch baseurl=http://mirrors.aliyun.com/epel/$releasever/Modular/$basearch enabled=1 gpgcheck=1 gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8 [epel] name=Extra Packages for Enterprise Linux $releasever - $basearch baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch enabled=1 gpgcheck=1 gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8 </code></pre> <p>更新 Yum 源:</p> <pre><code>[centos@Proxy-1 ~]$ sudo dnf clean all [centos@Proxy-1 ~]$ sudo dnf makecache Extra Packages for Enterprise Linux Modular 8 - 429 kB/s | 118 kB 00:00 Extra Packages for Enterprise Linux 8 - x86_64 3.7 MB/s | 6.9 MB 00:01 元数据缓存已建立。 </code></pre> <blockquote> <p>EPEL(Extra Packages for Enterprise Linux)是企业级 Linux 操作系统的扩展包仓库,为 Redhat/CentOS系统提供大量的额外软件包。</p> </blockquote> <p><strong>2、安装 Keepalived。</strong></p> <pre><code>[centos@Proxy-1 ~]$ sudo dnf install keepalived </code></pre> <p>程序安装目录是"/usr/sbin",配置文件目录是"/etc/keepalived"。</p> <p><strong>3、设置 Keepalived 配置文件参数。</strong></p> <p>使用文本编辑器打开配置文件:</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo gedit /etc/keepalived/keepalived.conf </code></pre> <p>在文件中编写以下内容并保存:</p> <pre><code># 定义全局配置 global_defs { # 本地节点 ID 标识,一般设置为主机名。 router_id proxy-1 } # 定义周期性执行的脚本,脚本的退出状态码会被调用它的所有的 vrrp_instance 记录。 vrrp_script chk_nginx { # 执行脚本的路径。 script "/etc/keepalived/nginx_check.sh" # 脚本执行的间隔(单位是秒)。默认为1s。 interval 2 # 当脚本调整优先级,从 -254 到 254。默认为2。 # 1. 如果脚本执行成功(退出状态码为0),weight大于0,则priority增加。 # 2. 如果脚本执行失败(退出状态码为非0),weight小于0,则priority减少。 # 3. 其他情况下,priority不变。 weight -20 # 当脚本执行超过时长(单位是秒)则被认为执行失败。 # 运行脚本的用户和组。 user root root # timeout 30 # 当脚本执行成功到设定次数时,才认为是成功。 # rise 1 # 当脚本执行失败到设定次数时,才认为是失败。 # fall 3 } # 定义虚拟路由,可以定义多个。 vrrp_instance VI_1 { # 本地节点初始状态,包括 MASTER(主节点) 和 BACKUP (备节点)。 state MASTER # 本地节点绑定虚拟 IP 的网络接口。 interface ens33 # 本地节点优先级,优先级高的节点将动态变成 MASTER 节点,接管 VIP 。初始状态下,MASTER 节点的优先级必须高于 BACKUP 节点。 priority 100 # VRRP 实例 ID,范围是0-255。同一集群的所有节点应设置一致的值。 virtual_router_id 216 # 组播信息发送时间间隔。同一集群的所有节点必须设置一样,默认为1秒。 advert_int 1 # 设置验证信息。同一集群的所有节点必须一致 authentication { # 指定认证方式。PASS 表示简单密码认证(推荐);AH:IPSEC认证(不推荐)。 auth_type PASS # 指定认证所使用的密码,最多8位。 auth_pass 1111 } # 声明调用已定义的 vrrp_script 脚本。 track_script { chk_nginx } # 定义虚拟 IP 地址。 virtual_ipaddress { 192.168.216.130 } } # 定义对外提供服务 LVS (负载均衡)的 VIP 和 端口(当端口号设置为【0】时,表示所有端口),只实现高可用时可不配置。 # 注意:本方案中,通过 Nginx 实现 Web 负载均衡,Keepalived 只实现高可用,因此负载均衡既可以不配置,也可以配置成 Nginx 的负载均衡;当没有 Ngxin 时,可以直接配置成 Web 的负载均衡。 virtual_server 192.168.216.130 80 { # 设置健康检查时间,单位是秒 delay_loop 6 #负载均衡调度算法 lb_algo rr # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式 lb_kind DR # VIP 子网掩码 nat_mask 255.255.255.0 # 会话保持时间,一定时间之内用户无响应则下一次用户请求时需重新路由,一般设为0,表示不需要 persistence_timeout 0 # 网络协议 protocol TCP # 定义后端 RealServer 的真实服务器属性,IP 地址和端口(当端口号设置为【0】时,表示所有端口) real_server 192.168.216.128 80 { # 配置节点权值,数字越大权重越高 weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.216.129 80 { weight 1 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } </code></pre> <p><strong>初始化的主节点和备节点的区别体现在以下参数中:</strong></p> <ul> <li>初始主节点</li> </ul> <pre><code>vrrp_instance VI_1 { # 必须设置为 MASTER 。 state MASTER # 必须设置为最大值。 priority 100 } </code></pre> <ul> <li>初始备节点</li> </ul> <pre><code>vrrp_instance VI_1 { # 必须设置为 BACKUP 。 state BACKUP # 必须设置为小于主节点的值。 priority 90 } </code></pre> <p><strong>4、创建或编辑 Nginx 检测脚本文件。文件路径对应配置文件中 vrrp_script 的 script 设置值。</strong></p> <p>使用文本编辑器创建脚本文件:</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo gedit /etc/keepalived/nginx_check.sh </code></pre> <p>在脚本文件中编写以下内容并保存:</p> <pre><code>#!/bin/bash counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /usr/local/nginx/sbin/nginx sleep 2 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then killall -9 keepalived fi fi </code></pre> <p>给脚本文件增加可执行权限:</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo chmod 755 /etc/keepalived/nginx_check.sh </code></pre> <p><strong>5、配置 Keepalived 系统服务。</strong></p> <p>使用文本编辑器创建配置文件:</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo gedit /usr/lib/systemd/system/keepalived.service </code></pre> <p>验证或修改文件内容并保存如下:</p> <pre><code>[Unit] Description=LVS and VRRP High Availability Monitor After=network-online.target syslog.target nginx.service Wants=network-online.target Requires=nginx.service [Service] Type=forking User=root Group=root PIDFile=/var/run/keepalived.pid KillMode=process EnvironmentFile=-/etc/sysconfig/keepalived ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS ExecReload=/bin/kill -HUP $MAINPID ExecStop=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target </code></pre> <p>重新加载系统服务管理器:</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl daemon-reload </code></pre> <p><strong>6、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"112"端口(Keepalived 默认端口)访问服务器。</strong></p> <pre><code>[centos@Proxy-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=112/tcp --permanent [centos@Proxy-1 ~ ]$ sudo firewall-cmd --reload </code></pre> <p><strong>7、启动/重启 Keepalived 服务(不建议设置为开机自启动)。</strong></p> <p>启动 Keepalived 服务之前,应确保已正确启动了各节点的 Nginx 服务。各节点的启动或重启的顺序为:① 启动 Keepalived 主节点;② 依次启动 Keepalived 备节点。</p> <pre><code>[centos@Proxy-1 ~ ]$ sudo systemctl restart keepalived.service </code></pre> <p><strong>8、启动 Keepalived 可能因为各种未知的原因失败,主要是由于引发了 SELinux 异常。有关如何解决 SELinux 引起的异常,请阅读文章《RedHat/CentOS8【SELinux】引起的安全策略问题解决方案》,文章地址【https://www.jianshu.com/p/a13f974f8bae】。</strong></p> <blockquote> <p>注意:其他 "Proxy 集群节点" 全部需要按照以上步骤配置。</p> </blockquote> <p><strong>8、使用浏览器通过虚拟 IP 访问 Web 代理服务。</strong><br> </p> <div class="image-package"> <div class="image-container" style="max-width: 700px; max-height: 593px;"> <div class="image-view"> <a href="http://img.e-com-net.com/image/info10/59e638acaaa24ed188574f462ff95a77.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info10/59e638acaaa24ed188574f462ff95a77.jpg" width="650" height="339" alt="应用架构之【Nginx+Keepalived】Web 集群方案_第4张图片" style="border:1px solid black;"></a> </div> </div> <div class="image-caption"> 通过虚拟 IP 访问 Web 代理服务 </div> </div> <p></p> <hr> <h1>附录一 Nginx 配置文件详解</h1> <p>位于程序配置目录 "/usr/local/nginx/conf" 下的 "nginx.conf" 是 Nginx 的主配置文件。主配置文件的参数包括:</p> <pre><code>#定义Nginx运行的用户和用户组 user root root; #nginx进程数,建议设置为等于CPU总核心数。 worker_processes 8; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log /var/log/nginx/error.log info; #进程文件 pid /var/run/nginx.pid; #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。 worker_rlimit_nofile 65535; #工作模式与连接数上限 events{ #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。 use epoll; #单个进程最大连接数(最大连接数=连接数*进程数) worker_connections 65535; } #四层负载均衡(以 MySQL 为例) stream{ upstream mysql { server 192.168.80.121:3306 weight=1; server 192.168.80.122:3306 weight=2; server 192.168.80.123:3306 weight=3; } server { #监听端口 listen 3306; proxy_pass mysql; } } #设定http服务器 http{ include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型 charset utf-8; #默认编码 server_names_hash_bucket_size 128; #服务器名字的hash表大小 client_header_buffer_size 32k; #上传文件大小限制 large_client_header_buffers 4 64k; #设定请求缓 client_max_body_size 8m; #设定请求缓 #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。 sendfile on; autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。 tcp_nopush on; #防止网络阻塞 tcp_nodelay on; #防止网络阻塞 keepalive_timeout 120; #长连接超时时间,单位是秒 #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。 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 128k; #gzip模块设置 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_comp_level 2; #压缩等级 gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用 #upstream的动态负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 upstream www.example.com { server 192.168.80.121:80 weight=1; server 192.168.80.122:80 weight=2; server 192.168.80.123:80 weight=3; } #虚拟主机的配置 server { #监听端口 listen 80; #域名可以有多个,用空格隔开 server_name www.example.com example.com; #设置默认主页 index index.html index.htm index.php; #所有静态文件直接访问的物理磁盘的位置 root /data/www/example; location ~ .*\.(php|php5)?${ fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } #图片缓存时间设置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${ expires 10d; } #JS和CSS缓存时间设置 location ~ .*\.(js|css)?${ expires 1h; } #日志格式设定 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 /var/log/nginx/ha97access.log access; #对 "/" 启用反向代理 location / { proxy_pass www.example.com # http://127.0.0.1:80; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以下是一些反向代理的配置,可选。 proxy_set_header Host $host; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } #设定查看Nginx状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 } #本地动静分离反向代理配置 #所有jsp的页面均交由tomcat或resin处理 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } #所有静态文件由nginx直接读取不经过tomcat或resin location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d; } location ~ .*.(js|css)?$ { expires 1h; } } } </code></pre> <p><strong>说明:</strong></p> <p><strong>1、"server" 包含多个 "location","location" 属性用于匹配 uri,语法:</strong></p> <pre><code>location [ = | ~ | ~* | ^~] uri { ... } </code></pre> <ul> <li>【=】表示精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找;</li> <li>【^~】表示如果该符号后面的字符是最佳匹配,用于不含正则表达式的 uri 前缀,如果匹配成功,不再进行后续的查找;</li> <li>【~】表示用该符号后面的正则去匹配路径,区分大小写;</li> <li>【~*】表示用该符号后面的正则去匹配路径,不区分大小写。跟 ~ 优先级都比较低,如有多个 "location" 的正则能匹配的话,则使用正则表达式最长的那个。</li> <li>如果 uri 包含正则表达式,则必须要有 ~ 或 ~* 标志。</li> </ul> <p><strong>2、Nginx 预定义了一些全局变量,可以在配置的任何位置使用它们,如下表:</strong></p> <table> <thead> <tr> <th>变量名</th> <th>功能说明</th> </tr> </thead> <tbody> <tr> <td>$host</td> <td>请求信息中的 Host,如果请求中没有 Host 行,则等于设置的服务器名,不包含端口</td> </tr> <tr> <td>$request_method</td> <td>客户端请求类型,如 GET、POST</td> </tr> <tr> <td>$remote_addr</td> <td>客户端的 IP 地址</td> </tr> <tr> <td>$args</td> <td>请求中的参数</td> </tr> <tr> <td>$arg_PARAMETER</td> <td>GET 请求中变量名 PARAMETER 参数的值,例如:$http_user_agent(Uaer-Agent 值)</td> </tr> <tr> <td>$content_length</td> <td>请求头中的 Content-length 字段</td> </tr> <tr> <td>$http_user_agent</td> <td>客户端agent信息</td> </tr> <tr> <td>$http_cookie</td> <td>客户端 cookie 信息</td> </tr> <tr> <td>$remote_addr</td> <td>客户端的 IP 地址</td> </tr> <tr> <td>$remote_port</td> <td>客户端的端口</td> </tr> <tr> <td>$server_protocol</td> <td>请求使用的协议,如 HTTP/1.0、HTTP/1.1</td> </tr> <tr> <td>$server_addr</td> <td>服务器 IP 地址</td> </tr> <tr> <td>$server_name</td> <td>服务器名称</td> </tr> <tr> <td>$server_port</td> <td>服务器的端口号</td> </tr> <tr> <td>$scheme</td> <td>HTTP 方法(如http,https)</td> </tr> </tbody> </table> <p><strong>其他预定义变量可在互联网上查询学习。</strong></p> <hr> <h1>附录二 Nginx 配置虚拟主机头</h1> <p>使用文本编辑器打开配置文件:</p> <pre><code>[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf </code></pre> <p>修改或验证文件中的以下参数并保存:</p> <pre><code>http { server { # 监听端口 listen 80; # 服务器域名(主机头) server_name www.web1.net; # 代理 Web 服务的 Url 前缀,一般是 Web 服务的虚拟目录(可以是正则表达式)。 location / { proxy_pass http://127.0.0.1:81; } } server { # 监听端口 listen 80; # 服务器域名(主机头) server_name www.web2.net; # 代理 Web 服务的 Url 前缀,一般是 Web 服务的虚拟目录(可以是正则表达式)。 location / { proxy_pass http://127.0.0.1:82; } } } </code></pre> <p><strong>注意:</strong></p> <ul> <li>两个 "server" 使用 "server_name" 定义的主机头来区分。 客户端在访问时,只能通过主机头定义的域名访问(如:http://www.web1.net 或者 http://www.web1.net)。客户端需要在本地 DNS 文件(/etc/hosts)中定义域名解析记录,或者在网卡中设置能够解析主机头的私有 DNS 服务器。</li> <li>如果客户端通过 IP 地址访问(如:http://192.168.216.128 ),则等同于使用最后一个 "server" 的配置(本例中为: "server_name" 为 "www.web2.net" 的 "server")。</li> </ul> <p><strong>2、重新启动 Nginx 服务。</strong></p> <pre><code>[centos@host ~ ]$ sudo systemctl restart nginx.service </code></pre> <hr> <h1>附录三 扩展 Nginx 客户端身份认证</h1> <p><strong>1、安装 httpd-tools 。</strong></p> <pre><code>[centos@host ~ ]$ sudo dnf install httpd-tools </code></pre> <p><strong>2、创建账户/口令数据文件。</strong></p> <pre><code>[centos@host ~ ]$ sudo htpasswd -bc /usr/local/nginx/conf/auth.db root password </code></pre> <p>指令格式为:htpasswd -b[c] <数据文件位置> <账号> <口令>。参数 b 表示创建一组账号/口令,参数 c 表示创建数据文件。</p> <p><strong>3、设置 Nginx 配置文件参数。</strong></p> <p>使用文本编辑器打开配置文件:</p> <pre><code>[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf </code></pre> <p>修改或验证文件中的以下参数并保存:</p> <pre><code>http { server { ...... location / { ...... auth_basic "input password"; auth_basic_user_file /usr/local/nginx/conf/auth.db; } } } </code></pre> <p><strong>4、重新启动 Nginx 服务。</strong></p> <pre><code>[centos@host ~ ]$ sudo systemctl restart nginx.service </code></pre> <hr> <h1>附录四 扩展 Nginx 跨域访问</h1> <p><strong>1、设置 Nginx 配置文件参数。</strong></p> <p>使用文本编辑器打开配置文件:</p> <pre><code>[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf </code></pre> <p>修改或验证文件中的以下参数并保存:</p> <pre><code>http { server { ...... # 全局变量获得当前请求origin,带cookie的请求不支持 "*" 。 add_header 'Access-Control-Allow-Origin' $http_origin; # 设置为 "true" 表示传递 cookie 。 add_header 'Access-Control-Allow-Credentials' 'true'; # 允许跨域请求的方法。 add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; # 允许请求的 header,可以为 "*" 。 add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; if ($request_method = 'OPTIONS') { # OPTIONS 请求的有效期,在有效期内不用发出另一条预检请求 add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=utf-8'; add_header 'Content-Length' 0; return 204; } location / { ...... } } } </code></pre> <p><strong>2、重新启动 Nginx 服务。</strong></p> <pre><code>[centos@host ~ ]$ sudo systemctl restart nginx.service </code></pre> <hr> <h1>附录五 扩展 Nginx 网页压缩</h1> <p><strong>1、设置 Nginx 配置文件参数。</strong></p> <p>使用文本编辑器打开配置文件:</p> <pre><code>[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf </code></pre> <p>修改或验证文件中的以下参数并保存:</p> <pre><code>http { server { ...... # 是否开启 gzip , on 表示开启,off 表示禁用。默认off。 gzip on; # 压缩 MIME 文件的类型,其中 text/html 被系统强制启用。 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; location / { ...... } } } </code></pre> <p><strong>2、重新启动 Nginx 服务。</strong></p> <pre><code>[centos@host ~ ]$ sudo systemctl restart nginx.service </code></pre> <hr> <h1>附录六 Nginx 四层网络协议负载均衡</h1> <p><strong>1、设置 Nginx 配置文件参数。</strong></p> <p>使用文本编辑器打开配置文件:</p> <pre><code>[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf </code></pre> <p>修改或验证文件中的以下参数并保存:</p> <pre><code>#四层负载均衡(以 MySQL 为例) stream{ upstream mysql { server 192.168.80.121:3306 weight=1; server 192.168.80.122:3306 weight=2; server 192.168.80.123:3306 weight=3; } server { #监听端口 listen 3306; proxy_pass mysql; } } </code></pre> <p><strong>2、重新启动 Nginx 服务。</strong></p> <pre><code>[centos@host ~ ]$ sudo systemctl restart nginx.service </code></pre> <hr> </article> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1401530056920059904"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(应用架构之【Nginx+Keepalived】Web 集群方案)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1943992776169418752.htm" title="Flask框架入门:快速搭建轻量级Python网页应用" target="_blank">Flask框架入门:快速搭建轻量级Python网页应用</a> <span class="text-muted">「已注销」</span> <a class="tag" taget="_blank" href="/search/python-AI/1.htm">python-AI</a><a class="tag" taget="_blank" href="/search/python%E5%9F%BA%E7%A1%80/1.htm">python基础</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%AB%99%E7%BD%91%E7%BB%9C/1.htm">网站网络</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>转载:Flask框架入门:快速搭建轻量级Python网页应用1.Flask基础Flask是一个使用Python编写的轻量级Web应用框架。它的设计目标是让Web开发变得快速简单,同时保持应用的灵活性。Flask依赖于两个外部库:Werkzeug和Jinja2,Werkzeug作为WSGI工具包处理Web服务的底层细节,Jinja2作为模板引擎渲染模板。安装Flask非常简单,可以使用pip安装命令</div> </li> <li><a href="/article/1943991891796226048.htm" title="Python Flask 框架入门:快速搭建 Web 应用的秘诀" target="_blank">Python Flask 框架入门:快速搭建 Web 应用的秘诀</a> <span class="text-muted">Python编程之道</span> <a class="tag" taget="_blank" href="/search/Python%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD%E4%B8%8E%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">Python人工智能与大数据</a><a class="tag" taget="_blank" href="/search/Python%E7%BC%96%E7%A8%8B%E4%B9%8B%E9%81%93/1.htm">Python编程之道</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>PythonFlask框架入门:快速搭建Web应用的秘诀关键词Flask、微框架、路由系统、Jinja2模板、请求处理、WSGI、Web开发摘要想快速用Python搭建一个灵活的Web应用?Flask作为“微框架”代表,凭借轻量、可扩展的特性,成为初学者和小型项目的首选。本文将从Flask的核心概念出发,结合生活化比喻、代码示例和实战案例,带你一步步掌握:如何用Flask搭建第一个Web应用?路由</div> </li> <li><a href="/article/1943991135068286976.htm" title="k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper" target="_blank">k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper</a> <span class="text-muted">云游</span> <a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/helm/1.htm">helm</a><a class="tag" taget="_blank" href="/search/helm-push/1.htm">helm-push</a> <div>ChartMuseum是Kubernetes生态中用于存储、管理和发布HelmCharts的开源系统,主要用于扩展Helm包管理器的功能核心功能‌集中存储‌:提供中央化仓库存储Charts,支持版本管理和权限控制。‌‌跨集群部署‌:支持多集群环境下共享Charts,简化部署流程。‌‌离线部署‌:适配无网络环境,可将Charts存储在本地或局域网内。‌‌HTTP接口‌:通过HTTP协议提供服务,用户</div> </li> <li><a href="/article/1943989243923722240.htm" title="基于定制开发开源AI智能名片S2B2C商城小程序的社群游戏定制策略研究" target="_blank">基于定制开发开源AI智能名片S2B2C商城小程序的社群游戏定制策略研究</a> <span class="text-muted">说私域</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a> <div>摘要:本文聚焦社群游戏定制领域,深入探讨以社群文化和用户偏好为导向的定制策略。通过分析互动游戏活动、社群文化塑造等关键要素,结合定制开发开源AI智能名片S2B2C商城小程序的技术特性,提出针对性游戏定制方案。研究旨在提升社群用户参与度与游戏体验,为社群游戏发展提供理论支持与实践指导。关键词:社群游戏定制;定制开发开源AI智能名片S2B2C商城小程序;社群文化;用户偏好一、引言在数字化社交蓬勃发展的</div> </li> <li><a href="/article/1943988486428225536.htm" title="全面触摸屏输入法设计与实现" target="_blank">全面触摸屏输入法设计与实现</a> <span class="text-muted">长野君</span> <div>本文还有配套的精品资源,点击获取简介:触摸屏输入法是针对触摸设备优化的文字输入方案,包括虚拟键盘、手写、语音识别和手势等多种输入方式。本方案通过提供主程序文件、用户手册、界面截图、示例图、说明文本和音效文件,旨在为用户提供一个完整的、多样的文字输入体验。开发者通过持续优化算法和用户界面,使用户在无物理键盘环境下也能高效准确地进行文字输入。1.触摸屏输入法概述简介在现代信息技术飞速发展的今天,触摸屏</div> </li> <li><a href="/article/1943984830186319872.htm" title="ARM嵌入式可编程控制器技术开发" target="_blank">ARM嵌入式可编程控制器技术开发</a> <span class="text-muted">拉勾科研工作室</span> <a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a> <div>PLC自动化设计|毕业设计指导|工业自动化解决方案✨专业领域:PLC程序设计与调试工业自动化控制系统HMI人机界面开发工业传感器应用电气控制系统设计工业网络通信擅长工具:西门子S7系列PLC编程三菱/欧姆龙PLC应用触摸屏界面设计电气CAD制图工业现场总线技术自动化设备调试主要内容:PLC控制系统设计工业自动化方案规划电气原理图绘制控制程序编写与调试毕业论文指导毕业设计题目与程序设计✅具体问题可以</div> </li> <li><a href="/article/1943983065500020736.htm" title="Python之七彩花朵代码实现" target="_blank">Python之七彩花朵代码实现</a> <span class="text-muted">PlutoZuo</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Python之七彩花朵代码实现文章目录Python之七彩花朵代码实现下面是一个简单的使用Python的七彩花朵。这个示例只是一个简单的版本,没有很多高级功能,但它可以作为一个起点,你可以在此基础上添加更多功能。importturtleastuimportrandomasraimportmathtu.setup(1.0,1.0)t=tu.Pen()t.ht()colors=['red','skybl</div> </li> <li><a href="/article/1943979785097113600.htm" title="【前端】jQuery数组合并去重方法总结" target="_blank">【前端】jQuery数组合并去重方法总结</a> <span class="text-muted"></span> <div>在jQuery中合并多个数组并去重,推荐使用原生JavaScript的Set对象(高效简单)或$.unique()(仅适用于DOM元素,不适用于普通数组)。以下是完整解决方案:方法1:使用ES6Set(推荐)//定义多个数组constarr1=[1,2,3];constarr2=[2,3,4];constarr3=[3,4,5];//合并数组并用Set去重constmergedArray=[...</div> </li> <li><a href="/article/1943976888804372480.htm" title="Redis Sentinel(哨兵) 和 Redis Cluster(集群)" target="_blank">Redis Sentinel(哨兵) 和 Redis Cluster(集群)</a> <span class="text-muted">G丶AEOM</span> <a class="tag" taget="_blank" href="/search/%E5%85%AB%E8%82%A1/1.htm">八股</a><a class="tag" taget="_blank" href="/search/%E6%99%AE%E9%80%9A%E5%AD%A6%E4%B9%A0%E5%8C%BA/1.htm">普通学习区</a><a class="tag" taget="_blank" href="/search/Redis/1.htm">Redis</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>哨兵机制和集群有什么区别Redis集群主要有两种,一种是RedisSentinel哨兵集群,一种是RedisCluster。主从集群,包括一个Master和多个Slave节点,Master负责数据的读写,Slave负责数据的读取,Master上收到的数据变更会同步到Slave节点上实现数据同步,但不提供容错和恢复,在Master宕机时不会选出新的Master,导致后续客户端所有写请求直接失败。所以</div> </li> <li><a href="/article/1943975880120397824.htm" title="php SPOF" target="_blank">php SPOF</a> <span class="text-muted">贵哥的编程之路(热爱分享 为后来者)</span> <a class="tag" taget="_blank" href="/search/PHP%E8%AF%AD%E8%A8%80%E7%BB%8F%E5%85%B8%E7%A8%8B%E5%BA%8F100%E9%A2%98/1.htm">PHP语言经典程序100题</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>1.什么是单点故障(SPOF)?单点故障指的是系统中某个组件一旦失效,整个系统或服务就会不可用。常见的单点有:数据库、缓存、Web服务器、负载均衡、网络设备等。2.常见单点故障场景只有一台数据库服务器,宕机后所有业务不可用只有一台Redis缓存,挂掉后缓存全部失效只有一台Web服务器,挂掉后网站无法访问只有一个负载均衡节点,挂掉后流量无法分发只有一条网络链路,断开后所有服务失联3.消除单点故障的主</div> </li> <li><a href="/article/1943975880678240256.htm" title="php 高并发下日志量巨大,如何高效采集、存储、分析" target="_blank">php 高并发下日志量巨大,如何高效采集、存储、分析</a> <span class="text-muted">贵哥的编程之路(热爱分享 为后来者)</span> <a class="tag" taget="_blank" href="/search/PHP%E8%AF%AD%E8%A8%80%E7%BB%8F%E5%85%B8%E7%A8%8B%E5%BA%8F100%E9%A2%98/1.htm">PHP语言经典程序100题</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>1.问题背景高并发系统每秒产生大量日志(如访问日志、错误日志、业务日志等)。单机写入、存储、分析能力有限,容易成为瓶颈。需要支持实时采集、分布式存储、快速检索与分析。2.主流架构方案一、分布式日志采集架构[应用服务器(PHP等)]|v[日志采集Agent(如Filebeat、Fluentd、Logstash)]|v[消息队列/缓冲(如Kafka、Redis、RabbitMQ)]|v[日志存储(如E</div> </li> <li><a href="/article/1943975122729758720.htm" title="EMQX 社区版单机和集群部署" target="_blank">EMQX 社区版单机和集群部署</a> <span class="text-muted">pcj_888</span> <a class="tag" taget="_blank" href="/search/MQTT/1.htm">MQTT</a><a class="tag" taget="_blank" href="/search/MQTT/1.htm">MQTT</a><a class="tag" taget="_blank" href="/search/EMQ/1.htm">EMQ</a> <div>EMQ支持Docker,宿主机,k8s部署;支持单机或集群部署。以下给出EMQX社区版单机和集群部署方法1.Docker单机部署官方推荐最小配置:2核4G下载容器镜像dockerpullemqx/emqx:5.3.2启动容器dockerrun-d--nameemqx\-p1883:1883\-p8083:8083\-p8883:8883\-p8084:8084\-p18083:18083\emqx</div> </li> <li><a href="/article/1943974618851241984.htm" title="Vue3+Vite+TS+Axios整合详细教程" target="_blank">Vue3+Vite+TS+Axios整合详细教程</a> <span class="text-muted">老马聊技术</span> <a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/Vite/1.htm">Vite</a><a class="tag" taget="_blank" href="/search/TS/1.htm">TS</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>1.Vite简介Vite是新一代的前端构建工具,在尤雨溪开发Vue3.0的时候诞生。类似于Webpack+Webpack-dev-server。其主要利用浏览器ESM特性导入组织代码,在服务器端按需编译返回,完全跳过了打包这个概念,服务器随起随用。生产中利用Rollup作为打包工具,号称下一代的前端构建工具。vite是一种新型的前端构建工具,能够显著的提升前端开发者的体验。它主要有俩部分组成:一个</div> </li> <li><a href="/article/1943972726150590464.htm" title="Shader面试题100道之(81-100)" target="_blank">Shader面试题100道之(81-100)</a> <span class="text-muted">还是大剑师兰特</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Shader/1.htm">Shader</a><a class="tag" taget="_blank" href="/search/%E7%BB%BC%E5%90%88%E6%95%99%E7%A8%8B100%2B/1.htm">综合教程100+</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%89%91%E5%B8%88/1.htm">大剑师</a><a class="tag" taget="_blank" href="/search/shader%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">shader面试题</a><a class="tag" taget="_blank" href="/search/shader%E6%95%99%E7%A8%8B/1.htm">shader教程</a> <div>Shader面试题(第81-100题)以下是第81到第100道Shader相关的面试题及答案:81.Unity中如何实现屏幕空间的热扭曲效果(HeatDistortion)?热扭曲效果可以通过GrabPass抓取当前屏幕图像,然后在片段着色器中使用噪声或动态UV偏移模拟空气扰动,再结合一个透明通道控制扭曲强度来实现。82.Shader中如何实现物体轮廓高亮(OutlineHighlight)?轮廓</div> </li> <li><a href="/article/1943972599365169152.htm" title="docker安装node部分问题" target="_blank">docker安装node部分问题</a> <span class="text-muted">自律的蜗牛</span> <a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>sudonlatestsudo:n:commandnotfound如果运行sudonlatest时出现:sudo:n:commandnotfound说明n版本管理工具未安装或未添加到PATH环境变量。解决方案1️⃣先检查n是否已安装运行:whichn或者:command-vn如果有输出/usr/local/bin/n,说明n已安装,但可能需要sudo访问。如果没有任何输出,说明n没有安装,跳到方法</div> </li> <li><a href="/article/1943972220988616704.htm" title="Java特性之设计模式【责任链模式】" target="_blank">Java特性之设计模式【责任链模式】</a> <span class="text-muted">Naijia_OvO</span> <a class="tag" taget="_blank" href="/search/Java%E7%89%B9%E6%80%A7/1.htm">Java特性</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F/1.htm">责任链模式</a> <div>一、责任链模式概述顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推主要解决:职责链上的处理者负责处理请求,客户只需要将</div> </li> <li><a href="/article/1943971716690669568.htm" title="windows安装pnpm后报错:pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。" target="_blank">windows安装pnpm后报错:pnpm : 无法将“pnpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。</a> <span class="text-muted">Ithao2</span> <a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/npm/1.htm">npm</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>使用npm方式安装pnpm,命令如下:npminstall-gpnpm安装完以后,执行pnpm-v查看版本号:pnpm-v执行完发现报错:pnpm:无法将“pnpm”项识别为cmdlet、函数、脚本文件或可运行程序的名称。尝试配置环境变量,重启后均不生效。解决方案:使用PowerShell进行安装1.以管理员用户打开PowerShell,执行如下命令:iwrhttps://get.pnpm.io/</div> </li> <li><a href="/article/1943969826485628928.htm" title="cesium添加原生MVT矢量瓦片方案" target="_blank">cesium添加原生MVT矢量瓦片方案</a> <span class="text-muted">zhu_zhu_xia</span> <a class="tag" taget="_blank" href="/search/cesium/1.htm">cesium</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/arcgis/1.htm">arcgis</a><a class="tag" taget="_blank" href="/search/cesium/1.htm">cesium</a><a class="tag" taget="_blank" href="/search/webgl/1.htm">webgl</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>项目中需要基于cesium接入mvt格式的服务并支持属性拾取查询,通过一系列预研测试,最后选择cesium-mvt-imagery-provider开源插件完成,关键源码信息如下:npmicesiumcesium-mvt-imagery-provider//安装依赖包//加载图层importCesiumMVTImageryProviderfrom"cesium-mvt-imagery-provid</div> </li> <li><a href="/article/1943968314044772352.htm" title="Python多版本管理与pip升级全攻略:解决冲突与高效实践" target="_blank">Python多版本管理与pip升级全攻略:解决冲突与高效实践</a> <span class="text-muted">码界奇点</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pip/1.htm">pip</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/python3.11/1.htm">python3.11</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AE%A1%E7%90%86/1.htm">源代码管理</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E7%8E%B0%E5%AE%9E/1.htm">虚拟现实</a><a class="tag" taget="_blank" href="/search/%E4%BE%9D%E8%B5%96%E5%80%92%E7%BD%AE%E5%8E%9F%E5%88%99/1.htm">依赖倒置原则</a> <div>引言Python作为最流行的编程语言之一,其版本迭代速度与生态碎片化给开发者带来了巨大挑战。据统计,超过60%的Python开发者需要同时维护基于Python3.6+和Python2.7的项目。本文将系统解决以下核心痛点:如何安全地在同一台机器上管理多个Python版本pip依赖冲突的根治方案符合PEP标准的生产环境最佳实践第一部分:Python多版本管理核心方案1.1系统级多版本共存方案Wind</div> </li> <li><a href="/article/1943968187112550400.htm" title="OpenWebUI(12)源码学习-后端constants.py常量定义文件" target="_blank">OpenWebUI(12)源码学习-后端constants.py常量定义文件</a> <span class="text-muted">青苔猿猿</span> <a class="tag" taget="_blank" href="/search/AI%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">AI大模型</a><a class="tag" taget="_blank" href="/search/openwebui/1.htm">openwebui</a><a class="tag" taget="_blank" href="/search/constants%E5%B8%B8%E9%87%8F%E5%AE%9A%E4%B9%89/1.htm">constants常量定义</a> <div>目录文件名:`constants.py`功能概述:主要功能点详解1.**MESSAGES枚举类**2.**WEBHOOK_MESSAGES枚举类**3.**ERROR_MESSAGES枚举类**✅默认错误模板✅认证与用户相关错误✅资源冲突与重复错误✅验证失败类错误✅权限限制类错误✅文件上传与格式错误✅模型与API错误✅请求频率与安全限制✅数据库与配置错误4.**TASKS枚举类**✅总结实际应用场</div> </li> <li><a href="/article/1943968187645227008.htm" title="Kafka系列之:Dead Letter Queue死信队列DLQ" target="_blank">Kafka系列之:Dead Letter Queue死信队列DLQ</a> <span class="text-muted">快乐骑行^_^</span> <a class="tag" taget="_blank" href="/search/Kafka/1.htm">Kafka</a><a class="tag" taget="_blank" href="/search/Kafka%E7%B3%BB%E5%88%97/1.htm">Kafka系列</a><a class="tag" taget="_blank" href="/search/Dead/1.htm">Dead</a><a class="tag" taget="_blank" href="/search/Letter/1.htm">Letter</a><a class="tag" taget="_blank" href="/search/Queue/1.htm">Queue</a><a class="tag" taget="_blank" href="/search/%E6%AD%BB%E4%BF%A1%E9%98%9F%E5%88%97/1.htm">死信队列</a><a class="tag" taget="_blank" href="/search/DLQ/1.htm">DLQ</a> <div>Kafka系列之:DeadLetterQueue死信队列DLQ一、死信队列二、参数errors.tolerance三、创建死信队列主题四、在启用安全性的情况下使用死信队列更多内容请阅读博主这篇博客:Kafka系列之:KafkaConnect深入探讨-错误处理和死信队列一、死信队列死信队列(DLQ)仅适用于接收器连接器。当一条记录以JSON格式到达接收器连接器时,但接收器连接器配置期望另一种格式,如</div> </li> <li><a href="/article/1943966799431266304.htm" title="消息中间件巡检" target="_blank">消息中间件巡检</a> <span class="text-muted">搬砖小常</span> <a class="tag" taget="_blank" href="/search/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6%E8%BF%90%E7%BB%B4%E7%AC%94%E8%AE%B0/1.htm">消息中间件运维笔记</a><a class="tag" taget="_blank" href="/search/RocketMQ/1.htm">RocketMQ</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a><a class="tag" taget="_blank" href="/search/%E5%B7%A1%E6%A3%80/1.htm">巡检</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>除资源使用情况外,消息中间件RocketMQ、kafka还可以巡检哪些?一、RocketMQ巡检1、检查broker写入耗时是否有压力2、检查brokerbusy的数量与频率3、主题发送TPS、发送错误率巡检4、从节点消费情况检查5、集群各broker消息流转情况巡检二、Kafka巡检1、检查是否有分区发生ISR频繁扩张收缩2、检查分区leader选举值是否处于正常水平3、检查controller</div> </li> <li><a href="/article/1943966169434222592.htm" title="Maya自定义右键菜单样例教程" target="_blank">Maya自定义右键菜单样例教程</a> <span class="text-muted">holy-pills</span> <div>本文还有配套的精品资源,点击获取简介:本文详细指导如何在Maya中通过脚本节点自定义右键菜单,增强工作效率和个性化工作环境。自定义右键菜单允许用户根据个人习惯调整菜单项,使之更加便捷。文章介绍了创建脚本节点、编写菜单脚本、关联菜单到视图以及保存和加载自定义菜单的具体步骤。同时提供了实际操作样例,帮助用户更好地理解和应用这一技巧。1.Maya自定义右键菜单的重要性Maya,作为三维动画制作的行业标准</div> </li> <li><a href="/article/1943960117179379712.htm" title="[特殊字符] 实时数据洪流突围战:Flink+Paimon实现毫秒级分析的架构革命(附压测报告)——日均百亿级数据处理成本降低60%的工业级方案" target="_blank">[特殊字符] 实时数据洪流突围战:Flink+Paimon实现毫秒级分析的架构革命(附压测报告)——日均百亿级数据处理成本降低60%的工业级方案</a> <span class="text-muted">Lucas55555555</span> <a class="tag" taget="_blank" href="/search/flink/1.htm">flink</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a> <div>引言:流批一体的时代拐点据阿里云2025白皮书显示,实时数据处理需求年增速达240%,但传统Lambda架构资源消耗占比超运维成本的70%。某电商平台借助Flink+Paimon重构实时数仓后,端到端延迟从分钟级压缩至800ms,计算资源节省5.6万核/月。技术红利窗口期:2025年ApachePaimon1.0正式发布,支持秒级快照与湖仓一体,成为替代Iceberg的新范式一、痛点深挖:实时数仓</div> </li> <li><a href="/article/1943952433315115008.htm" title="AIGC工具与软件开发流程的深度集成方案" target="_blank">AIGC工具与软件开发流程的深度集成方案</a> <span class="text-muted">Irene-HQ</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/1.htm">软件开发</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95/1.htm">测试</a><a class="tag" taget="_blank" href="/search/AIGC/1.htm">AIGC</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/github/1.htm">github</a><a class="tag" taget="_blank" href="/search/AIGC/1.htm">AIGC</a><a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/1.htm">程序人生</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>一、代码开发环节集成路径‌环境配置标准化‌安装AIGC工具包并配置环境变量(如设置AIGC_TOOL_PATH),确保团队开发环境一致‌。在IDE插件市场安装Copilot等工具,实现编码时实时建议调用‌。‌人机协作新模式‌‌需求解析‌:上传PRD文档,AI自动提取业务规则生成类结构(如支付模块的PaymentService雏形)‌。‌代码补全‌:输入注释//JWT验证中间件,生成OAuth2.0</div> </li> <li><a href="/article/1943950163496202240.htm" title="JavaScript 基础09:Web APIs——日期对象、DOM节点" target="_blank">JavaScript 基础09:Web APIs——日期对象、DOM节点</a> <span class="text-muted">梦想当全栈</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>JavaScript基础09:WebAPIs——日期对象、DOM节点进一步学习DOM相关知识,实现可交互的网页特效能够插入、删除和替换元素节点。能够依据元素节点关系查找节点。一、日期对象掌握Date日期对象的使用,动态获取当前计算机的时间。ECMAScript中内置了获取系统时间的对象Date,使用Date时与之前学习的内置对象console和Math不同,它需要借助new关键字才能使用。1.实例</div> </li> <li><a href="/article/1943949027624153088.htm" title="【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(Advanced RAG[1])基于历史对话重新生成Query?" target="_blank">【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(Advanced RAG[1])基于历史对话重新生成Query?</a> <span class="text-muted">985小水博一枚呀</span> <a class="tag" taget="_blank" href="/search/AI%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">AI大模型学习路线</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</a><a class="tag" taget="_blank" href="/search/RAG/1.htm">RAG</a> <div>【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(AdvancedRAG[1])基于历史对话重新生成Query?【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(AdvancedRAG[1])基于历史对话重新生成Query?文章目录【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(AdvancedRAG[1])基于历史对话重新生成Q</div> </li> <li><a href="/article/1943949028291047424.htm" title="【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(Advanced RAG[1])其他Query优化相关策略?" target="_blank">【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(Advanced RAG[1])其他Query优化相关策略?</a> <span class="text-muted">985小水博一枚呀</span> <a class="tag" taget="_blank" href="/search/AI%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">AI大模型学习路线</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/langchain/1.htm">langchain</a> <div>【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(AdvancedRAG[1])其他Query优化相关策略?【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(AdvancedRAG[1])其他Query优化相关策略?文章目录【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(AdvancedRAG[1])其他Query优化相关策略?一</div> </li> <li><a href="/article/1943946255763828736.htm" title="《Java前端开发全栈指南:从Servlet到现代框架实战》" target="_blank">《Java前端开发全栈指南:从Servlet到现代框架实战》</a> <span class="text-muted"></span> <div>前言在当今Web开发领域,Java依然是后端开发的主力语言,而随着前后端分离架构的普及,Java开发者也需要掌握前端技术栈。本文将全面介绍JavaWeb前端开发的核心技术,包括传统Servlet/JSP体系、现代前端框架集成方案,以及全栈开发的最佳实践。通过本文,您将了解如何构建现代化的JavaWeb应用前端界面。一、JavaWeb前端技术演进1.1传统技术栈Servlet:JavaWeb基础,处</div> </li> <li><a href="/article/1943944869152092160.htm" title="C#中的设计模式:构建更加优雅的代码" target="_blank">C#中的设计模式:构建更加优雅的代码</a> <span class="text-muted">Envyᥫᩣᩚ</span> <a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>C#在面向对象编程(OOP)方面的强大支持,我们可以探讨“C#中的设计模式”。这不仅有助于理解如何更好地组织代码,还能提高代码的可维护性和可扩展性。引言设计模式是软件工程中经过实践验证的解决方案模板,它们提供了一种标准化的方法来解决常见的开发问题。对于使用C#进行开发的程序员来说,理解和应用这些模式可以帮助创建结构良好、易于维护和扩展的应用程序。本文将介绍几种常用的设计模式,并展示如何用C#实现它</div> </li> <li><a href="/article/94.htm" title="PHP,安卓,UI,java,linux视频教程合集" target="_blank">PHP,安卓,UI,java,linux视频教程合集</a> <span class="text-muted">cocos2d-x小菜</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>╔-----------------------------------╗┆                           </div> </li> <li><a href="/article/221.htm" title="各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。" target="_blank">各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。</a> <span class="text-muted">bozch</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/.net+mvc/1.htm">.net mvc</a> <div>在.net mvc5中,在执行某一操作的时候,出现了如下错误:       各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。 经查询当前的操作与错误内容无关,经过对错误信息的排查发现,事故出现在数据库迁移上。 回想过去: 在迁移之前已经对数据库进行了添加字段操作,再次进行迁移插入XXX字段的时候,就会提示如上错误。  &</div> </li> <li><a href="/article/348.htm" title="Java 对象大小的计算" target="_blank">Java 对象大小的计算</a> <span class="text-muted">e200702084</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>                          Java对象的大小 如何计算一个对象的大小呢?    </div> </li> <li><a href="/article/475.htm" title="Mybatis Spring" target="_blank">Mybatis Spring</a> <span class="text-muted">171815164</span> <a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); CustomerService userService = (CustomerService) ac.getBean("customerService"); Customer cust</div> </li> <li><a href="/article/602.htm" title="JVM 不稳定参数" target="_blank">JVM 不稳定参数</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>        -XX 参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。当然这是在非合理设置的前提下,如果此类参数设置合理讲大大提高JVM 的性能及稳定性。        可以说“不稳定参数”</div> </li> <li><a href="/article/729.htm" title="用户自动登录网站" target="_blank">用户自动登录网站</a> <span class="text-muted">永夜-极光</span> <a class="tag" taget="_blank" href="/search/%E7%94%A8%E6%88%B7/1.htm">用户</a> <div>1.目标:实现用户登录后,再次登录就自动登录,无需用户名和密码 2.思路:将用户的信息保存为cookie            每次用户访问网站,通过filter拦截所有请求,在filter中读取所有的cookie,如果找到了保存登录信息的cookie,那么在cookie中读取登录信息,然后直接</div> </li> <li><a href="/article/856.htm" title="centos7 安装后失去win7的引导记录" target="_blank">centos7 安装后失去win7的引导记录</a> <span class="text-muted">程序员是怎么炼成的</span> <a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a> <div>1.使用root身份(必须)打开 /boot/grub2/grub.cfg 2.找到 ### BEGIN /etc/grub.d/30_os-prober ###   在后面添加    menuentry "Windows 7 (loader) (on /dev/sda1)" { </div> </li> <li><a href="/article/983.htm" title="Oracle 10g 官方中文安装帮助文档以及Oracle官方中文教程文档下载" target="_blank">Oracle 10g 官方中文安装帮助文档以及Oracle官方中文教程文档下载</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>Oracle 10g 官方中文安装帮助文档下载:http://download.csdn.net/tag/Oracle%E4%B8%AD%E6%96%87API%EF%BC%8COracle%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%EF%BC%8Coracle%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3 Oracle 10g 官方中文教程</div> </li> <li><a href="/article/1110.htm" title="JavaEE开源快速开发平台G4Studio_V3.2发布了" target="_blank">JavaEE开源快速开发平台G4Studio_V3.2发布了</a> <span class="text-muted">無為子</span> <a class="tag" taget="_blank" href="/search/AOP/1.htm">AOP</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/javaee/1.htm">javaee</a><a class="tag" taget="_blank" href="/search/G4Studio/1.htm">G4Studio</a> <div>  我非常高兴地宣布,今天我们最新的JavaEE开源快速开发平台G4Studio_V3.2版本已经正式发布。大家可以通过如下地址下载。   访问G4Studio网站 http://www.g4it.org   G4Studio_V3.2版本变更日志 功能新增 (1).新增了系统右下角滑出提示窗口功能。 (2).新增了文件资源的Zip压缩和解压缩</div> </li> <li><a href="/article/1237.htm" title="Oracle常用的单行函数应用技巧总结" target="_blank">Oracle常用的单行函数应用技巧总结</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E6%97%A5%E6%9C%9F%E5%87%BD%E6%95%B0/1.htm">日期函数</a><a class="tag" taget="_blank" href="/search/%E8%BD%AC%E6%8D%A2%E5%87%BD%E6%95%B0%28%E6%A0%B8%E5%BF%83%29/1.htm">转换函数(核心)</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E5%AD%97%E5%87%BD%E6%95%B0/1.htm">数字函数</a><a class="tag" taget="_blank" href="/search/%E9%80%9A%E7%94%A8%E5%87%BD%E6%95%B0%28%E6%A0%B8%E5%BF%83%29/1.htm">通用函数(核心)</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E7%AC%A6%E5%87%BD%E6%95%B0/1.htm">字符函数</a> <div>单行函数;   字符函数,数字函数,日期函数,转换函数(核心),通用函数(核心) 一:字符函数: .UPPER(字符串) 将字符串转为大写 .LOWER (字符串) 将字符串转为小写 .INITCAP(字符串) 将首字母大写 .LENGTH (字符串) 字符串的长度 .REPLACE(字符串,'A','_') 将字符串字符A转换成_ </div> </li> <li><a href="/article/1364.htm" title="Mockito异常测试实例" target="_blank">Mockito异常测试实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a><a class="tag" taget="_blank" href="/search/mockito/1.htm">mockito</a> <div>Mockito异常测试实例: package com.bijian.study; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.Assert; import org.junit.Test; import org.mockito.</div> </li> <li><a href="/article/1491.htm" title="GA与量子恒道统计" target="_blank">GA与量子恒道统计</a> <span class="text-muted">Bill_chen</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">浏览器</a><a class="tag" taget="_blank" href="/search/%E7%99%BE%E5%BA%A6/1.htm">百度</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/%E9%98%B2%E7%81%AB%E5%A2%99/1.htm">防火墙</a> <div>前一阵子,统计**网址时,Google Analytics(GA) 和量子恒道统计(也称量子统计),数据有较大的偏差,仔细找相关资料研究了下,总结如下:   为何GA和量子网站统计(量子统计前身为雅虎统计)结果不同? 首先:没有一种网站统计工具能保证百分之百的准确出现该问题可能有以下几个原因:(1)不同的统计分析系统的算法机制不同;(2)统计代码放置的位置和前后</div> </li> <li><a href="/article/1618.htm" title="【Linux命令三】Top命令" target="_blank">【Linux命令三】Top命令</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/linux%E5%91%BD%E4%BB%A4/1.htm">linux命令</a> <div>Linux的Top命令类似于Windows的任务管理器,可以查看当前系统的运行情况,包括CPU、内存的使用情况等。如下是一个Top命令的执行结果:     top - 21:22:04 up 1 day, 23:49, 1 user, load average: 1.10, 1.66, 1.99 Tasks: 202 total, 4 running, 198 sl</div> </li> <li><a href="/article/1745.htm" title="spring四种依赖注入方式" target="_blank">spring四种依赖注入方式</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>  平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我</div> </li> <li><a href="/article/1872.htm" title="angular.injector" target="_blank">angular.injector</a> <span class="text-muted">boyitech</span> <a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/AngularJS+API/1.htm">AngularJS API</a> <div>angular.injector   描述: 创建一个injector对象, 调用injector对象的方法可以获得angular的service, 或者用来做依赖注入.   使用方法: angular.injector(modules, [strictDi])   参数详解: Param Type Details mod</div> </li> <li><a href="/article/1999.htm" title="java-同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待" target="_blank">java-同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/Integer/1.htm">Integer</a> <div> public class PC { /** * 题目:生产者-消费者。 * 同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待。 */ private static final Integer[] val=new Integer[10]; private static</div> </li> <li><a href="/article/2126.htm" title="使用Struts2.2.1配置" target="_blank">使用Struts2.2.1配置</a> <span class="text-muted">Chen.H</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a> <div>Struts2.2.1 需要如下 jar包: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar commons-logging-1.0.4.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar spring.jar struts2-core-2.2.1.jar struts2-sp</div> </li> <li><a href="/article/2253.htm" title="[职业与教育]青春之歌" target="_blank">[职业与教育]青春之歌</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E6%95%99%E8%82%B2/1.htm">教育</a> <div>        每个人都有自己的青春之歌............但是我要说的却不是青春...        大家如果在自己的职业生涯没有给自己以后创业留一点点机会,仅仅凭学历和人脉关系,是难以在竞争激烈的市场中生存下去的....   &nbs</div> </li> <li><a href="/article/2380.htm" title="oracle连接(join)中使用using关键字" target="_blank">oracle连接(join)中使用using关键字</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/JOIN/1.htm">JOIN</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/using/1.htm">using</a> <div>在oracle连接(join)中使用using关键字 34. View the Exhibit and examine the structure of the ORDERS and ORDER_ITEMS tables. Evaluate the following SQL statement: SELECT oi.order_id, product_id, order_date FRO</div> </li> <li><a href="/article/2507.htm" title="NIO示例" target="_blank">NIO示例</a> <span class="text-muted">daysinsun</span> <a class="tag" taget="_blank" href="/search/nio/1.htm">nio</a> <div>NIO服务端代码: public class NIOServer { private Selector selector; public void startServer(int port) throws IOException { ServerSocketChannel serverChannel = ServerSocketChannel.open(</div> </li> <li><a href="/article/2634.htm" title="C语言学习homework1" target="_blank">C语言学习homework1</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/homework/1.htm">homework</a> <div>0、 课堂练习做完 1、使用sizeof计算出你所知道的所有的类型占用的空间。 int x; sizeof(x);   sizeof(int);   # include <stdio.h> int main(void) { int x1; char x2; double x3; float x4; printf(&quo</div> </li> <li><a href="/article/2761.htm" title="select in order by , mysql排序" target="_blank">select in order by , mysql排序</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>If i select like this: SELECT id FROM users WHERE id IN(3,4,8,1); This by default will select users in this order 1,3,4,8, I would like to select them in the same order that i put IN() values so: </div> </li> <li><a href="/article/2888.htm" title="页面校验-新建项目" target="_blank">页面校验-新建项目</a> <span class="text-muted">fanxiaolong</span> <a class="tag" taget="_blank" href="/search/%E9%A1%B5%E9%9D%A2%E6%A0%A1%E9%AA%8C/1.htm">页面校验</a> <div>$(document).ready( function() { var flag = true; $('#changeform').submit(function() { var projectScValNull = true; var s =""; var parent_id = $("#parent_id").v</div> </li> <li><a href="/article/3015.htm" title="Ehcache(02)——ehcache.xml简介" target="_blank">Ehcache(02)——ehcache.xml简介</a> <span class="text-muted">234390216</span> <a class="tag" taget="_blank" href="/search/ehcache/1.htm">ehcache</a><a class="tag" taget="_blank" href="/search/ehcache.xml/1.htm">ehcache.xml</a><a class="tag" taget="_blank" href="/search/%E7%AE%80%E4%BB%8B/1.htm">简介</a> <div>ehcache.xml简介          ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的。根据之前我们在《Ehcache简介》一文中对CacheManager的介绍我们知道一切Ehcache的应用都是从CacheManager开始的。在不指定配置信</div> </li> <li><a href="/article/3142.htm" title="junit 4.11中三个新功能" target="_blank">junit 4.11中三个新功能</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>junit 4.11中两个新增的功能,首先是注解中可以参数化,比如 import static org.junit.Assert.assertEquals; import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runn</div> </li> <li><a href="/article/3269.htm" title="国外程序员爱用苹果Mac电脑的10大理由" target="_blank">国外程序员爱用苹果Mac电脑的10大理由</a> <span class="text-muted">php教程分享</span> <a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/unix/1.htm">unix</a><a class="tag" taget="_blank" href="/search/Microsoft/1.htm">Microsoft</a><a class="tag" taget="_blank" href="/search/perl/1.htm">perl</a> <div>Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里。普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒。那么为什么专业人士也对 Mac 情有独钟呢?从个人使用经验来看我想有下面几个原因: 1、Mac OS X 是基于 Unix 的 这一点太重要了,尤其是对开发人员,至少对于我来说很重要,这意味着Unix 下一堆好用的工具都可以随手捡到。如果你是个 wi</div> </li> <li><a href="/article/3396.htm" title="位运算、异或的实际应用" target="_blank">位运算、异或的实际应用</a> <span class="text-muted">wenjinglian</span> <a class="tag" taget="_blank" href="/search/%E4%BD%8D%E8%BF%90%E7%AE%97/1.htm">位运算</a> <div>一. 位操作基础,用一张表描述位操作符的应用规则并详细解释。       二. 常用位操作小技巧,有判断奇偶、交换两数、变换符号、求绝对值。       三. 位操作与空间压缩,针对筛素数进行空间压缩。    &n</div> </li> <li><a href="/article/3523.htm" title="weblogic部署项目出现的一些问题(持续补充中……)" target="_blank">weblogic部署项目出现的一些问题(持续补充中……)</a> <span class="text-muted">Everyday都不同</span> <a class="tag" taget="_blank" href="/search/weblogic%E9%83%A8%E7%BD%B2%E5%A4%B1%E8%B4%A5/1.htm">weblogic部署失败</a> <div>好吧,weblogic的问题确实……   问题一: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [zip:E:/weblogic/user_projects/domains/base_domain/serve</div> </li> <li><a href="/article/3650.htm" title="tomcat7性能调优(01)" target="_blank">tomcat7性能调优(01)</a> <span class="text-muted">toknowme</span> <a class="tag" taget="_blank" href="/search/tomcat7/1.htm">tomcat7</a> <div>    Tomcat优化: 1、最大连接数最大线程等设置 <Connector port="8082" protocol="HTTP/1.1"                useBodyEncodingForURI="t</div> </li> <li><a href="/article/3777.htm" title="PO VO DAO DTO BO TO概念与区别" target="_blank">PO VO DAO DTO BO TO概念与区别</a> <span class="text-muted">xp9802</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/bean/1.htm">bean</a><a class="tag" taget="_blank" href="/search/%E9%A2%86%E5%9F%9F%E6%A8%A1%E5%9E%8B/1.htm">领域模型</a> <div>O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。 它们的关系应该是相互独立的,一个VO可以只是PO的部分,也可以是多个PO构成,同样也可以等同于一个PO(指的是他们的属性)。这样,PO独立出来,数据持</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>