企业高性能web服务器

一、web服务器基础介绍

企业高性能Web服务器是现代互联网架构中不可或缺的一部分,其主要功能是接收和响应来自客户端的HTTP请求,并提供相应的Web内容。本文将详细介绍Web服务器的基础概念、工作原理以及一些常用的高性能Web服务器。

1、Web服务器的基本概念

Web服务器是一种软件程序,它运行在服务器上,用于接收和响应来自客户端的HTTP请求。其基本作用包括:

  • 接收请求:当用户通过浏览器访问一个网址时,Web服务器首先接收这个请求。
  • 处理请求:根据请求的内容,Web服务器会进行相应的处理,如查找并获取网页文件、执行脚本等。
  • 响应请求:最后,Web服务器将处理结果返回给客户端(即用户的浏览器)。

2、Web服务器的工作原理

Web服务器的工作流程大致如下:

  • 接收请求:客户端(如浏览器)发送一个HTTP请求到Web服务器。
  • 解析请求:Web服务器解析该请求,确定需要获取的资源或执行的操作。
  • 处理请求:根据请求类型,可能涉及查找静态文件、执行动态脚本(PHP)、数据库查询。
  • 生成响应:将处理结果封装成HTTP响应,返回给客户端。
  • 发送响应:客户端接收到响应后,渲染页面并展示给用户。

3、常见的高性能Web服务器

  • Nginx

Nginx是一款轻量级、高性能的HTTP和反向代理服务器,以其卓越的稳定性、高并发处理能力、丰富的功能模块和低资源消耗而著称。它广泛应用于静态文件服务、动态内容生成、负载均衡、缓存等场景。Nginx还支持多种协议,可以作为负载均衡器API网关使用。

  •  Apache HTTP Server

Apache HTTP Server是一个开源的跨平台Web服务器软件,具有高度可配置性和扩展性。它支持多种模块,如 mod_rewrite用于URL重写、mod_gzip用于压缩内容以减少带宽使用等。

4、性能优化与最佳实践

为了确保Web服务器的高性能,通常需要进行以下优化:

  • 硬件选择:选择合适的硬件配置,如CPU、内存和存储设备。
  • 操作系统优化:调整操作系统的相关设置,如内核参数和网络配置。
  • Web服务器软件配置:合理配置Web服务器的参数,如连接数限制、缓冲区大小等。
  • 使用负载均衡:通过多个Web服务器实例分担负载,提高系统的可用性和扩展性。
  • 数据库优化:优化数据库查询和存储结构,减少响应时间。
  • 缓存策略:利用缓存技术减少对后端资源的访问次数,提高响应速度

二、 Nginx 架构和安装

Nginx架构设计

Nginx采用的是多进程模型,由一个master进程和多个worker进程组成。master进程负责读取和解析配置文件,并启动工作进程。一旦master进程启动,它会生成一组worker进程来处理网络请求。

Nginx具有高度的模块化设计,这使得它具有高度的可扩展性。通过引入不同的模块,可以实现各种功能,如负载均衡、缓存、反向代理等。

Nginx使用事件驱动模型,这意味着它可以同时处理大量的并发连接,而不需要为每个连接分配单独的线程或进程。这种模型极大地提高了系统的资源利用率和性能。

Nginx支持正向代理和反向代理两种模式。在正向代理模式下,Nginx作为客户端与上游服务器进行通信;而在反向代理模式下,Nginx则作为服务器,将客户端的请求转发给上游服务器并返回响应。

Nginx内部使用内存池来管理连接和读写操作,这样可以减少频繁的内存分配和释放带来的性能开销。

Nginx安装步骤

Nginx下载地址

https://nginx.org/en/download.html

可以从Nginx官方网站下载最新版本的源码包。例如:

   tar -zxvf nginx-1.24..tar.gz 

安装Nginx所需的依赖库,如gcc、zlib、openssl等:

   yum install -y gcc-c++ zlib-devel openssl openssl-devel pcre pcre-devel

 增加无家目录的用户

useradd -s /sbin/nologin -M nginx

进入解压后的目录,执行以下命令进行编译和安装:

./configure --prefix=/usr/local/nginx \
--user=nginx \ # 指定nginx运行用户
--group=nginx \ # 指定nginx运行组
--with-http_ssl_module \ # 支持https://
--with-http_v2_module \ # 支持http版本2
--with-http_realip_module \ # 支持ip透传
--with-http_stub_status_module \ # 支持状态页面
--with-http_gzip_static_module \ # 支持压缩
--with-pcre \ # 支持正则
--with-stream \ # 支持tcp反向代理
--with-stream_ssl_module \ # 支持tcp的ssl加密
--with-stream_realip_module # 支持tcp的透传ip

