目录
nginx简介
服务端 I/O 流程
Nginx 进程结构
Nginx启动流程
nginx的源码编译下载
nginx命令常见参数
nginx的配置文件详解
全局配置优化
nginx的平滑升级和回滚
nginx目录匹配优先级测试(因为=只支持访问文件,所有不比对=匹配目录优先级)
nginx中自定义错误页面
nginx中自定义错误日志
nginx中检测文件是否存在
nginx中长连接配置
nginx作为下载服务器配置
nginx高级配置
Nginx 状态页设置
Nginx 压缩功能
nginx的变量
常用内置变量
自定义变量的使用
ngx_http_rewrite_module 模块指令
Nginx Rewrite
全站加密:
nginx动静分离的实现
nginx反向代理的负载均衡
nginx的防盗链
php的动态扩展模块(php的缓存模块)
php高速缓存(使nginx跳过php-fpm,php直接向缓存中的memcached读取数据)
nginx简介
Nginx是一款轻量级和高性能的Web服务器、反向代理服务器、电子邮件代理服务器,是带有BSD-like协议的开源产品。Nginx由俄罗斯程序员伊戈尔·赛索耶夫开发,其第一个公开版本0.1.0发布于2004年10月4日。在技术设计上,Nginx采用事件驱动架构,能够处理大量并发连接,这使得它在面对高流量网站时表现出色。官方测试显示,Nginx能够支撑高达50,000个并发链接,同时CPU和内存消耗非常低,运行非常稳定。Nginx因其高性能、低资源占用和灵活的功能特性,成为全球许多网站首选的Web服务器和反向代理服务器。无论是静态资源服务、动态内容代理、负载均衡还是HTTPS加强,Nginx基本都能胜任。
主要功能:Nginx可以作为静态和动态内容的HTTP服务器。它也可以作为反向代理服务器,将客户端请求转发到后端服务器,并将后端服务器的响应返回给客户端。在现代网站架构中,Nginx经常被用作负载均衡器,通过算法(如轮询、权重、IP哈希等)将客户端请求均匀分配到多个服务器,从而增强系统性能和可靠性。对于动态内容(如PHP脚本),Nginx可以将请求转发到专门的应用程序服务器(例如Apache或PHP-FPM),而由Nginx负责处理静态内容(如图片、CSS、JavaScript文件)
服务端 I/O 流程
服务端I/O流程包括磁盘I/O和网络I/O,主要用于处理数据从内核空间到用户空间的传输。这一过程对于服务器性能和响应速度有重要影响。
基本概念:
I/O即输入输出,指在计算机中进行数据交换的过程。
服务端I/O涉及磁盘I/O和网络I/O,两者在原理上有所不同但互相补充。
磁盘I/O:
进程向内核发起系统调用,请求磁盘上的某个资源,如HTML文件或图片。
内核通过相应的驱动程序将目标文件加载到内核内存空间(缓冲区)。
数据准备完成后,内核将其从缓冲区复制到用户空间的进程内存中。
网络I/O:
网络I/O主要处理网络协议栈与用户空间进程之间的数据传输。
服务器通过网络接口接收到请求数据,经内核预处理后交给应用程序。
应用程序处理完请求并构建响应,再通过内核空间的网络I/O返回给客户端。
设备控制器:
设备控制器是管理CPU信号传入和传出的系统,它连接外部设备并通过寄存器进行数据存储和管理
设备控制器通常以芯片或印刷电路卡形式插入主板。
内存映射I/O:
内存映射I/O是一种将控制寄存器映射到内存空间的方法,使CPU能够直接访问这些寄存器。
这种方法简化了CPU与设备通信,提高了数据处理效率。
阻塞和非阻塞:
阻塞I/O指在完成操作前,调用者必须等待,无法进行其他操作。
非阻塞I/O允许调用者在等待期间执行其他任务,提高系统整体效率。
Nginx 进程结构
Nginx的进程结构主要包含一个master进程和多个worker进程,以及在某些配置下可能包括cache进程。这种多进程结构设计旨在保证Nginx的高可用性和高可靠性。
Master Process(主进程):负责整个Nginx的启动、加载配置文件、管理worker进程以及处理外部信号。Master进程是所有worker进程的父进程。当系统启动Nginx时,首先运行的是master进程,然后由它根据配置创建相应的worker进程。
Worker Processes(工作进程):负责处理具体的客户端请求,如页面请求、反向代理等。Worker进程的数量一般设置为与服务器的CPU核数相同,这样可以利用多核CPU的并行处理能力。每个worker进程都是独立运行的,它们之间不共享地址空间,确保了系统的高可靠性。
Cache Processes(缓存进程):包括cache manager和cache loader进程,主要用于反向代理时的缓存处理。Cache Manager负责管理缓存,而Cache Loader负责加载缓存内容到内存中。
Nginx启动流程
Master进程启动:当Nginx启动时,首先运行Master进程,它会加载配置文件并进行一系列初始化操作。这些操作包括设置进程ID、加载并初始化各模块(如HTTP模块、event模块等),以及设置好用于监听的socket。
Worker进程启动:Master进程根据配置文件中指定的worker_processes数量,fork出多个Worker进程。每个Worker进程都会进行一些自身的初始化操作,比如设置进程优先级、打开文件描述符的数量限制,并将监听的socket设置为可读状态以便接收客户端的连接请求。Worker进程会竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
nginx的源码编译下载
1.下载好所需的安装包以及创立用户nginx
yum install gcc pcre-devel zlib-devel openssl-devel -y
useradd -s /sbin/nologin -M nginx
2.解压提前上传的nginx包并进入解压后的目录(可以去阿里云镜像站上获取)
3.配置信息并进行编译下载
./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
4.配置环境变量
5.修改nginx启动文件并重启服务(vim /lib/systemd/system/nginx.service)
测试(nginx -V 查看版本)
nginx命令常见参数
-v
:显示nginx的版本信息。
-t
:测试配置文件是否有语法错误。
-T
:测试配置文件并打印出配置信息。
-q
:在测试配置文件时,不输出非错误信息。
-s signal
:向主进程发送信号,如stop、quit、reopen、reload等。
-p prefix
:指定nginx的安装目录,默认为/etc/nginx/。
-c filename
:指定配置文件路径,默认为/etc/nginx/nginx.conf。
-g directives
:设置全局指令,这些指令不在配置文件中
nginx的配置文件详解
全局配置优化
user nginx;
:指定运行Nginx进程的用户为"nginx"
orker_processes auto;
:设置工作进程的数量,"auto"表示根据可用CPU核心数自动选择合适数量的工作进程。
worker_cpu_affinity 01 10;
:绑定工作进程到特定的CPU核心上。因为我设置的两核所以这里将第一个工作进程绑定到CPU核心0和1,第二个工作进程绑定到CPU核心10。(如果是四核则0001 0010 0100 1000,以此类推)
nginx的平滑升级和回滚
1.解压提前上传的nginx包并进入解压后的目录
2.编译新版本
./configure --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
3.查看两个版本并把之前的版本备份,新版的nginx挪过去
4.查看进程,进行平滑升级
nginx目录匹配优先级测试(因为=只支持访问文件,所以不比对=匹配目录优先级)
Nginx 账户认证功能
1.创建用户认证表
2.生成默认访问页面
3.修改配置文件启用认证并重启服务
测试
nginx中自定义错误页面
1.在配置文件中编写错误时访问页面
2.向默认错误页面里输入内容
测试
nginx中自定义错误日志
1.在配置文件中定义日志存放目录
2.创建存放目录并重启服务
测试
nginx中检测文件是否存在
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如
果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一
个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内
部500错误
1.编写配置文件定义检测文件范围
2.编写找不到时默认访问的default文件
重启服务并测试
nginx中长连接配置
keepalive_timeout timeout [header_timeout]; #设定保持连接超时时长,0表示禁止长连接,默认为75s
#通常配置在http字段作为站点全局配置
keepalive_requests 数字; #在一次长连接上所允许请求的资源的最大数量
#默认为100次,建议适当调大,比如:500
例:如图,keepalive_timeout 65 60;此配置会设置超时时间为65s,但是客户端会看到是60s,
keepalive_requests 500;在一次长连接上所允许请求的资源的最大数量为500,超过500自动中断
nginx作为下载服务器配置
1.创建存放下载资源的目录并传输供下载的资源
这个命令将创建一个名为xufile
的文件,大小为100MB。它使用/dev/zero
作为输入文件,这意味着它将从全零文件中读取数据。然后,它将数据写入到/data/web/download/
目录下的xufile
文件中,每次读写1MB的数据块
2.编写配置文件
-
root /data/web;
:指定该路径下的文件应该从/data/web
目录中提供。 -
autoindex on;
:启用自动索引功能,当访问/download
路径时,会显示目录下的文件列表。 -
autoindex_localtime on;
:在文件列表中显示文件的本地时间。 -
autoindex_exact_size off;
:禁用显示文件的精确大小,只显示大致的大小。 -
limit_rate 1024K;
:限制下载速度为1024KBps(即1MBps)。
这个配置块的作用是设置Nginx服务器如何处理来自客户端的/download
路径的请求。具体来说,它会将请求映射到/data/web
目录下的文件,并提供一个文件列表供用户浏览和下载。同时,它还限制了下载速度,以防止过大的流量占用过多的带宽
重启服务进行测试
nginx高级配置
Nginx 状态页设置
编辑配置文件,定义状态页
该配置文件定义一个名为域名为status.xujiahao.org的主机。该主机监听80端口,并将根目录设置为/data/web/html,默认首页为index.html。同时,它还定义了一个名为/status的位置块,用于显示服务器的状态信息。在这个位置块中,使用了stub_status指令来提供状态信息,只允许IP地址为172.25.254.1的客户端访问,其他所有客户端都被拒绝访问。
测试
Nginx 压缩功能
在配置文件中启用压缩功能并定义压缩配置
-
gzip on;
:启用gzip压缩功能。 -
gzip_comp_level 5;
:设置压缩级别为5(范围是1到9,数值越大表示压缩率越高,但CPU消耗也越大)。 -
gzip_min_length 1k;
:设置最小压缩文件大小为1KB,小于这个大小的文件不会被压缩。 -
gzip_http_version 1.1;
:指定使用HTTP/1.1协议进行压缩。 -
gzip_vary on;
:启用Vary头,告诉代理服务器根据不同的请求头来缓存压缩后的文件。 -
gzip_types ...;
:指定需要压缩的文件类型,包括文本、JavaScript、CSS、XML、PHP脚本以及图片格式等。
重启服务进行测试
nginx的变量
常用内置变量
$remote_addr;
\#存放了客户端的地址,注意是客户端的公网IP
$args;
\#变量中存放了URL中的所有参数
\#例如:https://search.jd.com/Search?keyword=手机&enc=utf-8
\#返回结果为: keyword=手机&enc=utf-8
$is_args
\#如果有参数为? 否则为空
$document_root;
\#保存了针对当前资源的请求的系统根目录,例如:/webdata/nginx/timinglee.org/lee。
$document_uri;
\#保存了当前请求中不包含参数的URI,注意是不包含请求的指令
\#比如:http://lee.timinglee.org/var?\id=11111会被定义为/var
\#返回结果为:/var
$host;
\#存放了请求的host名称
limit_rate 10240;
echo $limit_rate;
\#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0
$remote_port;
\#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口
$remote_user;
\#已经经过Auth Basic Module验证的用户名
$request_body_file;
\#做反向代理时发给后端服务器的本地资源的名称
$request_method;#请求资源的方式,GET/PUT/DELETE等
$request_filename;
\#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,
\#如:webdata/nginx/timinglee.org/lee/var/index.html
$request_uri;
\#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,
\#例如:/main/index.do?id=20190221&partner=search
$scheme;
\#请求的协议,例如:http,https,ftp等
$server_protocol;
\#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等
$server_addr;
\#保存了服务器的IP地址
$server_name;
\#虚拟主机的主机名
$server_port;
\#虚拟主机的端口号
$http_user_agent;
\#客户端浏览器的详细信息
$http_cookie;
\#客户端的所有cookie信息
$cookie_<name>
\#name为任意请求报文首部字部cookie的key名
$http_<name>
\#name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有
横线需要替换为下划线
在配置文件中定义访问页面时输出变量
访问测试
自定义变量的使用
在配置文件中自定义变量并输出
访问测试
ngx_http_rewrite_module 模块指令
if指令
`<!--= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false-->
<!--!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false-->
<!--~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假-->
<!--!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假-->
<!--~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假-->
<!--!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真-->
<!---f 和 !-f #判断请求的文件是否存在和是否不存在-->
<!---d 和 !-d #判断请求的目录是否存在和是否不存在-->
<!---x 和 !-x #判断文件是否可执行和是否不可执行-->
<!---e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)-->
break和return
Nginx Rewrite
编辑配置文件,当访问时临时重定向到www.xujiahao.com
编辑配置文件,当访问时永久重定向到www.xujiahao.com
全站加密:
1.创建存放RSA密钥对和自签名证书的目录,并生成RSA密钥对和自签名证书
2.修改配置文件
配置一个名为www.xujiahao.org的网站。它监听80和443端口,分别用于HTTP和HTTPS连接。网站的文件根目录设置为/data/web/html,首页文件为index.html。同时,配置SSL证书和密钥的路径,以及SSL会话缓存和超时设置。最后,定义了一个location块,用于将所有HTTP请求重定向到HTTPS。
访问时自动转入了https
nginx动静分离的实现
1.编辑配置文件
监听80端口,并将域名www.xujiahao.edu的请求转发到不同的后端服务器。当访问根路径(/)时,请求会被转发到IP地址为172.25.254.30的服务器。当访问包含/static路径的URL时,请求会被转发到IP地址为172.25.254.20,端口为8080的服务器。
2.在172.25.254.10和172.25.254.20上制作界面,并在172.25.254.20上改变监听端口为8080
nginx反向代理的负载均衡
编辑配置文件
该配置定义了一个服务集群webserver其中包含了三个服务器172.25.254.10,172.25.254.20,172.25.254.100,当访问定义的test.xujiahao.test域名时会将请求打向172.25.254.10,172.25.254.20(因为默认的是轮询算法,可以根据具体情况选择其他算法如源地址hash目标地址hash等)。当172.25.254.10和172.25.254.20都不可用时会打向备用的服务器172.25.254.100
测试
nginx的防盗链
1.创建存放测试图片的目录以及在该目录下上传照片
2.编辑配置文件,使可以访问到这张图片
3.制作盗链。另起一台虚拟机如172.25.254.10,修改其默认页面
4.防盗链的制作,编辑配置文件
测试:图片已经不显示,点击跳转直接404
php的动态扩展模块(php的缓存模块)
安装memcache模块
网上下载资源传输过去后进行解压。再利用phpize
命令准备PHP扩展的构建环境。然后,运行./configure
脚本来检查系统环境和配置编译选项。接下来,使用make
命令编译扩展。最后,使用make install
命令将编译好的扩展安装到系统的PHP扩展目录中。
复制测试文件到nginx发布目录中并修改管理员用户名和密码
配置php加载memcache模块(vim /usr/local/php/etc/php.ini)
(如果编译的时候没有加上--with-config-file-path=/usr/local/php/etc可能会导致不读配置文件过滤不出来,可以通过cp /usr/local/php/etc/php.ini /usr/local/php/lib/命令解决)
部署**memcached**
在Linux系统中安装并启动memcached服务,然后使用netstat命令检查memcached服务的端口。cat /etc/sysconfig/memcached
命令用于查看Memcached的配置文件内容。这个文件包含了Memcached服务的配置选项,如端口号、最大连接数、缓存大小等
测试:通过不断刷新xujiahao.org/example.php查看MEMCACHE INFO (xujiahao.org)变化
通过压力测试进行性能对比:
没有通过memcached进行缓存介入的500次失败了47次
通过memcached进行缓存了的
php高速缓存(使nginx跳过php-fpm,php直接向缓存中的memcached读取数据)
编辑配置文件
在这个配置中,有一个名为memcache
的上游服务器组,其中包含一个Memcached服务器(127.0.0.1:11211)。
在server
块中,监听80端口,并将所有请求代理到名为php.xujiahao.org
的域名。根目录设置为/data/web/html
,默认索引文件为index.html
。
在location /memc
块中,定义了一个内部位置,用于处理与Memcached相关的请求。设置了连接、发送和读取超时时间,并将查询字符串作为键值存储在Memcached中。
在location ~ \.php$
块中,处理PHP文件的请求。首先尝试从缓存中获取数据,如果缓存中没有数据,则将请求传递给PHP-FPM进行处理。最后,将结果存储回缓存中。