一、LNMP架构概述LNMP是目前主流的企业网站部署平台由四大核心组件构成各司其职协同工作LLinux操作系统提供底层运行环境NNginx网站服务软件处理静态资源、反向代理、负载均衡MMySQL/MariaDB关系型数据库存储网站业务数据PPHP/Python网站开发语言实现动态业务逻辑处理二、LNMP环境完整部署实操代码步骤2.1 编译安装Nginx1.22.1版本2.1.1 准备工作将nginx-1.22.1.tar.gz源码包上传至虚拟机web1的/root目录执行以下命令# 安装编译依赖包[rootweb1 ~]# dnf -y install gcc pcre-devel openssl-devel make# 创建nginx运行用户无登录权限[rootweb1 ~]# useradd nginx# 解压源码包[rootweb1 ~]# tar -xf /root/nginx-1.22.1.tar.gz# 进入源码目录[rootweb1 ~]# cd nginx-1.22.1pcre-devel使nginx可以支持正则2.1.2 编译配置安装# 初始化编译参数[rootweb1 nginx-1.22.1]# ./configure \--prefix/usr/local/nginx\--usernginx\--groupnginx\--with-http_ssl_module# 编译并安装[rootweb1 nginx-1.22.1]# make make install# 验证安装目录存在即成功[rootweb1 nginx-1.22.1]# ls /usr/local/nginx2.2 安装MariaDB数据库mariadb-devel是mariadb服务的扩展依赖包# 安装数据库服务端客户端[rootweb1 ~]# dnf -y install mariadb-server mariadb# 安装数据库扩展依赖包[rootweb1 ~]# dnf -y install mariadb-devel2.3 安装PHP环境含FPM数据库扩展安装php、php-fpm、php-mysqlndphpphp语言的解释器用于在服务器执行php代码php-fpmphp进程的管理程序负责接收Nginx转发的php请求php-mysqlndphp连接数据库的扩展功能包使php可以连接数据库# 安装PHP相关组件[rootweb1 ~]# dnf -y install php php-fpm php-mysqlnd# 验证安装[rootweb1 ~]# rpm -q php php-fpm php-mysqlnd2.4 启动服务并设置开机自启nginx端口号80mariadb端口号3306php-fpm端口号9000需要手动配置后续配置# 启动Nginx[rootweb1 ~]# /usr/local/nginx/sbin/nginx# 启动MariaDB并设置开机自启[rootweb1 ~]# systemctl enable mariadb --now# 验证Nginx端口[rootweb1 ~]# ss -nutlp | grep :80# 验证MariaDB端口[rootweb1 ~]# ss -nutlp | grep :3306三、NginxFastCGI动静分离核心原理与详细配置步骤FastCGI是通信协议PHP-FPM是实现了 FastCGI 协议的进程管理器用来处理php动态页面管理进程池Nginx 通过 FastCGI 协议 和 PHP-FPM 进程通信转发 PHP 请求、接收执行结果。3.1 FastCGI工作原理FastCGI是Nginx服务和PHP通信的标准协议需要安装php-fpm软件才能支持Nginx本身不能解析 PHP 代码只处理静态资源遇到 PHP 动态请求时Nginx通过FastCGI 协议把请求转发给 php-fpmphp-fpm负责管理php进程池将请求调度至空闲的php进程执行php脚本一个fpm可以拥有多个php进程每个进程都可以处理用户请求php脚本在运行的时候连接MariaDB/MySQL数据库如需完成数据增删改查处理完的结果php-fpm原路通过FastCGI协议返回给 Nginx再由 Nginx 返回给浏览器。此流程图也是Nginx动静分离的工作原理图静态页面写死内容不用后端处理不用编译不用执行浏览器直接渲染显示动态页面是由编程语言实现的核心是后端实时运算、查数据库、拼接内容是代码的运行结果真实生产环境中都是动静结合的nginx本身只支持静态页面但可以联动php动静分离让Nginx专注于处理静态页面动态的请求交给后端的其他服务处理从而提升站点的性能3.1.1 FastCGI简介及优缺点FastCGI简介FastCGI是Nginx服务和php-fpm通信的标准协议基于 FastCGI 协议几乎所有主流编程语言都可以实现对应的处理程序如 PHP、Python、Perl、Java、C/C、Ruby 等。优点基于标准协议支持PHP、Python、Java等多种主流语言可以实现Nginx动静分离提升网站访问效率。缺点了解内存消耗大采用多进程模型处理请求每个 PHP 进程都是独立运行的会占用固定的内存资源。通常单个 PHP 解释器进程的内存占用在 7MB ~ 25MB 之间高并发场景下如果进程池配置了 50~100 个 PHP 进程总内存占用会非常可观。典型场景示例Nginx PHP-FPM 架构10 个 Nginx 进程每个约占 15MB 内存总消耗约10 × 15MB 150MB64 个 PHP-FPM 进程每个约占 20MB 内存总消耗约64 × 20MB 1280MB在3万并发连接的压力下需要更多的常驻进程这种内存占用是架构本身的特性决定的。3.2 动静分离详细配置步骤php-fpm的配置文件可以定义两种连接方式基于网络协议栈的通信方式Nginx和php-fpm通过9000端口进行数据交换基于本地文件的进程间通信方式Nginx和php-fpm 通过 /run/php-fpm/www.sock 文件进行数据交换就是将请求写入此文件fpm通过读取文件实现通讯这种方法不适合跨主机步骤一配置PHP-FPM监听9000端口php-fpm配置文件路径为vim /etc/php-fpm.d/www.confPHP-FPM默认监听本地sock文件需修改为9000端口监听并重启服务[rootweb1 ~]# vim /etc/php-fpm.d/www.conf #修改php-fpm配置文件...此处省略1万字大约第37行有的人不是37行但是基本大差不差注释掉并在其下方增加如下内容...;listen/run/php-fpm/www.sock#把第37行前方加上;注释listen127.0.0.1:9000#本机127.0.0.1监听9000端口。这里的意思是动态请求转给哪台主机的9000端口因为nginx和fpm在同一主机所以写本机监听9000...此处省略1万字...[rootweb1 ~]# systemctl restart php-fpm #重新启动服务[rootweb1 ~]# ss -nutlp | grep :9000 #查看9000端口此步骤改动仅两处一是将listen /run/php-fpm/www.sock 前加上进行注释二是在前一条注释下增加新的监听地址和端口listen127.0.0.1:9000注意 如果是跨主机也就是当 web 端nginx和后端的程序PHP-是存放后端程序的主机的 IP 地址就要使用能和别的主机通讯的本机ip。即FastCGI 配置在 Web 端nginxPHP 程序在哪台主机fastcgi_pass 就指向哪台主机的 IP 地址。步骤二修改Nginx配置支持PHP动态请求修改nginx配置文件是Nginx支持php动态请求将/usr/local/nginx/conf/nginx.conf的第66行-72行去掉注释并配置注意此段内容不必手敲nginx.conf 源文件之中自带去掉前面的#号注释稍加修改即可。此处修改内容仅两处一是将一段进行注释示例中已详细说明二是将include 后面的fastcgi改成conf结尾fastcgi.conf[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conf #修改nginx配置文件...此处省略1万字下方为nginx.conf中的模板大约第66行左右代码... location ~\.php${#~ \.php$ 是正则表达式用于匹配php页面。此处的作用是判断是否为php页面root html;fastcgi_pass127.0.0.1:9000;#动态请求转发给本地的9000端口即php-fpm服务fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #注释此行include fastcgi.conf;#调用配置加载FastCGI参数文件一定是.conf文件}...此处省略1万字...[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload #重新加载配置文件[rootweb1 ~]# ss -nutlp | grep :80 #查看nginx端口号正常流程解析当用户访问 以 .php 结尾 的地址时Nginx 先在 root html即 /usr/local/nginx/html目录下查找对应的 .php 文件找不到 → 直接报错找到 → 把请求转发给 127.0.0.1:9000php-fpm 进程php-fpm 调用 PHP 引擎执行这个 PHP 文件执行结果返回给 NginxNginx 再返回给用户location就是如果的意思/ 匹配了你的访问地址代表此虚拟主机的IP地址或者域名。location / {} 的意思是如果你访问我的ip我就从{}里的配置给你寻找所以location语句的作用是匹配用户访问的地址因此location ~ .php$ { } 意思就是匹配以.php结尾的页面。而当同一个server同时包含 location ~ .php$ { } 动态配置和 location \ { }静态配置那么会优先匹配 location ~ .php$ { }。如果将nginx和php-fpm分别做到两台主机(也就是动静分离到两个主机)应该这样配置机器 ANginx 所在机器的/usr/local/nginx/conf/nginx.conffastcgi_pass 192.168.8.100:9000;机器 Bphp-fpm 所在机器192.168.8.100的/etc/php-fpm.d/www.conflisten192.168.8.100:90003.5 LNMP环境测试编写php测试页面客户端访问测试、Windows访问测试访问地址http://192.168.8.100/test.php3.5.1 测试PHP解析[rootweb1 ~]# vim /usr/local/nginx/html/test.php #编写php测试页面?php$i33;echo$i;?[rootweb1 ~]# curl 192.168.8.100/test.php #本机访问测试可以看到333.5.2 测试PHP连接MariaDB编写php测试页面将测试mysql.php测试脚本上传至虚拟机的/root将测试页面拷贝至/usr/local/nginx/html目录# 上传mysql.php测试脚本到/root拷贝至Nginx网页目录[rootweb1 ~]# cp /root/mysql.php /usr/local/nginx/html/# 查看测试文件[rootweb1 ~]# cat /usr/local/nginx/html/mysql.php# 本机访问测试[rootweb1 ~]# curl 192.168.8.100/mysql.php# 浏览器访问http://192.168.8.100/mysql.php显示数据库信息即连接成功mysql.php页面代码为?php$mysqlinew mysqli(localhost,root,,mysql);if(mysqli_connect_errno()){die(Unable to connect!). mysqli_connect_error();}$sqlselect * from user;$result$mysqli-query($sql);while($row$result-fetch_array()){printf(Host:%s,$row[0]);printf(/br);printf(Name:%s,$row[1]);printf(/br);}?四、Nginx高级技术地址重写/地址跳转rewrite4.1 地址重写概述获得一个来访的URL请求然后改写成服务器可以处理的另一个URL的过程地址重写的好处缩短URL隐藏实际路径提高安全性易于用户记忆和键入易于被搜索引擎搜录rewrite基本语法记住一个简单的即可rewrite regex replacement [flag]regex就是正则rewrite 旧地址 新地址 [标记]目前很多大厂的网站都使用了这个技术。实例输入www.360buy.com 实则跳转到www.jd.com4.2 3.4 rewrite标记语法补充rewrite 旧地址 新地址[标记]last了解停止执行其他重写规则重新匹配 locationbreak了解停止执行其他的重写规则完成本次请求redirect302 临时重定向地址栏改变爬虫不更新 URIpermanent301 永久重定向地址栏改变爬虫更新 URI4.3 实战案例1单页面跳转a.html→b.html4.3.1 基础跳转模糊匹配当用户访问192.168.8.100/a.html --跳转至– 192.168.8.100/b.html使用Windows访问测试查看效果# 创建测试页面[rootweb1 ~]# echo AAA /usr/local/nginx/html/a.html[rootweb1 ~]# echo BBB /usr/local/nginx/html/b.html# 配置基础跳转[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite /a.html /b.html;#实现页面跳转#这里的 / 指代网页根目录的根或者网络地址即网页根目录或者本机ip}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload# 测试跳转[rootweb1 ~]# curl 192.168.8.100/a.html# 输出BBB但a.htmlabc也会跳转匹配不严谨注意配置了rewrite之后会优先走rewrit然后走正常的页面查找顺序rootindex4.3.2 页面跳转优化正则精准匹配目前访问192.168.8.100/a.htmlabc也会跳转192.168.8.100/b.html目前对于URL的匹配是包含关键字a.html即可跳转这样不严谨可以使用正则表达式优化配置# 修改配置精准匹配a.html[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite ^/a\.html$ /b.html;}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload# 测试[rootweb1 ~]# curl 192.168.8.100/a.html # 跳转成功[rootweb1 ~]# curl 192.168.8.100/a.htmlabc # 不跳转4.3.3 浏览器地址栏同步跳转redirect目前Windows浏览器访问192.168.8.100/a.html页面内容可以跳转但是URL中的地址不会跳转可以增加redirect标记重定向Windows浏览器重新访问查看URL地址栏会跟随跳转# 配置临时重定向[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite ^/a\.html$ /b.html redirect;#浏览器顶部导航栏一同跳转}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload# 浏览器访问http://192.168.8.100/a.html地址栏自动变为b.html同理如果想要配置动态页面的rewrite需要在location ~ .php$ { }之中进行配置即可。4.4 实战案例2跨站跳转4.4.1 全站跳转192.168.8.100→www.jxsedu.com不同网站间的跳转192.168.8.100 --跳转至–www.jxsedu.comWindows浏览器访问测试# 配置全站跳转[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite / https://www.jxssedu.com;}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload4.4.2 子页面同步跳转带路径不同网站间的跳转192.168.8.100 --跳转至–https://www.jxssedu.com访问192.168.8.100/single/cloud跳转至https://www.jxssedu.com/single/cloudWindows访问测试# 配置子页面跳转[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite /(.*)https://www.jxssedu.com/$1;#使用正则表达式.*获取用户就地址中的子页面跳转至新地址的相同子页面。$1表示前方.*保留的内容}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload# 访问192.168.8.100/single/cloud跳转至对应子页面www.jxssedu.com/single/cloud五、systemd管理Nginx服务编写unit文件5.1 systemd Unit文件概述systemd使用systemcl管理服务会读取对应的文件此文件就是服务的unit文件读取文件的目录由高到低/etc/systemd/system设置了开机自启的Unit文件优先级最高用户自定义服务源码自建、自 己编写的 service 都放这包含手动配置、设置开机自启的服务单元。/usr/lib/systemd/system所有已安装软件的Unit文件系统默认服务目录yum/apt 官方包自带的服务文件都在这里软件默认自带单元文件存放处。5.1.14.1 Unit语法格式5.2 编写nginx.service文件service文件为服务的启动说明文件Unit文件此文件记录了如何启动对应的服务nginx现在没有nginx.service文件所以使用systemctl命令无法启动nginx服务因为systemctl不知道如何启动源码包安装的软件都是这样交代环境背景可使用AI配合生成nginx.service文件适当微调配置中不要出现中文# 创建Nginx服务unit文件[rootweb1 ~]# vim /usr/lib/systemd/system/nginx.service[Unit]DescriptionThe Nginx HTTP Server#描述信息Afternetwork.target remote-fs.target nss-lookup.target##在网络程序网络文件系统域名解析等服务启动之后再启动nginx[Service]Typeforking#forking多进程类型服务ExecStart/usr/local/nginx/sbin/nginxExecReload/usr/local/nginx/sbin/nginx-sreloadExecStop/bin/kill-sQUIT$MAINPID#kill给程序发送QUIT退出信号关闭nginx[Install]WantedBymulti-user.target注意无service文件用原生命令启动Nginx进程为独立后台进程不受systemd管控。后续编写并重载service文件仅完成服务规则注册不会自动接管已运行的旧进程。此时systemctl stop nginx依旧无效只能使用kill或killall命令终止原有进程。彻底杀掉旧进程后重新执行systemctl start nginx拉起服务进程正式交由systemd托管此后可正常使用systemctl全套命令管理。5.3 生效配置并管理服务# 停止原有Nginx进程[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s stop# 重载systemd配置[rootweb1 ~]# systemctl daemon-reload#此命令用于强制 systemd 重新扫描所有服务配置文件让新增 / 修改的.service 服务文件配置生效# 启动Nginx[rootweb1 ~]# systemctl start nginx# 设置开机自启[rootweb1 ~]# systemctl enable nginx# 验证端口[rootweb1 ~]# ss -nutlp | grep :80
# Linux运维Day02:LNMP架构部署、动静分离原理、Nginx地址重写、systemd服务管理
一、LNMP架构概述LNMP是目前主流的企业网站部署平台由四大核心组件构成各司其职协同工作LLinux操作系统提供底层运行环境NNginx网站服务软件处理静态资源、反向代理、负载均衡MMySQL/MariaDB关系型数据库存储网站业务数据PPHP/Python网站开发语言实现动态业务逻辑处理二、LNMP环境完整部署实操代码步骤2.1 编译安装Nginx1.22.1版本2.1.1 准备工作将nginx-1.22.1.tar.gz源码包上传至虚拟机web1的/root目录执行以下命令# 安装编译依赖包[rootweb1 ~]# dnf -y install gcc pcre-devel openssl-devel make# 创建nginx运行用户无登录权限[rootweb1 ~]# useradd nginx# 解压源码包[rootweb1 ~]# tar -xf /root/nginx-1.22.1.tar.gz# 进入源码目录[rootweb1 ~]# cd nginx-1.22.1pcre-devel使nginx可以支持正则2.1.2 编译配置安装# 初始化编译参数[rootweb1 nginx-1.22.1]# ./configure \--prefix/usr/local/nginx\--usernginx\--groupnginx\--with-http_ssl_module# 编译并安装[rootweb1 nginx-1.22.1]# make make install# 验证安装目录存在即成功[rootweb1 nginx-1.22.1]# ls /usr/local/nginx2.2 安装MariaDB数据库mariadb-devel是mariadb服务的扩展依赖包# 安装数据库服务端客户端[rootweb1 ~]# dnf -y install mariadb-server mariadb# 安装数据库扩展依赖包[rootweb1 ~]# dnf -y install mariadb-devel2.3 安装PHP环境含FPM数据库扩展安装php、php-fpm、php-mysqlndphpphp语言的解释器用于在服务器执行php代码php-fpmphp进程的管理程序负责接收Nginx转发的php请求php-mysqlndphp连接数据库的扩展功能包使php可以连接数据库# 安装PHP相关组件[rootweb1 ~]# dnf -y install php php-fpm php-mysqlnd# 验证安装[rootweb1 ~]# rpm -q php php-fpm php-mysqlnd2.4 启动服务并设置开机自启nginx端口号80mariadb端口号3306php-fpm端口号9000需要手动配置后续配置# 启动Nginx[rootweb1 ~]# /usr/local/nginx/sbin/nginx# 启动MariaDB并设置开机自启[rootweb1 ~]# systemctl enable mariadb --now# 验证Nginx端口[rootweb1 ~]# ss -nutlp | grep :80# 验证MariaDB端口[rootweb1 ~]# ss -nutlp | grep :3306三、NginxFastCGI动静分离核心原理与详细配置步骤FastCGI是通信协议PHP-FPM是实现了 FastCGI 协议的进程管理器用来处理php动态页面管理进程池Nginx 通过 FastCGI 协议 和 PHP-FPM 进程通信转发 PHP 请求、接收执行结果。3.1 FastCGI工作原理FastCGI是Nginx服务和PHP通信的标准协议需要安装php-fpm软件才能支持Nginx本身不能解析 PHP 代码只处理静态资源遇到 PHP 动态请求时Nginx通过FastCGI 协议把请求转发给 php-fpmphp-fpm负责管理php进程池将请求调度至空闲的php进程执行php脚本一个fpm可以拥有多个php进程每个进程都可以处理用户请求php脚本在运行的时候连接MariaDB/MySQL数据库如需完成数据增删改查处理完的结果php-fpm原路通过FastCGI协议返回给 Nginx再由 Nginx 返回给浏览器。此流程图也是Nginx动静分离的工作原理图静态页面写死内容不用后端处理不用编译不用执行浏览器直接渲染显示动态页面是由编程语言实现的核心是后端实时运算、查数据库、拼接内容是代码的运行结果真实生产环境中都是动静结合的nginx本身只支持静态页面但可以联动php动静分离让Nginx专注于处理静态页面动态的请求交给后端的其他服务处理从而提升站点的性能3.1.1 FastCGI简介及优缺点FastCGI简介FastCGI是Nginx服务和php-fpm通信的标准协议基于 FastCGI 协议几乎所有主流编程语言都可以实现对应的处理程序如 PHP、Python、Perl、Java、C/C、Ruby 等。优点基于标准协议支持PHP、Python、Java等多种主流语言可以实现Nginx动静分离提升网站访问效率。缺点了解内存消耗大采用多进程模型处理请求每个 PHP 进程都是独立运行的会占用固定的内存资源。通常单个 PHP 解释器进程的内存占用在 7MB ~ 25MB 之间高并发场景下如果进程池配置了 50~100 个 PHP 进程总内存占用会非常可观。典型场景示例Nginx PHP-FPM 架构10 个 Nginx 进程每个约占 15MB 内存总消耗约10 × 15MB 150MB64 个 PHP-FPM 进程每个约占 20MB 内存总消耗约64 × 20MB 1280MB在3万并发连接的压力下需要更多的常驻进程这种内存占用是架构本身的特性决定的。3.2 动静分离详细配置步骤php-fpm的配置文件可以定义两种连接方式基于网络协议栈的通信方式Nginx和php-fpm通过9000端口进行数据交换基于本地文件的进程间通信方式Nginx和php-fpm 通过 /run/php-fpm/www.sock 文件进行数据交换就是将请求写入此文件fpm通过读取文件实现通讯这种方法不适合跨主机步骤一配置PHP-FPM监听9000端口php-fpm配置文件路径为vim /etc/php-fpm.d/www.confPHP-FPM默认监听本地sock文件需修改为9000端口监听并重启服务[rootweb1 ~]# vim /etc/php-fpm.d/www.conf #修改php-fpm配置文件...此处省略1万字大约第37行有的人不是37行但是基本大差不差注释掉并在其下方增加如下内容...;listen/run/php-fpm/www.sock#把第37行前方加上;注释listen127.0.0.1:9000#本机127.0.0.1监听9000端口。这里的意思是动态请求转给哪台主机的9000端口因为nginx和fpm在同一主机所以写本机监听9000...此处省略1万字...[rootweb1 ~]# systemctl restart php-fpm #重新启动服务[rootweb1 ~]# ss -nutlp | grep :9000 #查看9000端口此步骤改动仅两处一是将listen /run/php-fpm/www.sock 前加上进行注释二是在前一条注释下增加新的监听地址和端口listen127.0.0.1:9000注意 如果是跨主机也就是当 web 端nginx和后端的程序PHP-是存放后端程序的主机的 IP 地址就要使用能和别的主机通讯的本机ip。即FastCGI 配置在 Web 端nginxPHP 程序在哪台主机fastcgi_pass 就指向哪台主机的 IP 地址。步骤二修改Nginx配置支持PHP动态请求修改nginx配置文件是Nginx支持php动态请求将/usr/local/nginx/conf/nginx.conf的第66行-72行去掉注释并配置注意此段内容不必手敲nginx.conf 源文件之中自带去掉前面的#号注释稍加修改即可。此处修改内容仅两处一是将一段进行注释示例中已详细说明二是将include 后面的fastcgi改成conf结尾fastcgi.conf[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conf #修改nginx配置文件...此处省略1万字下方为nginx.conf中的模板大约第66行左右代码... location ~\.php${#~ \.php$ 是正则表达式用于匹配php页面。此处的作用是判断是否为php页面root html;fastcgi_pass127.0.0.1:9000;#动态请求转发给本地的9000端口即php-fpm服务fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #注释此行include fastcgi.conf;#调用配置加载FastCGI参数文件一定是.conf文件}...此处省略1万字...[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload #重新加载配置文件[rootweb1 ~]# ss -nutlp | grep :80 #查看nginx端口号正常流程解析当用户访问 以 .php 结尾 的地址时Nginx 先在 root html即 /usr/local/nginx/html目录下查找对应的 .php 文件找不到 → 直接报错找到 → 把请求转发给 127.0.0.1:9000php-fpm 进程php-fpm 调用 PHP 引擎执行这个 PHP 文件执行结果返回给 NginxNginx 再返回给用户location就是如果的意思/ 匹配了你的访问地址代表此虚拟主机的IP地址或者域名。location / {} 的意思是如果你访问我的ip我就从{}里的配置给你寻找所以location语句的作用是匹配用户访问的地址因此location ~ .php$ { } 意思就是匹配以.php结尾的页面。而当同一个server同时包含 location ~ .php$ { } 动态配置和 location \ { }静态配置那么会优先匹配 location ~ .php$ { }。如果将nginx和php-fpm分别做到两台主机(也就是动静分离到两个主机)应该这样配置机器 ANginx 所在机器的/usr/local/nginx/conf/nginx.conffastcgi_pass 192.168.8.100:9000;机器 Bphp-fpm 所在机器192.168.8.100的/etc/php-fpm.d/www.conflisten192.168.8.100:90003.5 LNMP环境测试编写php测试页面客户端访问测试、Windows访问测试访问地址http://192.168.8.100/test.php3.5.1 测试PHP解析[rootweb1 ~]# vim /usr/local/nginx/html/test.php #编写php测试页面?php$i33;echo$i;?[rootweb1 ~]# curl 192.168.8.100/test.php #本机访问测试可以看到333.5.2 测试PHP连接MariaDB编写php测试页面将测试mysql.php测试脚本上传至虚拟机的/root将测试页面拷贝至/usr/local/nginx/html目录# 上传mysql.php测试脚本到/root拷贝至Nginx网页目录[rootweb1 ~]# cp /root/mysql.php /usr/local/nginx/html/# 查看测试文件[rootweb1 ~]# cat /usr/local/nginx/html/mysql.php# 本机访问测试[rootweb1 ~]# curl 192.168.8.100/mysql.php# 浏览器访问http://192.168.8.100/mysql.php显示数据库信息即连接成功mysql.php页面代码为?php$mysqlinew mysqli(localhost,root,,mysql);if(mysqli_connect_errno()){die(Unable to connect!). mysqli_connect_error();}$sqlselect * from user;$result$mysqli-query($sql);while($row$result-fetch_array()){printf(Host:%s,$row[0]);printf(/br);printf(Name:%s,$row[1]);printf(/br);}?四、Nginx高级技术地址重写/地址跳转rewrite4.1 地址重写概述获得一个来访的URL请求然后改写成服务器可以处理的另一个URL的过程地址重写的好处缩短URL隐藏实际路径提高安全性易于用户记忆和键入易于被搜索引擎搜录rewrite基本语法记住一个简单的即可rewrite regex replacement [flag]regex就是正则rewrite 旧地址 新地址 [标记]目前很多大厂的网站都使用了这个技术。实例输入www.360buy.com 实则跳转到www.jd.com4.2 3.4 rewrite标记语法补充rewrite 旧地址 新地址[标记]last了解停止执行其他重写规则重新匹配 locationbreak了解停止执行其他的重写规则完成本次请求redirect302 临时重定向地址栏改变爬虫不更新 URIpermanent301 永久重定向地址栏改变爬虫更新 URI4.3 实战案例1单页面跳转a.html→b.html4.3.1 基础跳转模糊匹配当用户访问192.168.8.100/a.html --跳转至– 192.168.8.100/b.html使用Windows访问测试查看效果# 创建测试页面[rootweb1 ~]# echo AAA /usr/local/nginx/html/a.html[rootweb1 ~]# echo BBB /usr/local/nginx/html/b.html# 配置基础跳转[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite /a.html /b.html;#实现页面跳转#这里的 / 指代网页根目录的根或者网络地址即网页根目录或者本机ip}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload# 测试跳转[rootweb1 ~]# curl 192.168.8.100/a.html# 输出BBB但a.htmlabc也会跳转匹配不严谨注意配置了rewrite之后会优先走rewrit然后走正常的页面查找顺序rootindex4.3.2 页面跳转优化正则精准匹配目前访问192.168.8.100/a.htmlabc也会跳转192.168.8.100/b.html目前对于URL的匹配是包含关键字a.html即可跳转这样不严谨可以使用正则表达式优化配置# 修改配置精准匹配a.html[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite ^/a\.html$ /b.html;}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload# 测试[rootweb1 ~]# curl 192.168.8.100/a.html # 跳转成功[rootweb1 ~]# curl 192.168.8.100/a.htmlabc # 不跳转4.3.3 浏览器地址栏同步跳转redirect目前Windows浏览器访问192.168.8.100/a.html页面内容可以跳转但是URL中的地址不会跳转可以增加redirect标记重定向Windows浏览器重新访问查看URL地址栏会跟随跳转# 配置临时重定向[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite ^/a\.html$ /b.html redirect;#浏览器顶部导航栏一同跳转}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload# 浏览器访问http://192.168.8.100/a.html地址栏自动变为b.html同理如果想要配置动态页面的rewrite需要在location ~ .php$ { }之中进行配置即可。4.4 实战案例2跨站跳转4.4.1 全站跳转192.168.8.100→www.jxsedu.com不同网站间的跳转192.168.8.100 --跳转至–www.jxsedu.comWindows浏览器访问测试# 配置全站跳转[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite / https://www.jxssedu.com;}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload4.4.2 子页面同步跳转带路径不同网站间的跳转192.168.8.100 --跳转至–https://www.jxssedu.com访问192.168.8.100/single/cloud跳转至https://www.jxssedu.com/single/cloudWindows访问测试# 配置子页面跳转[rootweb1 ~]# vim /usr/local/nginx/conf/nginx.conflocation /{root html;index index.html index.htm;rewrite /(.*)https://www.jxssedu.com/$1;#使用正则表达式.*获取用户就地址中的子页面跳转至新地址的相同子页面。$1表示前方.*保留的内容}# 重载配置[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s reload# 访问192.168.8.100/single/cloud跳转至对应子页面www.jxssedu.com/single/cloud五、systemd管理Nginx服务编写unit文件5.1 systemd Unit文件概述systemd使用systemcl管理服务会读取对应的文件此文件就是服务的unit文件读取文件的目录由高到低/etc/systemd/system设置了开机自启的Unit文件优先级最高用户自定义服务源码自建、自 己编写的 service 都放这包含手动配置、设置开机自启的服务单元。/usr/lib/systemd/system所有已安装软件的Unit文件系统默认服务目录yum/apt 官方包自带的服务文件都在这里软件默认自带单元文件存放处。5.1.14.1 Unit语法格式5.2 编写nginx.service文件service文件为服务的启动说明文件Unit文件此文件记录了如何启动对应的服务nginx现在没有nginx.service文件所以使用systemctl命令无法启动nginx服务因为systemctl不知道如何启动源码包安装的软件都是这样交代环境背景可使用AI配合生成nginx.service文件适当微调配置中不要出现中文# 创建Nginx服务unit文件[rootweb1 ~]# vim /usr/lib/systemd/system/nginx.service[Unit]DescriptionThe Nginx HTTP Server#描述信息Afternetwork.target remote-fs.target nss-lookup.target##在网络程序网络文件系统域名解析等服务启动之后再启动nginx[Service]Typeforking#forking多进程类型服务ExecStart/usr/local/nginx/sbin/nginxExecReload/usr/local/nginx/sbin/nginx-sreloadExecStop/bin/kill-sQUIT$MAINPID#kill给程序发送QUIT退出信号关闭nginx[Install]WantedBymulti-user.target注意无service文件用原生命令启动Nginx进程为独立后台进程不受systemd管控。后续编写并重载service文件仅完成服务规则注册不会自动接管已运行的旧进程。此时systemctl stop nginx依旧无效只能使用kill或killall命令终止原有进程。彻底杀掉旧进程后重新执行systemctl start nginx拉起服务进程正式交由systemd托管此后可正常使用systemctl全套命令管理。5.3 生效配置并管理服务# 停止原有Nginx进程[rootweb1 ~]# /usr/local/nginx/sbin/nginx -s stop# 重载systemd配置[rootweb1 ~]# systemctl daemon-reload#此命令用于强制 systemd 重新扫描所有服务配置文件让新增 / 修改的.service 服务文件配置生效# 启动Nginx[rootweb1 ~]# systemctl start nginx# 设置开机自启[rootweb1 ~]# systemctl enable nginx# 验证端口[rootweb1 ~]# ss -nutlp | grep :80