修改本地hosts配置文件,并刷新Nginx配置文件:

 vim /etc/hosts #编写本地地址解析
如: 192.168.1.1   www.xixibuhaha.com
nginx -s reload #重启nginx

然后使用浏览器访问指定的网址(www.xixibuhaha.com)以验证是否成功

三、Nginx高级配置

  1. 工作进程数量

    • Nginx 的性能与工作进程的数量密切相关。建议根据 CPU 核数设置工作进程数量,通常为 CPU 核数的倍数。
    • 在 Nginx 配置文件中设置:
     worker_rlimit_nofile 65535;
  1. 事件处理模型
    • 使用异步 I/O 模型(如 Kqueue 或 select)可以显著提升 Nginx 的性能。在 Nginx 配置文件中启用该模型:
     events {
         use kqueue;
     }
  1. 连接数设置
    • 设置 worker_connections 参数以允许每个工作进程处理的最大连接数。例如:
     worker_connections 1024;
  1. 缓冲区大小
    • 调整发送和接收缓冲区的大小,以优化数据传输效率。例如:
     sendfile on;
     keepalive_timeout 65;
  1. 日志格式和压缩
    • 使用 Gzip 压缩响应体,减少带宽消耗并加快页面加载速度。例如:
     gzip on;
     gzipp_comp_level 9;
  1. 负载均衡
    • 配置多台后端服务器,并使用 Nginx 进行负载均衡。例如:
     upstream backend_machines {
         server machine1.example.com ;
         server machine2.example.com ;
     }
     server {
         listen 80;
         server_name example.com ;

         location / {
             proxy_pass http://backend_machines;
             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_set_header X-Forwarded-Proto $scheme;
         }
     }
  1. 静态和动态内容分离
    • 将静态内容(如图片、CSS、JS 文件)与动态内容(如 PHP、ASP.NET 页面)分开处理,以提高响应速度。例如:
     location \~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
         root /path/to/static/files;
         try_files $uri $uri/ /index.html ;
     }

     location = / {
         proxy_pass http://backend_server;
         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_set_header X-Forwarded-Proto $scheme;
     }
  • 自定义错误页面和日志格式,提高用户体验和系统监控能力。例如:
      errorpage {
          return 404 /index.html ;
      }

      access_log /var/log/nginx/access.log;

通过以上高级配置和优化策略,可以显著提升 Nginx 的性能,满足企业级应用的需求。

调整Nginx的工作进程数量以优化性能

调整Nginx的工作进程数量以优化性能,需要根据应用类型和系统资源进行细致的配置。以下是详细的步骤和建议:

首先,需要了解服务器的CPU核心数。通常情况下,工作进程的数量应设置为与CPU核心数相等,这样可以确保每个工作进程都能被独立分配到一个CPU上,减少上下文切换的开销。

在Nginx配置文件中,通过worker_processes指令来定义工作进程的数量。例如:

   worker_processes  4;

这里的数字4表示有四个工作进程。

每个工作进程可以处理的最大并发连接数由worker_connections参数控制。这个值应该根据实际需求进行调整,避免过高导致内存耗尽。

如果业务中有大量读取磁盘上的静态文件等可能引起阻塞的操作,那么需要适当增加工作进程数量以充分利用多核架构的优势。然而,如果过多的工作进程会增加进程间切换带来的消耗,因此需要权衡。

设置CPU亲和力可以进一步优化性能。将每个工作进程绑定到特定的CPU核心上,可以降低由于频繁的CPU核切换造成的性能损耗。例如,在Linux系统中,可以通过如下命令设置:

   echo 0 > /proc/sys/vm/drop_caches

然后在Nginx配置中添加:

   worker_cpu_affinity on;

并且可以空出前面1-2个核心供其他用途

三、Nginx Rewrite 相关功能

优化与配置

尽管Nginx本身具有高性能和高并发处理能力,但通过合理的性能优化策略可以进一步提升其性能。这些优化包括但不限于:

  1. 配置优化

    • 调整工作进程数,建议与CPU核数相同或为其倍数。
    • 设置合适的连接数和最大文件描述符数目。
    • 开启高效的传输模式,如HTTP/2。
  2. 系统层面优化

    • 调整内核参数以增加系统文件描述符的数量。
    • 使用压力测试工具如ab进行性能测试并找出瓶颈。
  3. 缓存机制和高并发优化

    • 利用Nginx的反向代理特性,减少对后端服务的直接访问压力。
    • 通过设置合理的超时时间和连接保持时间来提高响应速度。

通过以上方法,企业可以在使用Nginx作为高性能Web服务器时,充分利用其Rewrite功能以及各种性能优化策略,从而实现更加稳定和高效的网络服务。

Nginx中PCRE库的安装和配置步骤

