简介
Nginx是一款高性能的开源Web服务器和反向代理服务器,它以其稳定性、低资源消耗以及高并发处理能力而闻名。Nginx作为代理服务器,主要提供两种模式的服务:正向代理和反向代理。
实验准备
四台虚拟机:一台nginx代理服务器、两台后端服务器、一台客户端,关闭防火墙以及SELiunx;VMware关闭NAT模式的DHCP
nginx服务器 | 192.168.0.100/24 |
后端服务器1 | 192.168.0.110/24 |
后端服务器2 | 192.168.0.120/24 |
客户端 | 192.168.0.50/24 |
后端服务器安装httpd
[root@web1 ~]# echo 192.168.0.110 > /var/www/html/index.html
[root@web2 ~]# echo 192.168.0.120 > /var/www/html/index.html
反向代理单台Web服务器
nginx配置
vim /usr/local/nginx/conf/conf.d/web-service.conf #配置完成重启服务
测试
动静分离
web1安装php
yum install -y php
systemctl restart httpd.service
nginx配置
vim /usr/local/nginx/conf/conf.d/web-service.conf
重启nginx服务
测试
缓存功能
缓存功能默认关闭状态,需要先动配置才能启用
proxy_cache zone_name | off; 默认off #指明调用的缓存,或关闭缓存机制;Context:http, server, location,zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
proxy_cache_valid [code ...] time; #定义对特定响应码的响应内容的缓存时长
proxy_cache_path; #定义可用于proxy功能的缓存
非缓存场景压测
[root@web2 ~]# cat /var/log/messages > /var/www/html/log.html
[root@client ~]# yum install -y httpd-tools
[root@client ~]# ab -n1000 -c100 http://www.hello.com/log.html
Server Software: nginx/1.26.2
Server Hostname: www.hello.com
Server Port: 80Document Path: /log.html
Document Length: 313163 bytesConcurrency Level: 100
Time taken for tests: 3.530 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 313444000 bytes
HTML transferred: 313163000 bytes
Requests per second: 283.31 [#/sec] (mean)
Time per request: 352.972 [ms] (mean)
Time per request: 3.530 [ms] (mean, across all concurrent requests)
Transfer rate: 86720.17 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 46 180.5 13 1075
Processing: 16 296 225.7 206 1470
Waiting: 2 39 48.9 21 473
Total: 17 342 299.0 231 2540Percentage of the requests served within a certain time (ms)
配置缓存功能
vim /usr/local/nginx/conf/nginx.conf
vim /usr/local/nginx/conf/conf.d/web-service.conf
重启服务
测试
[root@client ~]# ab -n1000 -c100 http://www.hello.com/log.html
Server Software: nginx/1.26.2
Server Hostname: www.hello.com
Server Port: 80Document Path: /log.html
Document Length: 313163 bytesConcurrency Level: 100
Time taken for tests: 3.627 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 313421000 bytes
HTML transferred: 313163000 bytes
Requests per second: 275.69 [#/sec] (mean)
Time per request: 362.720 [ms] (mean)
Time per request: 3.627 [ms] (mean, across all concurrent requests)
Transfer rate: 84383.28 [Kbytes/sec] received
验证缓存目录结构
负载均衡(七层)
命令含义
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检 测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性 检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再 次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
down #标记为down状态,可以平滑下线后端服务器
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启 Nginx
hash KEY [consistent]; #基于指定请求报文中首部字段或者URI等key做hash计算,使用consistent参数,将使用ketama一致性 hash算法,适用于后端是Cache服务器(如varnish)时使用,consistent定义使用一致性hash运算,一致 性hash基于取模运算
hash $request_uri consistent; #基于用户请求的uri做hash
hash $cookie_sessionid #基于cookie中的sessionid这个key进行hash调度,实现会话绑 定
ip_hash; #源地址hash调度方法,基于的客户端的remote_addr(源地址IPv4的前24位或整个IPv6地址)做hash计 算,以实现会话保持
least_conn; #最少连接调度算法,优先将客户端请求调度到当前连接最少的后端服务器,相当于LVS中的WLC
实验
vim /usr/local/nginx/conf/conf.d/proxy-web.conf
配置完成重启服务
测试
负载均衡(四层)
Nginx在1.9.0版本开始支持tcp模式的负载均衡,在1.9.13版本开始支持udp协议的负载,udp主要用于 DNS的域名解析,其配置方式和指令和http 代理类似,可以实现后端服务器分组转发、权重分配、状态监测、 调度算法等高级功能。
负载均衡实例:DNS
后端服务器配置DNS
yum install -y bind
基础配置在下方连接
http://t.csdnimg.cn/7zmoWhttp://t.csdnimg.cn/7zmoW 192.168.0.110
vim /etc/named.rfc1912.zones
cp -a /var/named/named.localhost /var/named/hello.com.zone
vim /var/named/hello.com.zone
systemctl restart named
192.168.0.120
配置与192.168.0.110相同,只需修改部分内容
vim /var/named/hello.com.zone
systemctl restart named
nginx
添加子配置文件
[root@Nginx ~]# mkdir /usr/local/nginx/conf/tcp.conf
[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
配置子配置文件
vim /usr/local/nginx/conf/tcp.conf/dns.conf
重启nginx服务
测试
在客户端中进行dns解析
dig www.hello.com @192.168.0.100
FistCGI
CGI历史
最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏 览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越来越复杂,以至于出现动态技 术,比如像php(1995年)、java(1995)、python(1991)语言开发的网站,但是nginx/apache服务器并不 能直接运行 php、java这样的文件,apache实现的方式是打补丁,但是nginx缺通过与第三方基于协议实 现,即通过某种特定协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户 的请求,处理完成后返回数据给Nginx并回收进程,最后nginx在返回给客户端,那这个约定就是通用网 关接口(common gateway interface,简称CGI),CGI(协议) 是web服务器和外部应用程序之间的接口 标准,是cgi程序和web服务器之间传递信息的标准化接口。
FastCGI历史
CGI协议虽然解决了语言解析器和 Web Server 之间通讯的问题,但是它的效率很低,因为 Web Server 每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候 再关闭进程,对于每一个创建的CGI进程都会执行这些操作,所以效率很低,而FastCGI是用来提高CGI性 能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请 求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。
FastCHI配置命令
fastcgi_pass address:port; #转发请求到后端FastCGI服务器
fastcgi_index name; #FastCGI默认的主页资源
fastcgi_param parameter value [if_not_empty]; #传递给FastCGI服务器的参数
#可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义 key
fastcgi_param REMOTE_ADDR $remote_addr; #客户端源IP
fastcgi_param REMOTE_PORT $remote_port; #客户端源端口
fastcgi_param SERVER_ADDR $server_addr; #请求的服务器IP地址
fastcgi_param SERVER_PORT $server_port; #请求的服务器端口
fastcgi_param SERVER_NAME $server_name; #请求的server name
FastCGI实验
nginx与php-fpm在同一服务器
源码编译nginx
解压插件
tar zxf memc-nginx-module-0.20.tar.gz
tar zxf srcache-nginx-module-0.33.tar.gz
tar zxf echo-nginx-module-0.63.tar.gz
进入目录检查环境
cd nginx-1.26.2/
./configure --prefix=/usr/local/nginx \
> --add-module=/root/echo-nginx-module-0.63 \
> --add-module=/root/memc-nginx-module-0.20 \
> --add-module=/root/srcache-nginx-module-0.33 \
> --user=nginx \
> --group=nginx \
> --with-http_v2_module \
> --with-http_realip_module \
> --with-http_gzip_static_module \
> --with-http_stub_status_module \
> --with-stream \
> --with-stream_ssl_module \
> --with-stream_realip_module \
> --with-pcre
编译文件并安装
make && make install
启动nginx
源码编译PHP
解决依赖
yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel
解压php压缩包
tar zxf php-8.3.9.tar.gz
cd php-8.3.9/
./configure --help #查看帮助
检测环境
./configure --prefix=/usr/local/php \
> --with-config-file-path=/usr/local/php/etc \
> --enable-fpm \
> --with-fpm-user=nginx \
> --with-fpm-group=nginx \
> --with-curl \
> --with-iconv \
> --with-mhash \
> --with-zlib \
> --with-openssl \
> --enable-mysqlnd \
> --with-mysqli \
> --with-pdo-mysql \
> --disable-debug \
> --enable-sockets \
> --enable-soap \
> --enable-xml \
> --enable-ftp \
> --enable-gd \
> --enable-exif \
> --enable-mbstring \
> --enable-bcmath \
> --with-fpm-systemd
编译并安装
make && make install
php配置优化
[root@Nginx ~]# cd /usr/local/php/etc/
[root@Nginx etc]# cp -p php-fpm.conf.default php-fpm.conf
[root@Nginx etc]# vim php-fpm.conf
[root@Nginx etc]# cd php-fpm.d/
[root@Nginx php-fpm.d]# cp -p www.conf.default www.conf
[root@Nginx php-fpm.d]# cd /root/php-8.3.9/
[root@Nginx php-8.3.9]# cp -p php.ini-production /usr/local/php/etc/php.ini
[root@Nginx php-8.3.9]# vim /usr/local/php/etc/php.ini
[root@Nginx php-8.3.9]# cd /root/php-8.3.9/sapi/fpm/
[root@Nginx fpm]# cp php-fpm.service /lib/systemd/system/
[root@Nginx fpm]# vim /lib/systemd/system/php-fpm.service
[root@Nginx fpm]# systemctl daemon-reload
[root@Nginx fpm]# systemctl start php-fpm.service
添加环境
[root@Nginx fpm]# vim ~/.bash_profile
[root@Nginx fpm]# source ~/.bash_profile
php的nginx配置
[root@Nginx ~]# mkdir /data/web/php
[root@Nginx ~]# vim /data/web/php/index.php
[root@Nginx ~]# vim /usr/local/nginx/conf/nginx.conf
[root@Nginx ~]# vim /usr/local/nginx/conf/conf.d/php.conf
[root@Nginx ~]# nginx -s reload
测试
测试客户端需要有dns解析
php缓存优化
php动态拓展模块/缓存模块
模块下载
PECL :: Package :: memcache (php.net)http://pecl.php.net/package/memcache 安装memcache模块
[root@Nginx ~]# tar zxf memcache-8.2.tgz
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# yum install -y autoconf
[root@Nginx memcache-8.2]# phpize
[root@Nginx memcache-8.2]# ./configure && make && make install #安装
配置php加载memcache模块
[root@Nginx memcache-8.2]# vim /usr/local/php/etc/php.ini
[root@Nginx memcache-8.2]# systemctl reload php-fpm.service
部署memcached
[root@Nginx memcache-8.2]# yum install -y memcached
cat /etc/sysconfig/memcached #memcached路径
systemctl enable --now memcached.service
netstat -antlupe | grep mem
添加测试文件和图形监控文件
[root@Nginx ~]# cd memcache-8.2/
[root@Nginx memcache-8.2]# cp example.php memcache.php /data/web/php/
[root@Nginx ~]# vim /data/web/php/memcache.php
无优化压力测试
开启memcache压力测试
测试
访问 http://php.hello.com/example.php 不断刷新
访问 http://php.hello.com/memcache.php 查看命中效果
php 高速缓存
通过nginx的模块直接对memcache进行访问
需要在nginx源码安装时添加的模块
vim /usr/local/nginx/conf/conf.d/php.conf
压力测试