应用架构之【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/1835511912843014144.htm" title="理解Gunicorn:Python WSGI服务器的基石" target="_blank">理解Gunicorn:Python WSGI服务器的基石</a> <span class="text-muted">范范0825</span> <a class="tag" taget="_blank" href="/search/ipython/1.htm">ipython</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico</div> </li> <li><a href="/article/1835509390879322112.htm" title="扫地机类清洁产品之直流无刷电机控制" target="_blank">扫地机类清洁产品之直流无刷电机控制</a> <span class="text-muted">悟空胆好小</span> <a class="tag" taget="_blank" href="/search/%E6%B8%85%E6%B4%81%E6%9C%8D%E5%8A%A1%E6%9C%BA%E5%99%A8%E4%BA%BA/1.htm">清洁服务机器人</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/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>扫地机类清洁产品之直流无刷电机控制1.1前言扫地机产品有很多的电机控制,滚刷电机1个,边刷电机1-2个,清水泵电机,风机一个,部分中高端产品支持抹布功能,也就是存在抹布盘电机,还有追觅科沃斯石头等边刷抬升电机,滚刷抬升电机等的,这些电机有直流有刷电机,直接无刷电机,步进电机,电磁阀,挪动泵等不同类型。电机的原理,驱动控制方式也不行。接下来一段时间的几个文章会作个专题分析分享。直流有刷电机会自动持续</div> </li> <li><a href="/article/1835507739820912640.htm" title="2018-07-23-催眠日作业-#不一样的31天#-66小鹿" target="_blank">2018-07-23-催眠日作业-#不一样的31天#-66小鹿</a> <span class="text-muted">小鹿_33</span> <div>预言日:人总是在逃避命运的路上,与之不期而遇。心理学上有个著名的名词,叫做自证预言;经济学上也有一个很著名的定律叫做,墨菲定律;在灵修派上,还有一个很著名的法则,叫做吸引力法则。这3个领域的词,虽然看起来不太一样,但是他们都在告诉人们一个现象:你越担心什么,就越有可能会发生什么。同样的道理,你越想得到什么,就应该要积极地去创造什么。无论是自证预言,墨菲定律还是吸引力法则,对人都有正反2个维度的影响</div> </li> <li><a href="/article/1835507358353158144.htm" title="《大清方方案》| 第二话" target="_blank">《大清方方案》| 第二话</a> <span class="text-muted">谁佐清欢</span> <div>和珅究竟说了些什么?竟能令堂堂九五之尊龙颜失色!此处暂且按下不表;单说这位乾隆皇帝,果真不愧是康熙从小带过的,一旦决定了要做的事,便杀伐决断毫不含糊。他当即亲自拟旨,着令和珅为钦差大臣,全权负责处理方方事件,并钦赐尚方宝剑,遇急则三品以下官员可先斩后奏。和珅身负皇上重托,岂敢有半点怠慢,当夜即率领相关人等,马不停蹄杀奔江汉。这一路上,和珅的几位幕僚一直在商讨方方事件的处置方案。有位年轻幕僚建议快刀</div> </li> <li><a href="/article/1835505957011025920.htm" title="《庄子.达生9》" target="_blank">《庄子.达生9》</a> <span class="text-muted">钱江潮369</span> <div>【原文】孔子观于吕梁,县水三十仞,流沫四十里,鼋鼍鱼鳖之所不能游也。见一丈夫游之,以为有苦而欲死也,使弟子并流而拯之。数百步而出,被发行歌而游于塘下。孔子从而问焉,曰:“吾以子为鬼,察子则人也。请问,‘蹈水有道乎’”曰:“亡,吾无道。吾始乎故,长乎性,成乎命。与齐俱入,与汩偕出,从水之道而不为私焉。此吾所以蹈之也。”孔子曰:“何谓始乎故,长乎性,成乎命?”曰:“吾生于陵而安于陵,故也;长于水而安于</div> </li> <li><a href="/article/1835504218178416640.htm" title="Google earth studio 简介" target="_blank">Google earth studio 简介</a> <span class="text-muted">陟彼高冈yu</span> <a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a> <div>GoogleEarthStudio是一个基于Web的动画工具,专为创作使用GoogleEarth数据的动画和视频而设计。它利用了GoogleEarth强大的三维地图和卫星影像数据库,使用户能够轻松地创建逼真的地球动画、航拍视频和动态地图可视化。网址为https://www.google.com/earth/studio/。GoogleEarthStudio是一个基于Web的动画工具,专为创作使用G</div> </li> <li><a href="/article/1835502578050363392.htm" title="PHP环境搭建详细教程" target="_blank">PHP环境搭建详细教程</a> <span class="text-muted">好看资源平台</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a> <div>PHP是一个流行的服务器端脚本语言,广泛用于Web开发。为了使PHP能够在本地或服务器上运行,我们需要搭建一个合适的PHP环境。本教程将结合最新资料,介绍在不同操作系统上搭建PHP开发环境的多种方法,包括Windows、macOS和Linux系统的安装步骤,以及本地和Docker环境的配置。1.PHP环境搭建概述PHP环境的搭建主要分为以下几类:集成开发环境:例如XAMPP、WAMP、MAMP,这</div> </li> <li><a href="/article/1835498925755297792.htm" title="DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理" target="_blank">DIV+CSS+JavaScript技术制作网页(旅游主题网页设计与制作)云南大理</a> <span class="text-muted">STU学生网页设计</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/%E6%9C%9F%E6%9C%AB%E7%BD%91%E9%A1%B5%E4%BD%9C%E4%B8%9A/1.htm">期末网页作业</a><a class="tag" taget="_blank" href="/search/html%E9%9D%99%E6%80%81%E7%BD%91%E9%A1%B5/1.htm">html静态网页</a><a class="tag" taget="_blank" href="/search/html5%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">html5期末大作业</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1/1.htm">网页设计</a><a class="tag" taget="_blank" href="/search/web%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web大作业</a> <div>️精彩专栏推荐作者主页:【进入主页—获取更多源码】web前端期末大作业:【HTML5网页期末作业(1000套)】程序员有趣的告白方式:【HTML七夕情人节表白网页制作(110套)】文章目录二、网站介绍三、网站效果▶️1.视频演示2.图片演示四、网站代码HTML结构代码CSS样式代码五、更多源码二、网站介绍网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程</div> </li> <li><a href="/article/1835498219489030144.htm" title="高端密码学院笔记285" target="_blank">高端密码学院笔记285</a> <span class="text-muted">柚子_b4b4</span> <div>高端幸福密码学院(高级班)幸福使者:李华第(598)期《幸福》之回归内在深层生命原动力基础篇——揭秘“激励”成长的喜悦心理案例分析主讲:刘莉一,知识扩充:成功=艰苦劳动+正确方法+少说空话。贪图省力的船夫,目标永远下游。智者的梦再美,也不如愚人实干的脚印。幸福早课堂2020.10.16星期五一笔记:1,重视和珍惜的前提是知道它的价值非常重要,当你珍惜了,你就真正定下来,真正的学到身上。2,大家需要</div> </li> <li><a href="/article/1835498218293653504.htm" title="2020-04-12每天三百字之连接与替代" target="_blank">2020-04-12每天三百字之连接与替代</a> <span class="text-muted">冷眼看潮</span> <div>不知道是不是好为人师,有时候还真想和别人分享一下我对某些现象的看法或者解释。人类社会不断发展进步的过程,就是不断连接与替代的过程。人类发现了火并应用火以后,告别了茹毛饮血的野兽般的原始生活(火烧、烹饪替代了生食)人类用石器代替了完全手工,工具的使用使人类进步一大步。类似这样的替代还有很多,随着科技的发展,有更多的原始的事物被替代,代之以更高效、更先进的技术。在近现代,汽车替代了马车,高速公路和铁路</div> </li> <li><a href="/article/1835497411179540480.htm" title="深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具" target="_blank">深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具</a> <span class="text-muted">nseejrukjhad</span> <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/python/1.htm">python</a> <div>深入理解MultiQueryRetriever:提升向量数据库检索效果的强大工具引言在人工智能和自然语言处理领域,高效准确的信息检索一直是一个关键挑战。传统的基于距离的向量数据库检索方法虽然广泛应用,但仍存在一些局限性。本文将介绍一种创新的解决方案:MultiQueryRetriever,它通过自动生成多个查询视角来增强检索效果,提高结果的相关性和多样性。MultiQueryRetriever的工</div> </li> <li><a href="/article/1835496821133242368.htm" title="东南林氏之九牧林候选父系" target="_blank">东南林氏之九牧林候选父系</a> <span class="text-muted">祖缘树TheYtree</span> <div>渊源介绍东晋初年晋安林始祖林禄公入闽,传十世隋右丞林茂,由晋安迁居莆田北螺村。又五世而至林万宠,唐开元间任高平太守,生三子:韬、披、昌。韬公之孙攒,唐德宗立双阙以旌表其孝,时号"阙下林家"。昌公字茂吉,乃万宠公第三子,官兵部司马,配宋氏,生一子名萍。萍于唐贞元间明经及第,官沣洲司马(后追赠中宪大夫)。唐太和年间归隐后,迁居仙游游洋,世称“游洋林”;其后裔居游洋后迁移漳州漳浦路下,由路下林第四房平和</div> </li> <li><a href="/article/1835496149843275776.htm" title="关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript" target="_blank">关于城市旅游的HTML网页设计——(旅游风景云南 5页)HTML+CSS+JavaScript</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</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><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/%E6%97%85%E6%B8%B8/1.htm">旅游</a><a class="tag" taget="_blank" href="/search/%E9%A3%8E%E6%99%AF/1.htm">风景</a> <div>⛵源码获取文末联系✈Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业|游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作|HTML期末大学生网页设计作业,Web大学生网页HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScrip</div> </li> <li><a href="/article/1835496148601761792.htm" title="HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动" target="_blank">HTML网页设计制作大作业(div+css) 云南我的家乡旅游景点 带文字滚动</a> <span class="text-muted">二挡起步</span> <a class="tag" taget="_blank" href="/search/web%E5%89%8D%E7%AB%AF%E6%9C%9F%E6%9C%AB%E5%A4%A7%E4%BD%9C%E4%B8%9A/1.htm">web前端期末大作业</a><a class="tag" taget="_blank" href="/search/web%E8%AE%BE%E8%AE%A1%E7%BD%91%E9%A1%B5%E8%A7%84%E5%88%92%E4%B8%8E%E8%AE%BE%E8%AE%A1/1.htm">web设计网页规划与设计</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/dreamweaver/1.htm">dreamweaver</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>Web前端开发技术描述网页设计题材,DIV+CSS布局制作,HTML+CSS网页设计期末课程大作业游景点介绍|旅游风景区|家乡介绍|等网站的设计与制作HTML期末大学生网页设计作业HTML:结构CSS:样式在操作方面上运用了html5和css3,采用了div+css结构、表单、超链接、浮动、绝对定位、相对定位、字体样式、引用视频等基础知识JavaScript:做与用户的交互行为文章目录前端学习路线</div> </li> <li><a href="/article/1835495170972413952.htm" title="git - Webhook让部署自动化" target="_blank">git - Webhook让部署自动化</a> <span class="text-muted">大猪大猪</span> <div>我们现在有一个需求,将项目打包上传到gitlab或者github后,程序能自动部署,不用手动地去服务器中进行项目更新并运行,如何做到?这里我们可以使用gitlab与github的挂钩,挂钩的原理就是,每当我们有请求到gitlab与github服务器时,这时他俩会根据我们配置的挂钩地扯进行访问,webhook挂钩程序会一直监听着某个端口请求,一但收到他们发过来的请求,这时就知道用户有请求提交了,这时</div> </li> <li><a href="/article/1835493651992637440.htm" title="大伟说成语之唉声叹气" target="_blank">大伟说成语之唉声叹气</a> <span class="text-muted">求索大伟</span> <div>*大伟说成语*【唉声叹气】叹气:因心里不痛快或不如意而吐出长气,发出声音。因为痛苦、憋闷或感伤而发出叹息的声音。【大伟说】情绪外露,非人类所特有,动物亦有情绪,悲哀和欢乐所表示的情绪亦是不一样的,会嗷嗷大叫也会低吟痛哭。不同的是,人类的情绪更复杂,更多样,更丰富。唉声叹气,可以说是最基础的情绪,因为无奈而举足无措,不知该如何如何化解,只有独自一人慢慢承受,长吁短叹不知如何是好,其实是无能无力的表现</div> </li> <li><a href="/article/1835493373906087936.htm" title="libyuv之linux编译" target="_blank">libyuv之linux编译</a> <span class="text-muted">jaronho</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a> <div>文章目录一、下载源码二、编译源码三、注意事项1、银河麒麟系统(aarch64)(1)解决armv8-a+dotprod+i8mm指令集支持问题(2)解决armv9-a+sve2指令集支持问题一、下载源码到GitHub网站下载https://github.com/lemenkov/libyuv源码,或者用直接用git克隆到本地,如:gitclonehttps://github.com/lemenko</div> </li> <li><a href="/article/1835493267907637248.htm" title="webpack图片等资源的处理" target="_blank">webpack图片等资源的处理</a> <span class="text-muted">dmengmeng</span> <div>需要的loaderfile-loader(让我们可以引入这些资源文件)url-loader(其实是file-loader的二次封装)img-loader(处理图片所需要的)在没有使用任何处理图片的loader之前,比如说css中用到了背景图片,那么最后打包会报错的,因为他没办法处理图片。其实你只想能够使用图片的话。只加一个file-loader就可以,打开网页能准确看到图片。{test:/\.(p</div> </li> <li><a href="/article/1835492614040809472.htm" title="CX8903:Ebike自行车仪表电源方案开发,Ebike智能仪表电源芯片" target="_blank">CX8903:Ebike自行车仪表电源方案开发,Ebike智能仪表电源芯片</a> <span class="text-muted">诚芯微科技</span> <a class="tag" taget="_blank" href="/search/%E7%A4%BE%E4%BA%A4%E7%94%B5%E5%AD%90/1.htm">社交电子</a> <div>CX8903:电动Ebike自行车仪表电源方案开发,Ebike智能仪表电源芯片推荐。电动助力自行车EBIKE凭借其环保、健康、低噪、和便捷等特点,成为了越来越受欢迎的骑行便利交通工具。提供电动Ebike自行车仪表电源方案开发、E-BIKE电动助力自行车仪表供电电源解决方案。CX8903采用100V高压制造工艺(芯片最高耐压可到100V以上),SOP-8L贴片封装,CX8903内置100V/90mΩ</div> </li> <li><a href="/article/1835492487783870464.htm" title="CX8836:小体积大功率升降压方案推荐(附Demo设计指南)" target="_blank">CX8836:小体积大功率升降压方案推荐(附Demo设计指南)</a> <span class="text-muted">诚芯微科技</span> <a class="tag" taget="_blank" href="/search/%E7%A4%BE%E4%BA%A4%E7%94%B5%E5%AD%90/1.htm">社交电子</a> <div>CX8836是一颗同步四开关单向升降压控制器,在4.5V-40V宽输入电压范围内稳定工作,持续负载电流10A,能够在输入高于或低于输出电压时稳定调节输出电压,可适用于USBPD快充、车载充电器、HUB、汽车启停系统、工业PC电源等多种升降压应用场合,为大功率TYPE-CPD车载充电器提供最优解决方案。提供CX8836Demo测试、CX8836样品申请及CX8836方案开发技术支持。CX8836同升</div> </li> <li><a href="/article/1835491605138731008.htm" title="怎么做淘客赚钱(2022最新免费淘客盈利的方法)" target="_blank">怎么做淘客赚钱(2022最新免费淘客盈利的方法)</a> <span class="text-muted">高省_飞智666600</span> <div>很多人都不知道什么是淘宝客,今天小编为大家解答一下吧。淘宝客,现在简称淘客,是时下比较流行的一个词语,特质为淘宝店推广商品获取提成的人,这些人没有自己的产品,只是在淘宝里面选择适合自己的产品,在自己比较熟悉的领域推广,把产品卖出去之后,会从淘宝店家那里获得百分之五到百分之五十左右的佣金。淘宝客付出的是什么呢?时间。你需要花时间去选适合自己推广的产品,需要花时间去选自己的推广方法,如果你打算自己做个</div> </li> <li><a href="/article/1835490218845761536.htm" title="Python爬虫解析工具之xpath使用详解" target="_blank">Python爬虫解析工具之xpath使用详解</a> <span class="text-muted">eqa11</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/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>文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门</div> </li> <li><a href="/article/1835489693953781760.htm" title="锁之缘" target="_blank">锁之缘</a> <span class="text-muted">尘缘诗词原创作品</span> <div>是谁追寻梦的足迹,是谁在偷偷的哭泣,日月隔离在黑白天地情感在心中蔓延的痕迹天与地的距离有多远流失的星晨落入哪片空间不要让泪水模糊双眼心牢中一样充满温暖谁说爱情没有永远白娘子又为何爱许仙蝴蝶墓地展翅翩翩轻歌慢舞袖卷人间传奇千古留爱万年…………月落星飞徘徊是选择不去问自已为合舍不得寂寞本就是痛苦的不在追寻梦中的痕迹才不会失去真实的自已</div> </li> <li><a href="/article/1835489587498151936.htm" title="ARM驱动学习之基础小知识" target="_blank">ARM驱动学习之基础小知识</a> <span class="text-muted">JT灬新一</span> <a class="tag" taget="_blank" href="/search/ARM/1.htm">ARM</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>ARM驱动学习之基础小知识•sch原理图工程师工作内容–方案–元器件选型–采购(能不能买到,价格)–原理图(涉及到稳定性)•layout画板工程师–layout(封装、布局,布线,log)(涉及到稳定性)–焊接的一部分工作(调试阶段板子的焊接)•驱动工程师–驱动,原理图,layout三部分的交集容易发生矛盾•PCB研发流程介绍–方案,原理图(网表)–layout工程师(gerber文件)–PCB板</div> </li> <li><a href="/article/1835489588169240576.htm" title="ARM驱动学习之5 LEDS驱动" target="_blank">ARM驱动学习之5 LEDS驱动</a> <span class="text-muted">JT灬新一</span> <a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/C/1.htm">C</a><a class="tag" taget="_blank" href="/search/%E5%BA%95%E5%B1%82/1.htm">底层</a><a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a> <div>ARM驱动学习之5LEDS驱动知识点:•linuxGPIO申请函数和赋值函数–gpio_request–gpio_set_value•三星平台配置GPIO函数–s3c_gpio_cfgpin•GPIO配置输出模式的宏变量–S3C_GPIO_OUTPUT注意点:DRIVER_NAME和DEVICE_NAME匹配。实现步骤:1.加入需要的头文件://Linux平台的gpio头文件#include//三</div> </li> <li><a href="/article/1835489586684456960.htm" title="ARM驱动学习之4小结" target="_blank">ARM驱动学习之4小结</a> <span class="text-muted">JT灬新一</span> <a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>ARM驱动学习之4小结#include#include#include#include#include#defineDEVICE_NAME"hello_ctl123"MODULE_LICENSE("DualBSD/GPL");MODULE_AUTHOR("TOPEET");staticlonghello_ioctl(structfile*file,unsignedintcmd,unsignedlo</div> </li> <li><a href="/article/1835489438243844096.htm" title="Low Power概念介绍-Voltage Area" target="_blank">Low Power概念介绍-Voltage Area</a> <span class="text-muted">飞奔的大虎</span> <div>随着智能手机,以及物联网的普及,芯片功耗的问题最近几年得到了越来越多的重视。为了实现集成电路的低功耗设计目标,我们需要在系统设计阶段就采用低功耗设计的方案。而且,随着设计流程的逐步推进,到了芯片后端设计阶段,降低芯片功耗的方法已经很少了,节省的功耗百分比也不断下降。芯片的功耗主要由静态功耗(staticleakagepower)和动态功耗(dynamicpower)构成。静态功耗主要是指电路处于等</div> </li> <li><a href="/article/1835489081480540160.htm" title="C++ | Leetcode C++题解之第409题最长回文串" target="_blank">C++ | Leetcode C++题解之第409题最长回文串</a> <span class="text-muted">Ddddddd_158</span> <a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/Leetcode/1.htm">Leetcode</a><a class="tag" taget="_blank" href="/search/%E9%A2%98%E8%A7%A3/1.htm">题解</a> <div>题目:题解:classSolution{public:intlongestPalindrome(strings){unordered_mapcount;intans=0;for(charc:s)++count[c];for(autop:count){intv=p.second;ans+=v/2*2;if(v%2==1andans%2==0)++ans;}returnans;}};</div> </li> <li><a href="/article/1835485375355777024.htm" title="2020-12-24" target="_blank">2020-12-24</a> <span class="text-muted">我和我的天使们</span> <div>阅读《老子的心事》391—403“将欲取之,必固与之”:想要得到什么,首先就要送出什么。我常常对孩子们说,你希望别人怎样对你你就怎样对待别人。想要得到别人的尊重,首先要尊重别人。我希望她们可以不迟到,因为不迟到是对别人的尊重,我就自己就先做到不迟到。哪怕是约朋友逛街,我尽量准时赴约。我严格要求孩子们,也同样严格要求自己,我跟孩子们一起把好的品格变成习惯。“是谓微明”:这就是微妙的智慧。看起来很少很</div> </li> <li><a href="/article/1835484420023349248.htm" title="18、架构-可观测性之聚合度量" target="_blank">18、架构-可观测性之聚合度量</a> <span class="text-muted">大树~~</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>聚合度量聚合度量是指对系统运行时产生的各种指标数据进行收集、聚合和分析,以了解系统的健康状况和性能表现。聚合度量是可观测性的关键组成部分,通过对度量数据的分析,可以及时发现系统中的异常和瓶颈。以下是对聚合度量各个方面的详细解析,并结合具体的数据案例和技术支撑。指标收集收集系统运行时产生的各种指标数据是聚合度量的基础。常见的指标包括CPU使用率、内存使用率、请求处理时间、请求数、错误率等。以下是指标</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>