在Nginx中安装和配置PCRE库的步骤如下:

首先,需要确认系统上是否已经安装了PCRE库。如果未安装,可以使用以下命令进行检查:

   pcre version

如果系统中没有PCRE库,或者需要更新到最新版本,可以从PCRE官方网站下载源码包,并将其解压到一个目录中:

   wget http://www PCRE.org PCRE-8.39.tar.gz 
   tar -xzf PCRE-8.39.tar.gz 
   cd PCRE-8.39

进入解压后的目录,执行以下命令进行编译和安装:

   ./configure
   make
   make install

如果遇到错误提示,可能需要检查环境变量或重新下载源码包。

   sudo yum install pcre-devel

在Nginx的配置文件nginx.conf 中,确保已经正确设置了相关的模块和参数。例如,如果使用了正则表达式进行重写(rewrite),则需要将PCRE库编译进Nginx:

   ./configure --with-pcre
   make
   make install

这一步骤确保Nginx在启动时能够正确加载和使用PCRE库。

URL重写

在Nginx中实现基于客户端IP的URL重写,可以通过配置serverlocation块中的rewrite指令来完成。根据,我们可以看到一个具体的示例:

server {
    listen 80;
    server_name example.com ;

    location / {
        rewrite ^/ip/(.+) /$1 break;
    }
}

