应用架构之【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/1881534466598432768.htm" title="K8S中Pod控制器之CronJob(CJ)控制器" target="_blank">K8S中Pod控制器之CronJob(CJ)控制器</a> <span class="text-muted">元气满满的热码式</span> <a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a> <div>CronJob控制器是Kubernetes中用于周期性执行任务的一种控制器,它基于Job控制器来创建和管理作业。以下是CronJob的一些关键特点:周期性调度:CronJob允许您定义一个基于时间的调度,类似于Linux的cron工具,来周期性地执行任务。时间点触发:CronJob根据指定的时间表(cron表达式)触发,可以精确到分钟。一次性或重复执行:尽管CronJob主要用于重复性任务,但它也</div> </li> <li><a href="/article/1881532575957184512.htm" title="五、React(环境配置和ES6语法糖)" target="_blank">五、React(环境配置和ES6语法糖)</a> <span class="text-muted">老帅比阿</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">web前端开发</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>文章目录一、React是什么?二、React能用来做什么?三、配置环境四、ES6语法糖总结一、React是什么?React是一个开源JavaScript库,用于专门为单页应用程序构建用户界面。它用于处理Web和移动应用程序的视图层,允许我们创建可重用的UI组件。二、React能用来做什么?React非常灵活。你学会了React,你就可以在各种各样的平台上使用它来构建高质量的用户界面。React是一</div> </li> <li><a href="/article/1881532576716353536.htm" title="k8s部署Kafka集群" target="_blank">k8s部署Kafka集群</a> <span class="text-muted">潞哥的博客</span> <a class="tag" taget="_blank" href="/search/kubernetes/1.htm">kubernetes</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a> <div>1.1、Kafka(消息队列)是一个分布式消息中间件,支持分区的、多副本的、多订阅者的、基于zookeeper协调的分布式消息系统。通俗来说:kafka就是一个存储系统,存储的数据形式为“消息";1.2、常用的消息系统有哪些以及各自的特点有activemq,rabbitmq,rocketmq,kafka1.3、为什么使用消息队列1)、提高扩展性:因为消息队列解耦了处理过程,有新增需求时只要另外增加</div> </li> <li><a href="/article/1881531689491034112.htm" title="10多套html视频教程,让你彻底搞懂html。学习路上助你一臂之力!" target="_blank">10多套html视频教程,让你彻底搞懂html。学习路上助你一臂之力!</a> <span class="text-muted">guoguo507</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>快速入口在文章最后,大家耐心观看!谢谢(想学其他更多编程技术视频,请进我的博客查看。)踏上HTML之旅:从新手到进阶的蜕变在当今数字化时代,网页无处不在,从社交媒体到在线购物,从新闻资讯到学习平台。而HTML作为构建网页的基石,掌握它不仅是踏入Web开发领域的第一步,更是理解互联网信息呈现方式的关键。对于渴望在网页设计、前端开发领域一展身手的人来说,从浅入深地学习HTML是开启精彩旅程的钥匙。一、</div> </li> <li><a href="/article/1881531185436356608.htm" title="【1000个GDB技巧之】GDB中使用python脚本的方法以及4个注意事项(define、python、end、gdb.execute、to_string=True)" target="_blank">【1000个GDB技巧之】GDB中使用python脚本的方法以及4个注意事项(define、python、end、gdb.execute、to_string=True)</a> <span class="text-muted">北冥的备忘录</span> <a class="tag" taget="_blank" href="/search/Linux%E8%B0%83%E8%AF%95%E6%96%B9%E6%B3%95/1.htm">Linux调试方法</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%B0%83%E8%AF%95/1.htm">调试</a><a class="tag" taget="_blank" href="/search/gdb/1.htm">gdb</a> <div>要点使用define定义函数在define中使用python…end包围python使用的代码(python代码也可以不在包围中)在python中使用gdb命令用gdb.execute,并且需要指定to_stringsgdb可以单独写成文件然后source进来坑:坑1:python和gdb的end都不值直接注释,需要另起一行坑2:gdb.execute执行后的输出结果包括$xxx获取需要做转换坑3</div> </li> <li><a href="/article/1881529923034738688.htm" title="FPGA工程师有哪些?(设计、验证与应用)" target="_blank">FPGA工程师有哪些?(设计、验证与应用)</a> <span class="text-muted">博览鸿蒙</span> <a class="tag" taget="_blank" href="/search/FPGA/1.htm">FPGA</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a> <div>随着FPGA技术的发展和应用领域的拓展,FPGA工程师的岗位也越来越细分。FPGA产业链涉及多个环节,每个环节都需要不同类型的工程师协同工作。本文将梳理FPGA领域的主要工程师类型,帮助读者更好地了解该行业。FPGA设计环节系统架构师(SystemArchitect):这是FPGA领域的资深职位,需要对系统架构、FPGA技术、应用场景等有深入的理解。架构师负责定义系统级规范、制定FPGA架构方案、</div> </li> <li><a href="/article/1881525506222911488.htm" title="TypeScript语言的软件工程" target="_blank">TypeScript语言的软件工程</a> <span class="text-muted">编程小筑</span> <a class="tag" taget="_blank" href="/search/%E5%8C%85%E7%BD%97%E4%B8%87%E8%B1%A1/1.htm">包罗万象</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</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/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>TypeScript语言的软件工程实践引言在现代软件工程中,编程语言的选择对项目的成功至关重要。近年来,JavaScript凭借其在Web开发中的广泛应用取得了巨大成功。然而,随着Web应用程序的复杂性不断增加,开发者渐渐发现纯JavaScript在可维护性、类型安全性和开发效率方面的不足。为了解决这些问题,TypeScript应运而生。TypeScript是一种由微软开发的开源语言,它在Java</div> </li> <li><a href="/article/1881524369012879360.htm" title="哈希算法篇——散落的秘密与精准的归宿,混沌中的秩序之美(上)" target="_blank">哈希算法篇——散落的秘密与精准的归宿,混沌中的秩序之美(上)</a> <span class="text-muted">诚丞成</span> <a class="tag" taget="_blank" href="/search/%E5%B8%B8%E7%94%A8%E7%AE%97%E6%B3%95%E8%AE%B2%E8%A7%A3/1.htm">常用算法讲解</a><a class="tag" taget="_blank" href="/search/%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95/1.htm">哈希算法</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>文章目录引言:混沌中的秩序之美第一章:哈希的本质——化繁为简的魔法第二章:经典哈希函数——一座算法的博物馆第三章:哈希表的奇迹——从无序到有序的转变3.1哈希函数的基本实现3.2基本的哈希表实现3.3哈希算法的实际应用小结引言:混沌中的秩序之美在信息科学的星空下,有一种算法宛如一位洞悉混沌的智者,能够以其独特的规则,在无限的可能性中找到秩序。这便是哈希算法(HashingAlgorithm),一个</div> </li> <li><a href="/article/1881522227988459520.htm" title="Kali Linux最新版本下无法直接pip安装?教你四招完美解决‘externally-managed-environment’报错!" target="_blank">Kali Linux最新版本下无法直接pip安装?教你四招完美解决‘externally-managed-environment’报错!</a> <span class="text-muted">vortex5</span> <a class="tag" taget="_blank" href="/search/%E6%95%99%E7%A8%8B/1.htm">教程</a><a class="tag" taget="_blank" href="/search/Kali%E7%AC%94%E8%AE%B0/1.htm">Kali笔记</a><a class="tag" taget="_blank" href="/search/pip/1.htm">pip</a><a class="tag" taget="_blank" href="/search/Kali/1.htm">Kali</a><a class="tag" taget="_blank" href="/search/%E6%B8%97%E9%80%8F/1.htm">渗透</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a> <div>内容预览≧∀≦ゞKaliLinux中解决externally-managed-environment错误的四种方法引言解决方案1:从系统存储库安装Python包解决方案2:使用虚拟环境解决方案3:使用pipx安装(推荐)解决方案4:强制安装(不推荐)总结KaliLinux中解决externally-managed-environment错误的四种方法引言在KaliLinux的最新版本中,很多用户尝</div> </li> <li><a href="/article/1881521975784960000.htm" title="安全见闻二:Web程序构成与潜在漏洞" target="_blank">安全见闻二:Web程序构成与潜在漏洞</a> <span class="text-muted">vortex5</span> <a class="tag" taget="_blank" href="/search/%E6%98%9F%E6%B2%B3%E9%A3%9E%E9%9B%AA/1.htm">星河飞雪</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8%E8%A7%81%E9%97%BB/1.htm">安全见闻</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>内容预览≧∀≦ゞ安全见闻二:Web程序构成与潜在漏洞声明导语前端语言及潜在漏洞前端语言前端框架与代码库常见的前端框架与代码库安全问题的根源前端潜在漏洞后端语言及潜在漏洞常见后端语言协议问题后端潜在漏洞数据库及潜在漏洞数据库分类数据库潜在漏洞服务器程序及潜在漏洞常见服务器程序服务器程序潜在漏洞结语安全见闻二:Web程序构成与潜在漏洞声明学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章笔记的只</div> </li> <li><a href="/article/1881520337988939776.htm" title="Vue的MVVM架构是什么?请解释其工作原理" target="_blank">Vue的MVVM架构是什么?请解释其工作原理</a> <span class="text-muted">JJCTO袁龙</span> <a class="tag" taget="_blank" href="/search/Vue/1.htm">Vue</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Vue的MVVM架构是什么?请解释其工作原理在现代Web应用开发中,Vue.js作为一个渐进式框架,因其简洁且灵活的特性受到广泛欢迎。Vue的核心思想是MVVM(Model-View-ViewModel)架构,这一模式使得数据和视图能够保持同步。下面我们将深入探讨Vue的MVVM架构是什么,以及其工作原理,帮助开发者更好地理解Vue的设计理念。MVVM架构的基本概念MVVM是“Model-View</div> </li> <li><a href="/article/1881516809656528896.htm" title="Flink Standalone 方案中解决挂机问题" target="_blank">Flink Standalone 方案中解决挂机问题</a> <span class="text-muted">星尘幻宇科技</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>Standalone中可以配置HighAvailability(HA)部署和配置首先了解Flink实际运行时包括两类进程:JobManager(又称为JobMaster):协调Task的分布式执行,包括调度Task、协调创Checkpoint以及当Jobfailover时协调各个Task从Checkpoint恢复等。TaskManager(又称为Worker):执行Dataflow中的Tasks,</div> </li> <li><a href="/article/1881516810101125120.htm" title="云原生周刊:K8s 生产环境架构设计及成本分析" target="_blank">云原生周刊:K8s 生产环境架构设计及成本分析</a> <span class="text-muted">KubeSphere 云原生</span> <a class="tag" taget="_blank" href="/search/k8s/1.htm">k8s</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8%E5%B9%B3%E5%8F%B0/1.htm">容器平台</a><a class="tag" taget="_blank" href="/search/kubesphere/1.htm">kubesphere</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E8%AE%A1%E7%AE%97/1.htm">云计算</a> <div>开源项目推荐KubeZoneNetKubeZoneNet旨在帮助监控和优化Kubernetes集群中的跨可用区(Cross-Zone)网络流量。这个项目提供了一种简便的方式来跟踪和分析Kubernetes集群中跨不同可用区的通信,帮助用户优化集群的网络架构、提高资源利用效率并减少网络延迟。通过实时监控和数据分析,KubeZoneNet能有效地识别跨可用区的网络瓶颈,并提供改进建议,以支持Kuber</div> </li> <li><a href="/article/1881515800481820672.htm" title="Python FileNotFoundError: [WinError 2] 系统找不到指定的文件。" target="_blank">Python FileNotFoundError: [WinError 2] 系统找不到指定的文件。</a> <span class="text-muted">zhangda0000001</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> <div>用Idle运行Python脚本的时候发现如下错误:Traceback(mostrecentcalllast):File"D:\Python\Python36-32\lib\site-packages\selenium-3.4.3-py3.6.egg\selenium\webdriver\common\service.py",line74,instartstdout=self.log_file,st</div> </li> <li><a href="/article/1881515168089829376.htm" title="WebSocket在实时体育比分网站中的应用" target="_blank">WebSocket在实时体育比分网站中的应用</a> <span class="text-muted">sanx18</span> <a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>WebSocket在实时体育比分网站中的应用有以下几个方面:1.实时比分更新体育比赛的比分和事件(如进球、犯规、暂停等)需要实时传递给所有在线用户。WebSocket可以在服务器和客户端之间建立持久连接,使得服务器能在比分变化时立即推送更新数据,而不需要客户端频繁地轮询服务器。这减少了延迟,提升了用户体验。2.动态赛事信息除了比分外,比赛过程中还会有一些动态信息需要显示,比如球员统计、犯规、伤病情</div> </li> <li><a href="/article/1881514536960323584.htm" title="大数据学习(37)- Flink运行时架构" target="_blank">大数据学习(37)- Flink运行时架构</a> <span class="text-muted">viperrrrrrr</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><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>&&大数据学习&&系列专栏:哲学语录:承认自己的无知,乃是开启智慧的大门如果觉得博主的文章还不错的话,请点赞+收藏⭐️+留言支持一下博主哦1)作业管理器(JobManager)JobManager是一个Flink集群中任务管理和调度的核心,是控制应用执行的主进程。也就是说,每个应用都应该被唯一的JobManager所控制执行。JobManger又包含3个不同的组件。(1)JobMasterJobM</div> </li> <li><a href="/article/1881513403483222016.htm" title="iOS APP 上架审核被拒Guideline 4.3 - Design,2.1,2.3.1,5.1.1解决方案" target="_blank">iOS APP 上架审核被拒Guideline 4.3 - Design,2.1,2.3.1,5.1.1解决方案</a> <span class="text-muted">搬砖的前端</span> <a class="tag" taget="_blank" href="/search/uniapp%E6%8A%80%E6%9C%AF%E6%A0%88%E5%8F%8A%E5%A4%9A%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">uniapp技术栈及多端开发</a><a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/appstore/1.htm">appstore</a><a class="tag" taget="_blank" href="/search/4.3/1.htm">4.3</a><a class="tag" taget="_blank" href="/search/2.1/1.htm">2.1</a><a class="tag" taget="_blank" href="/search/5.1.1/1.htm">5.1.1</a> <div>iOSAPP上架审核被拒Guideline4.3-Design,2.1,2.3.1,5.1.1解决方案4.3解决原理:https://blog.csdn.net/huazaihahha/article/details/136659489其他以及具体执行步骤:https://juejin.cn/post/7277395050509844537</div> </li> <li><a href="/article/1881512015701274624.htm" title="qt等待阻塞的解决方案" target="_blank">qt等待阻塞的解决方案</a> <span class="text-muted">甘光宗</span> <a class="tag" taget="_blank" href="/search/Qt/1.htm">Qt</a><a class="tag" taget="_blank" href="/search/%E5%AE%A2%E6%88%B7%E7%AB%AF/1.htm">客户端</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a> <div>在开发中我们经常用到等待,阻塞,比如每个5秒钟请求一次服务器,但是这个时候我们使用QThread::sleep这个函数,但是这个函数有一个缺点,就是他会阻塞Qt的事件循环,我们界面会卡死。所以有一种比较好的方法,就是QEventLoop。QTimertimer;timer.setInterval(5000);//设置超时时间5秒while(true){QEventLoopeventLoop;con</div> </li> <li><a href="/article/1881509995686719488.htm" title="VYOS容器运行DaloRadius实现AAA认证登录" target="_blank">VYOS容器运行DaloRadius实现AAA认证登录</a> <span class="text-muted">GTaylor</span> <a class="tag" taget="_blank" href="/search/Vyos/1.htm">Vyos</a><a class="tag" taget="_blank" href="/search/DaloRadius/1.htm">DaloRadius</a><a class="tag" taget="_blank" href="/search/VYOS%E5%AE%B9%E5%99%A8/1.htm">VYOS容器</a><a class="tag" taget="_blank" href="/search/AAA%E8%AE%A4%E8%AF%81/1.htm">AAA认证</a> <div>整体架构freeradius提供AAA认证服务mysql提供用户认证授权信息存储daloradius提供Web界面管理用户认证授权信息mysql添加镜像addcontainerimagemysql:5.6配置setcontainernamemysql56description'mysql56'setcontainernamemysql56image'docker.io/library/mysql:</div> </li> <li><a href="/article/1881508735248035840.htm" title="FileNotFoundError: [WinError 2] 系统找不到指定的文件解决方案" target="_blank">FileNotFoundError: [WinError 2] 系统找不到指定的文件解决方案</a> <span class="text-muted">诗和远方ya</span> <a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E7%9B%B8%E5%85%B3%E9%97%AE%E9%A2%98/1.htm">软件相关问题</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>在windows终端运行python程序时,报错FileNotFoundError:[WinError2]系统找不到指定的文件,但是检查完文件路径后发现并没有错,考虑到是不是需要加环境变量,以及通过sys.path.append在python文件中加上引用的其他文件的绝对路径。还是不管用。解决方案是:找到python源代码中的subprocess.py文件,将shell=False改为shell=</div> </li> <li><a href="/article/1881505072320409600.htm" title="【填坑】ESP-IDF 环境安装常见报错信息和解决方案" target="_blank">【填坑】ESP-IDF 环境安装常见报错信息和解决方案</a> <span class="text-muted">清凉简装</span> <a class="tag" taget="_blank" href="/search/ESP32/1.htm">ESP32</a><a class="tag" taget="_blank" href="/search/ESP-IDF/1.htm">ESP-IDF</a><a class="tag" taget="_blank" href="/search/%E7%89%A9%E8%81%94%E7%BD%91/1.htm">物联网</a><a class="tag" taget="_blank" href="/search/ESP32S2/1.htm">ESP32S2</a> <div>文章目录Windows平台ESP-IDF环境安装常见报错信息和解决方案一、install时报错**Q1:错误信息:Downloadfailed操作超时或者installationhasfailedwithexitcode-2****Q2:错误信息:Downloadfailed:anerroroccurredinthesecurechannelsupport****Q3:错误信息:'python':</div> </li> <li><a href="/article/1881501920523251712.htm" title="Nginx 缓存清理" target="_blank">Nginx 缓存清理</a> <span class="text-muted">m0_74823452</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/1.htm">学习路线</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/1.htm">阿里巴巴</a><a class="tag" taget="_blank" href="/search/nginx/1.htm">nginx</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>Nginx缓存清理详解Nginx作为一个高效的Web服务器和反向代理服务器,在提供快速的页面响应和优化Web性能方面起着至关重要的作用。Nginx的缓存机制通过存储来自后端服务器或客户端的请求和响应数据,减少了数据的重复处理,从而大幅提高了系统的响应速度和吞吐量。然而,随着缓存数据的不断积累,如何有效地管理和清理缓存变得非常重要。合适的缓存清理策略不仅可以释放磁盘空间,还能确保缓存数据的时效性,防</div> </li> <li><a href="/article/1881499150118350848.htm" title="什么是HTTP POST请求?初学者指南与示范" target="_blank">什么是HTTP POST请求?初学者指南与示范</a> <span class="text-muted">lingllllove</span> <a class="tag" taget="_blank" href="/search/http/1.htm">http</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>什么是HTTPPOST请求?HTTP(超文本传输协议)是Web的基础协议,用于在客户端(如浏览器)和服务器之间传输数据。HTTP请求方法有多种,最常见的包括GET和POST。本文将详细介绍HTTPPOST请求,包括其用途、工作原理及示范。HTTPPOST请求的用途POST请求用于向服务器发送数据,通常用于以下场景:提交表单:例如用户注册或登录表单。上传文件:例如图片或文档上传。发送数据:例如向服务</div> </li> <li><a href="/article/1881493592770408448.htm" title="掌握 Spring Boot 中的 WebClient:何时以及为何使用它而不是 RestTemplate" target="_blank">掌握 Spring Boot 中的 WebClient:何时以及为何使用它而不是 RestTemplate</a> <span class="text-muted">小蜗牛慢慢爬行</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</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/spring/1.htm">spring</a> <div>在开发SpringBoot应用程序时,与RESTfulWeb服务进行通信是一项常见需求。从历史上看,开发人员已将RestTemplate用于此目的。然而,随着反应式编程的出现和对更高效资源利用的需求,WebClient已成为首选。本文探讨了RestTemplate和WebClient之间的差异,并通过实际示例强调了为什么WebClient更适合现代应用程序。何时使用RestTemplate?Res</div> </li> <li><a href="/article/1881491563087982592.htm" title="Apache SeaTunnel 2.3.9 正式发布:多项新特性与优化全面提升数据集成能力" target="_blank">Apache SeaTunnel 2.3.9 正式发布:多项新特性与优化全面提升数据集成能力</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>近日,ApacheSeaTunnel社区正式发布了最新版本2.3.9。本次更新新增了`Helm集群部署、Transform支持多表、Zeta新API、表结构转换、任务提交队列、分库分表合并、列转多行`等多个功能更新!作为一款开源、分布式的数据集成平台,本次版本通过新增功能、性能优化与问题修复,为开发者与企业用户带来了更加全面的支持。2.3.9版本下载:https://seatunnel.apach</div> </li> <li><a href="/article/1881491564425965568.htm" title="小白也能懂的Vite + React组件开发完全指南" target="_blank">小白也能懂的Vite + React组件开发完全指南</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>学习前端开发,你可能会听说过很多工具和框架,其中Vite和React无疑是炙手可热的明星。Vite凭借其闪电般的速度和优秀的开发体验,迅速成为了许多开发者的首选构建工具;而React,作为目前最流行的JavaScript库之一,以其组件化、声明式编程的特性,简化了复杂的Web应用开发。这篇教程将带你快速掌握AI写代码工具Vite和React组件开发的核心技能,让你从小白也能轻松入门,独立完成简单的</div> </li> <li><a href="/article/1881489047508021248.htm" title="为AI聊天工具添加一个知识系统 之40 总纲领和整体设计 之2 三种簿册(账簿/电话簿/户口簿)" target="_blank">为AI聊天工具添加一个知识系统 之40 总纲领和整体设计 之2 三种簿册(账簿/电话簿/户口簿)</a> <span class="text-muted">一水鉴天</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E8%AF%AD%E8%A8%80/1.htm">人工语言</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%99%BA%E8%83%BD/1.htm">软件智能</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E5%88%B6%E9%80%A0/1.htm">智能制造</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>本文要点前面给出的是项目式开发的项目“口号”,有点像包治百病的“万金油”。但在原型(原型式开发的一个原型口号)上分别有三个口号--注意:它们的表达和项目口号完全不同。逻辑上:所有模型model都是错的,但某些模型是有用的。数学上:所有程序prcedure严格来讲都是不精确的,但是有些程序非常接近用户的预期;语言上:所有表达expression都是含糊的,但任何语言都具有巨大的表达力。现在剩下的就是</div> </li> <li><a href="/article/1881488921028784128.htm" title="为AI聊天工具添加一个知识系统 之33 通用项目文档模板 :语言无关/实现无关/符号无关的纯粹的符号学原型" target="_blank">为AI聊天工具添加一个知识系统 之33 通用项目文档模板 :语言无关/实现无关/符号无关的纯粹的符号学原型</a> <span class="text-muted">一水鉴天</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E8%AF%AD%E8%A8%80/1.htm">人工语言</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%99%BA%E8%83%BD/1.htm">软件智能</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E5%88%B6%E9%80%A0/1.htm">智能制造</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/cocoa/1.htm">cocoa</a> <div>本文要点要点提取本项目文档的三个部分(Part1公理化&个性化,Part2形式化&结构化,Part3自动化&智能化)应该给出三种限界上下文--分别确定了语言自由交流用户与访问上下文(语言)、敏捷开发上下文(程序)和稳固核心上下文(数据)。限界上下文是解决边缘模糊的对策--通过分界。它不同于为计算机分类和人类理解两个目的而分别设计的上下文映射和通用语言。但即使是这个扩大了的范围仍然是领域驱动设计DD</div> </li> <li><a href="/article/1881488794784428032.htm" title="智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之14 方案再探 之5:知识树三类节点对应的三种网络形式及其网络主机" target="_blank">智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之14 方案再探 之5:知识树三类节点对应的三种网络形式及其网络主机</a> <span class="text-muted">一水鉴天</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E8%AF%AD%E8%A8%80/1.htm">人工语言</a><a class="tag" taget="_blank" href="/search/%E6%99%BA%E8%83%BD%E5%88%B6%E9%80%A0/1.htm">智能制造</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%99%BA%E8%83%BD/1.htm">软件智能</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>本文要点前面讨论过(前面有错这里做了修正),三种簿册归档对应通过不同的网络形式(分布式、对等式和去中心式)。每种网络主机上分别提供:分布式控制脚本、对等式账本和备记手本通过以上讨论,div模型已经涵盖以下内容:从内容提供者(某个AI聊天工具,特定接口)到知识树及其三种节点(通用接口)到网络主机及其三种网络形式(节点专属操作接口)的要求。后面需要进一步为三者设计一个能实现耦合和解耦的程序需要特别说明</div> </li> <li><a href="/article/1881487157202317312.htm" title="PHP语言的编程范式" target="_blank">PHP语言的编程范式</a> <span class="text-muted">代码驿站520</span> <a class="tag" taget="_blank" href="/search/%E5%8C%85%E7%BD%97%E4%B8%87%E8%B1%A1/1.htm">包罗万象</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</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/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>PHP语言的编程范式引言PHP(PHP:HypertextPreprocessor)是一种广泛使用的开源脚本语言,特别适合于Web开发。虽然最初被设计用于生成动态网页,但随着技术的发展,PHP已逐渐演化为一种功能强大的编程语言,广泛应用于服务器端编程、命令行脚本以及桌面应用程序的开发。目前,PHP的应用范围涵盖了网站开发、数据分析、内容管理系统等多个领域。本文将深入探讨PHP语言的编程范式,包括面</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>