一、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高级配置
-
工作进程数量:
- Nginx 的性能与工作进程的数量密切相关。建议根据 CPU 核数设置工作进程数量,通常为 CPU 核数的倍数。
- 在 Nginx 配置文件中设置:
worker_rlimit_nofile 65535;
- 事件处理模型:
- 使用异步 I/O 模型(如 Kqueue 或 select)可以显著提升 Nginx 的性能。在 Nginx 配置文件中启用该模型:
events {
use kqueue;
}
- 连接数设置:
- 设置
worker_connections
参数以允许每个工作进程处理的最大连接数。例如:
- 设置
worker_connections 1024;
- 缓冲区大小:
- 调整发送和接收缓冲区的大小,以优化数据传输效率。例如:
sendfile on;
keepalive_timeout 65;
- 日志格式和压缩:
- 使用 Gzip 压缩响应体,减少带宽消耗并加快页面加载速度。例如:
gzip on;
gzipp_comp_level 9;
- 负载均衡:
- 配置多台后端服务器,并使用 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;
}
}
- 静态和动态内容分离:
- 将静态内容(如图片、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本身具有高性能和高并发处理能力,但通过合理的性能优化策略可以进一步提升其性能。这些优化包括但不限于:
-
配置优化:
- 调整工作进程数,建议与CPU核数相同或为其倍数。
- 设置合适的连接数和最大文件描述符数目。
- 开启高效的传输模式,如HTTP/2。
-
系统层面优化:
- 调整内核参数以增加系统文件描述符的数量。
- 使用压力测试工具如ab进行性能测试并找出瓶颈。
-
缓存机制和高并发优化:
- 利用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重写,可以通过配置server
和location
块中的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
-
准备测试用例:
- 准备一个简单的HTML页面或PHP脚本作为测试内容。这将作为ab工具发送的请求目标。
-
执行压力测试:
- 使用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