在这个例子中,当客户端访问example.com 时,如果请求的URL路径以/ip/开头,Nginx会将该请求重写为/加上原始路径后的部分。例如,如果客户端访问的是[http://example.com](http://example.com) (ip/123),Nginx会将其重写为[http://example.com/123](http://example.com/123)

然而,要实现基于客户端IP的URL重写,我们需要结合使用if指令和rewrite指令。例如,如果我们要对来自特定IP段的客户端进行重写,可以这样配置:

server {
    listen 80;
    server_name example.com ;

    location / {
        if ($remote_addr \~^192.168.) {
            rewrite ^/ip/(.+) /$1 break;
        }
    }
}

在这个例子中,如果客户端的IP地址以192.168开头,Nginx会将请求重写为/加上原始路径后的部分。否则,请求将被直接传递给后端服务器。

需要注意的是,$remote_addr是Nginx提供的全局变量,表示客户端的IP地址。

使用压力测试工具(如ab)对Nginx进行性能测试的详细步骤是什么?

使用ab工具对Nginx进行性能测试的详细步骤如下:

可以通过以下命令安装:

     yum install httpd-tools
  1. 准备测试用例

    • 准备一个简单的HTML页面或PHP脚本作为测试内容。这将作为ab工具发送的请求目标。
  2. 执行压力测试

    • 使用ab命令进行压力测试。例如,要测试Nginx服务器在高并发情况下的性能,可以使用以下命令:
     ab -n 200000 -c 5000 http://localhost:8080/index.html 

其中,-n参数指定总请求数,-c参数指定并发用户数,[http://localhost:8080/index.html](http://localhost:8080/index.html) 是被测试的URL地址。

四、 Nginx 反向代理功能

配置 Nginx 反向代理

基本配置

要实现反向代理,首先需要在 Nginx 的配置文件中添加相应的指令。例如:

server {
    listen 80;
    server_name your_server_name;

    location / {
        proxy_pass http://backend;
        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_set_header X-Forwarded-Proto $scheme;
    }
}

在这个配置中,proxy_pass 指令用于指定上游服务器或上游服务器组,而 proxy_set_header 指令用于设置请求头信息。

负载均衡

Nginx 支持多种负载均衡算法,如轮询、IP 哈希、最少连接等。这些算法可以根据每个后端服务器当前的负载情况进行动态分配,从而确保后端服务器不会因请求而过载。

upstream backend {
    server server1.example.com ;
    server server2.example.com ;
}

server {
    listen 80;
    server_name your_server_name;

    location / {
        proxy_pass http://backend;
        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_set_header X-Forwarded-Proto $scheme;
    }
}
缓存加速

Nginx 还可以缓存静态资源或动态页面,减少后端服务器的负载,提高响应速度。通过设置缓存时间、缓存规则等参数,可以灵活地控制缓存策略。

location \~* \.(jpg|jpeg|png|gif|ico)$ {
    proxy_pass http://backend;
    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_set_header X-Forwarded-Proto $scheme;
    proxy缓存设置...
}
  • php的动态扩展模块(php的缓存模块)
                安装memcache模块
[root@Nginx ~]# tar zxf memcache-8.2.tgz
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# yum install autoconf
[root@Nginx memcache-8.2]# phpize
[root@Nginx memcache-8.2]# ./configure && make && make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-nonzts-20230831/
[root@Nginx memcache-8.2]# ls /usr/local/php/lib/php/extensions/no-debug-non-zts-
20230831/
memcache.so opcache.so
                   复制测试文件到nginx发布目录中
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# ls
autom4te.cache config.log configure.ac example.php Makefile.fragments
README
build config.m4 config.w32 include Makefile.objects runtests.php
config9.m4 config.nice CREDITS libtool memcache.la src
config.h config.status docker LICENSE memcache.php
tests
config.h.in configure Dockerfile Makefile modules
[root@Nginx memcache-8.2]# cp example.php memcache.php /data/php/
[root@Nginx ~]# vim /data/php/memcache.php
define('ADMIN_USERNAME','admin'); // Admin Username
define('ADMIN_PASSWORD','lee'); // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
$MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
#$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
                 配置php加载memcache模块
[root@Nginx ~]# vim /usr/local/php/etc/php.ini
;extension=zip
extension=memcache
;zend_extension=opcache
[root@Nginx ~]# systemctl reload php-fpm
[root@Nginx no-debug-non-zts-20230831]# php -m | grep mem
memcache
                部署memcached
[root@Nginx ~]# yum install memcached -y
[root@Nginx ~]# systemctl enable --now memcached.service
[root@Nginx ~]# netstat -antlupe | grep memcache
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN
976 1037243 186762/memcached
[root@Nginx ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1

                查看是否启动 

 

                测试
访问 http://php.timinglee.org/example.php 不断刷新
访问 http://php.timinglee.org/memcache.php 查看命中效果

 结果如下:

php高速缓存  
[root@Nginx ~]# rm -fr /apps/nginx/
[root@Nginx ~]# tar zxf srcache-nginx-module-0.33.tar.gz
[root@Nginx ~]# tar zxf memc-nginx-module-0.20.tar.gz
[root@Nginx ~]# cd nginx-1.26.1/
[root@Nginx nginx-1.26.1]# ./configure --prefix=/apps/nginx --user=nginx --
group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_realip_module --with-http_stub_status_module --with-http_gzip_static_module
--with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --
add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-
0.33
[root@Nginx nginx-1.26.1]# make && make install
[root@Nginx ~]# vim /apps/nginx/conf.d/php.conf
upstream memcache {
server 127.0.0.1:11211;
keepalive 512;
}
server {
listen 80;
server_name php.timinglee.org;
root /data/php;
location /memc {
internal;
memc_connect_timeout 100ms;
memc_send_timeout 100ms;
memc_read_timeout 100ms;
set $memc_key $query_string; #使用内置变量$query_string来作为key
set $memc_exptime 300; #缓存失效时间300秒
memc_pass memcache;
}
location ~ \.php$ {
set $key $uri$args; #设定key的值
srcache_fetch GET /memc $key; #检测mem中是否有要访问的php
srcache_store PUT /memc $key; #缓存为加载的php数据
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
[root@Nginx ~]# systemctl start nginx.service

 配置如下

测试结果 

[root@apache20 ~]# ab -n500 -c10 http://php.timinglee.org/index.phpConcurrency Level: 10Time taken for tests: 0.255 secondsComplete requests: 500Failed requests:
编译安装 openresty

OpenResty 是一个基于 Nginx 和 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。它由中国人章亦春发起,并提供了许多高质量的第三方模块

                解压

tar zxf openresty-1.25.3.1.tar.gz

                添加用户

useradd -r -s /sbin/nologin nginx

                 切换目录

                 检查编译环境

         gmake进行编译   gmake install 进行安装

        安装完成

 

        做一个软链接

         查看版本

  

         抓进程(抓nginx)

        访问测试 

        大体步骤 

[root@Nginx ~]#dnf -yq install gcc pcre-devel openssl-devel perl
[root@Nginx ~]#useradd -r -s /sbin/nologin nginx
[root@Nginx ~]#cd /usr/local/src
[root@Nginx src]#wget https://openresty.org/download/openresty-1.25.3.1.tar.gz
[root@Nginx src]#tar zxf openresty-1.25.3.1.tar.gz
[root@Nginx src]#cd openresty-1.25.3.1/
[root@Nginx openresty-1.17.8.2]#./configure \
--prefix=/apps/openresty \
--user=nginx --group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
[root@Nginx openresty-1.25.3.1]#make && make install
[root@Nginx openresty-1.25.3.1]#ln -s /usr/local/openresty/bin/* /usr/bin/
[root@Nginx openresty-1.25.3.1]#openresty -v
nginx version: openresty/1.25.3.1
[root@Nginx openresty-1.25.3.1]#openresty
[root@Nginx openresty-1.25.3.1]#ps -ef |grep nginx
[root@Nginx ~]#curl 172.25.254.110

  • 22
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溢彩风华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值