一、Nginx 概述及编译安装
1、概述
Nginx是一个高性能的开源HTTP和反向代理服务器,同时也是一个IMAP/POP3邮件代理服务器。它最初由Igor Sysoev于2002年开发,并于2004年首次发布。Nginx以其高并发性、低资源消耗和灵活的配置能力而受到广泛关注,适用于大流量网站和高并发处理场景。
Nginx的主要特点:
-
高性能:Nginx的事件驱动架构使其能够处理大量并发连接,而不需要为每个连接创建一个新的线程或进程。
-
反向代理:Nginx可以作为反向代理服务器,将客户端请求分发到后端服务器,提高系统的可扩展性和安全性。
-
负载均衡:Nginx能够将请求分配到多个后端服务器进行负载均衡,从而优化资源使用和响应时间。
-
静态内容服务:Nginx非常擅长提供静态文件服务,如图像、CSS和JavaScript文件,能以极高的性能响应静态内容请求。
-
动态内容代理:虽然Nginx本身不处理动态内容,但它可以与FastCGI、uWSGI等模块配合,用于处理PHP、Python等动态请求。
-
支持多种协议:不仅支持HTTP和HTTPS,还支持SMTP、POP3和IMAP等邮件协议。
-
模块化架构:Nginx具有良好的模块系统,用户可以根据需要添加不同的功能模块,如gzip压缩、SSL支持、HTTP/2等。
-
简单的配置文件:Nginx的配置文件结构清晰、易于理解,用户可以方便地设置服务器行为和相关参数。
-
高可用性和可扩展性:Nginx可以与其他软件(如Keepalived、HAProxy等)结合,实现高可用性和横向扩展
2、Nginx 进程结构
2.1、web请求处理机制
- 多进程方式:
服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求
- 多线程方式:
与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。主进程主要负责配置管理、进程监控和信号处理,并不会直接处理网络请求。工作进程实际执行处理请求的任务,具备高并发和高效率,能够独立工作,为用户提供响应。
2.2、主进程(Master Process)
-
管理进程:主进程负责管理工作进程的生命周期,包括启动、停止和重启工作进程。
-
配置管理:在启动时,主进程会读取Nginx的配置文件,并根据配置生成和管理工作进程。
-
信号处理:主进程接收来自操作系统的信号(如停止、重启、重新加载配置等),并将这些信号转发给相应的工作进程。
-
负载均衡和监控:虽然主进程不直接处理客户端请求,但它可以监控工作进程的状态并在必要时对其进行调整。
-
中止工作进程:在进行平滑重启或重新加载配置时,主进程会先启动新的工作进程,然后再把现有的工作进程优雅地终止,以保证零停机。
2.3、工作进程(Worker Process)
-
处理请求:工作进程负责实际处理客户端的请求,包括接收请求、发送响应以及完成数据的处理。
-
并发处理:每个工作进程可以处理多个请求,Nginx的事件驱动架构使得它具有非常高的并发处理能力。
-
利用共享内存:工作进程可以通过共享内存进行数据共享,例如会话信息、缓存等,有助于提升性能。
-
事件驱动:工作进程使用非阻塞I/O和异步事件处理机制,有效提高了处理效率和响应速度。
-
独立运行:工作进程在主进程的控制下独立运行,可以以多进程方式处理请求,提高资源的利用率和稳定性
3、Nginx 编译安装
tar zxf nginx-1.24.0.tar.gz
dnf install gcc pcre-devel zlib-devel openssl-devel -y
关闭编译时的调试信息(关闭debug功能)
关闭 Nginx 的调试功能可以帮助提高应用程序的稳定性和安全性,同时减少系统资源的消耗,因此在生产环境中通常建议将其关闭。
vim auto/cc/gcc
./configure
:这是运行 Nginx 配置脚本的命令,它会检查你的系统环境并生成 Makefile 文件,帮助你编译 Nginx。
./configure --prefix=/usr/local/nginx --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
make编译源代码并生成可执行文件
make install将编译好的程序、库和其他必要文件安装到系统的标准目录中
make && make install
为 Nginx 创建一个专用的、没有登录权限的用户
useradd -s /sbin/nologin -M nginx
启动 Nginx
/usr/local/nginx/sbin/nginx
把nginx软件的命令执行路径添加到环境变量中
vim ~/.bash_profile
更新环境变量和配置
source ~/.bash_profile
注:怎么删编译的文件
rm -fr /usr/local/nginx/
make clean
4、平滑升级及版本回滚
4.1、版本升级
wget https://nginx.org/download/nginx-1.26.2.tar.gz
tar zxf nginx-1.26.2.tar.gz
tar zxf echo-nginx-module-0.63.tar.gz
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --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
编译
将旧版本复制一份
将新版本复制到/usr/local/nginx/sbin
\cp -f /root/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin
此时旧版本还在运行,所以无法开启新版本
启动新版本
kill -USR2 38270
这时nginx还是旧版本
回收旧版本
kill -WINCH 38270
查看:
4.2、版本回滚
重启旧版本
kill -HUP 38270
回收新版本
kill -WITCH 45011
复制旧版本到nginx
kill新版本
kill -9 45011
查看:
二、 Nginx 核心配置
1、常用参数
nginx -s stop 关闭nginx 进程
nginx -v 查看 Nginx 版本
nginx -V 显示版本和编译参数
nginx -t 测试配置文件是否正确
nginx -T 查看并打印
nginx -s reload 不关闭进程,重新加载配置
2、启动脚本编写
vim /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now nginx
3、全局配置
vim /usr/local/nginx/conf/nginx.conf
vim /usr/local/nginx/conf/nginx.conf
修改pam(可插拔认证模块)限制
vim /etc/security/limits.conf
sudo -u nginx ulimit -a
vim /usr/local/nginx/conf/nginx.conf
总文件里面加载子配置文件的路径
vim /usr/local/nginx/conf.d/vhost.conf
mkdir -p /data/web/html
echo www.hao.org > /data/web/html/index.html
测试:
vim /usr/local/nginx/conf.d/vhost.conf
测试:
vim /usr/local/nginx/conf.d/vhost.conf
测试:
4、Nginx 账户认证功能
htpasswd
:命令用于管理基本认证的用户密码文件
-m
:使用 MD5 加密算法存储密码
htpasswd -m /usr/local/nginx/.htpasswd hao
cat /usr/local/nginx/.htpasswd
mkdir /data/web/hao
echo hao > /data/web/hao/index.html
vim /usr/local/nginx/conf.d/vhost.conf
测试:
5、自定义错误页面
vim /usr/local/nginx/conf.d/vhost.conf
mkdir -p /data/web/errorpage
echo erro page >/data/web/errorpage/40x.html
nginx -t
nginx -s reload
6、自定义日志
vim /usr/local/nginx/conf.d/vhost.conf
mkdir /var/log/hao.org
nginx -s reload
curl www.hao.org
cat /var/log/hao.org/access.log
curl www.hao.org/haha
cat /var/log/hao.org/error.log
7、检测文件是否存在
vim /usr/local/nginx/conf.d/vhost.conf
mkdir /data/web/html/error
echo erroe default > /data/web/html/error/default.html
测试;
curl www.hao.org
8、长连接
vim /usr/local/nginx/conf/nginx.conf
开启长连接后,返回客户端的会话保持时间为60s,单次长连接累计请求达到指定次数请求或65秒就会被断开,第二个数字60为发送给客户端应答报文头部中显示的超时时间设置为60s:如不设置客户端将不显示超时时间。
请求改为两次
yum install telnet
vim /usr/local/nginx/conf/nginx.conf
测试:
telnet www.hao.org 80
GET / HTTP/1.1
HOST:www.hao.org
9、作为下载服务器配置
mkdir /data/web/download
dd:用于低级别的数据复制和转换
dd if=/dev/zero of=/data/web/download/haofile bs=1M count=100
vim /usr/local/nginx/conf.d/vhost.conf
nginx -s reload
测试
三、Nginx 高级配置
1、Nginx 状态页
状态页用于输出nginx的基本状态信息
vim /usr/local/nginx/conf.d/status.conf
测试:
status.hao.org/status
上面三个数字分别对应accepts,handled,requests三个值
2、Nginx 压缩功能
Nginx支持对指定类型的文件进行压缩然后再传输给客户端
vim /usr/local/nginx/conf/nginx.conf
echo hello guangyu > /data/web/html/small.html
cat /usr/local/nginx/logs/access.log > /data/web/html/big.html
测试:
curl --head --compressed 172.25.254.111/small.html
3、nginx的内置变量
vim /usr/local/nginx/conf.d/vars.conf
curl -b "key1=hao,key2=hao1" -u hao:hao var.hao.org/var?name=hao&&id=6666
4、nginx自定义变量
vim /usr/local/nginx/conf.d/vars.conf
测试:
curl var.hao.org/var
四、Nginx Rewrite 相关功能
1、ngx_http_rewrite_module 模块指令
1.1、if判定
vim vars.conf
测试:
curl var.hao.org/test2/index.html
1.2、break
用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效 位于后面的 ngx_http_rewrite_module 模块中指令就不再执行 Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置, 该指令可以在server块和locationif块中使用
vim /usr/local/nginx/conf.d/vars.conf
curl var.hao.org/break
添加break
vim /usr/local/nginx/conf.d/vars.conf
测试:
curl var.hao.org/break
设定浏览器
vim /usr/local/nginx/conf.d/vars.conf
测试:
curl -A "firefox" var.hao.org/break
curl var.hao.org/break
1.3、return
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重 定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配 置都将不被执行,return可以在server、if 和 location块进行配置
vim /usr/local/nginx/conf.d/vars.conf
测试:
curl -I var.hao.org/return
mkdir /data/web/html/return
curl -I var.hao.org/return
2、rewrite 指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配, rewrite主要是针对用户请求的URL或者是URI做具体处理
2.1、rewirte 临时和永久
vim /usr/local/nginx/conf.d/vars.conf
mkdir /data/web/var
echo var page > /data/web/var/index.html
永久重定向301
vim /usr/local/nginx/conf.d/vars.conf
测试:
临时重定向301
vim /usr/local/nginx/conf.d/vars.conf
测试:
curl -I var.hao.org
2.2、rewrite 案例:break 和last
mkdir /data/web/html/{test1,test2,break,last} -p
echo test1 > /data/web/html/test1/index.html
echo test2 > /data/web/html/test2/index.html
echo last > /data/web/html/last/index.html
echo break > /data/web/html/break/index.html
vim /usr/local/nginx/conf.d/vars.conf
测试;
curl var.hao.org/break/
curl var.hao.org/last/
curl var.hao.org/test1/
curl var.hao.org/test2/
添加break和last
测试:
curl var.hao.org/break/index.html
curl var.hao.org/last/index.html
3、Nginx 防盗链
3.1、全站加密
cd /usr/local/nginx/
mkdir certs
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/nginx/certs/hao.org.key \ -x509 -days 365 -out /usr/local/nginx/certs/hao.org.crt
vim vhosts.conf
测试:
vim vhosts.conf
3.2、实现盗链
vim /usr/local/nginx/conf.d/vhosts.conf
另一台中模拟盗链网页
yum install httpd -y
vim /var/www/html/index.html
systemctl enable --now httpd
测试:
172.25.254.10
3.3、实现防盗链
vim /usr/local/nginx/conf.d/vhosts.conf
测试:
172.25.254.10
Nginx 反向代理功能
1、反向代理
反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的 一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预 定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能
- ngx_http_proxy_module 将客户端的请求以http协议转发至指定服务器进行处理
- ngx_http_upstream_module 用于定义为proxy_pass,fastcgi_pass,uwsgi_pass #等指令引用的后端服务器分组
- ngx_stream_proxy_module 将客户端的请求以tcp协议转发至指定服务器处理
- ngx_http_fastcgi_module 将客户端对php的请求以fastcgi协议转发至指定服务器助理
- ngx_http_uwsgi_module 将客户端对Python的请求以uwsgi协议转发至指定服务器处理
2、反向代理负载均衡
Nginx在1.9.0版本开始支持tcp模式的负载均衡,在1.9.13版本开始支持udp协议的负载,udp主要用于 DNS的域名解析,其配置方式和指令和http 代理类似,其基于ngx_stream_proxy_module模块实现tcp 负载,另外基于模块ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、 调度算法等高级功能。
如果编译安装,需要指定 --with-stream 选项才能支持ngx_stream_proxy_module模块
3、FastCGI
FastCGI是用来提高CGI性能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请 求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。
3.1 、Nginx与php-fpm在同一服务器
nginx编译
rm -rf /usr/local/nginx/
make clean
tar zxf memc-nginx-module-0.20.tar.gz
tar zxf srcache-nginx-module-0.33.tar.gz
tar zxf php-8.3.9.tar.gz
./configure --prefix=/usr/local/nginx --user=nginx --group=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 --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
yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel
dnf install oniguruma-devel-6.9.6-1.el9.5.x86_64.rpm
php编译
./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
cd /usr/local/php/etc/
cp -p php-fpm.conf.default php-fpm.conf
php相关配置优化
vim php-fpm.conf
cd php-fpm.d/
cp www.conf.default www.conf
生成主配置文件
cd /root/php-8.3.9/
cp php.ini-production /usr/local/php/etc/php.ini
cd /usr/local/php/etc/
vim php.ini
cd /root/php-8.3.9/sapi/fpm/
cp php-fpm.service /lib/systemd/system
vim php-fpm.service
Nginx配置
mkdir /usr/local/nginx/conf.d
总文件里面加载子配置文件的路径
vim /usr/local/nginx/conf/nginx.conf
vim /usr/local/nginx/conf.d/php.conf
访问验证php测试页面
php.hao.org/index.php
3.2、php的动态扩展模块(php的缓存模块)
安装memcache模块
tar zxf memcache-8.2.tgz
yum install autoconf
phpize
是一个 PHP 命令行工具,用于准备 PHP 扩展的编译环境
phpize
./configure && make && make install
复制测试文件到nginx发布目录中
ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20230831/
cp example.php memcache.php /data/web/php/
vim /data/web/php/memcache.php
配置php加载memcache模块
vim /usr/local/php/etc/php.ini
systemctl reload php-fpm.service
部署memcached
yum install memcached -y
systemctl enable --now memcached.service
netstat -antlupe | grep memcache
cat /etc/sysconfig/memcached
测试
php.hao.org/example.php
php.hao.org/memcache.php
不断刷新页面
性能对比
ab -n500 -c10 http://php.hao.org/index.php
失败51次
ab -n500 -c10 http://php.hao.org/example.php
0次失败
3.3、php高速缓存
需两个模块 srcache-nginx-module-0.33 memc-nginx-module-0.20
vim /usr/local/nginx/conf.d/php.conf
nginx -s reload
ab -n500 -c10 http://php.hao.org/index.php