Nginx 核心功能与 LNMP 环境搭建深度笔记
Nginx 核心功能与 LNMP 环境搭建深度笔记
一、基于授权的访问控制(用户认证)
1.1 功能简介
通过用户名和密码验证客户端访问权限,适用于企业内部系统、敏感资源目录等需要身份验证的场景。Nginx 通过auth_basic
模块实现,流程如下:
- 生成加密的用户密码文件
- 配置 Nginx 验证规则
- 客户端输入凭证后访问
1.2 核心配置步骤
(1)生成用户认证文件
-
工具:
htpasswd
(需安装httpd-tools
包) -
命令解析
[root@localhost ~]# dnf -y install httpd-tools
[root@localhost ~]# htpasswd -c /usr/local/nginx/passwd.db test New password: Re-type new password: Adding password for user test
-c
:创建新文件(首次使用需加此参数)/usr/local/nginx/passwd.db
:密码文件路径test
:用户名- 执行后需输入两次密码,密码以 BCrypt 哈希存储在文件中
(2)权限设置
chmod 400 /usr/local/nginx/passwd.db # 仅所有者可读
chown nginx /usr/local/nginx/passwd.db # 属主改为Nginx运行用户
- 原因:避免其他用户读取密码文件,确保安全
(3)Nginx 配置
server {listen 80;server_name localhost;location / {root html;index index.html;auth_basic "secret"; # 认证领域名称(浏览器弹窗显示)auth_basic_user_file /usr/local/nginx/passwd.db; # 密码文件路径}
}
auth_basic
:开启基本认证auth_basic_user_file
:指定密码文件位置
(4)验证测试
- 访问
http://服务器IP
,浏览器弹出登录框 - 输入正确用户名密码后访问成功,错误则返回 401 状态码
1.3 应用场景
- 企业 OA 系统、后台管理页面
- 付费资源下载平台
- 需权限控制的 API 接口
1.4 优缺点
优点 | 缺点 |
---|---|
简单易用,无需额外插件 | 用户需记忆凭证,体验稍差 |
加密存储密码 | 不适合高并发匿名访问场景 |
二、基于客户端的访问控制(IP 过滤)
2.1 功能简介
通过 IP 地址或网段控制访问权限,规则自上而下匹配,支持deny
(拒绝)和allow
(允许)指令。常用于:
- 限制特定地区 IP 访问
- 屏蔽恶意 IP 攻击
- 允许内网 IP 访问特定服务
2.2 核心配置示例
nginx
location / {root html;index index.html;deny 192.168.10.3; # 拒绝单个IPdeny 192.168.10.0/24; # 拒绝IP段(C类子网)allow 192.168.20.0/24; # 允许特定子网allow all; # 允许所有(需放在最后)
}
- 规则顺序:先写
deny
再写allow
,匹配即停止 - 最佳实践:先拒绝危险 IP,再允许信任 IP,最后用
allow all
兜底
2.3 应用场景
- 防止 CC 攻击(屏蔽频繁请求的 IP)
- 限制仅公司内网访问管理后台
- 配合 CDN 节点 IP 白名单
2.4 优缺点
优点 | 缺点 |
---|---|
配置轻量,性能损耗低 | 无法防御代理 IP 绕过 |
实时生效,无需重启服务 | 大规模 IP 管理复杂 |
三、Nginx 虚拟主机配置
3.1 核心概念
虚拟主机允许单台服务器运行多个网站,通过server
块隔离配置,支持三种类型:
- 基于域名:通过不同域名区分(最常用)
- 基于 IP:通过不同 IP 地址区分(需多 IP 支持)
- 基于端口:通过不同端口号区分(如 8080、8888)
3.2 基于域名的虚拟主机
(1)环境准备
-
客户端配置
:修改
hosts
文件(Windows 在
C:\Windows\System32\drivers\etc\hosts
,Linux 在
/etc/hosts
192.168.10.101 www.dufu.com 192.168.10.101 www.libai.com
-
服务器端准备
mkdir -p /var/www/html/dufu # 创建站点目录 echo "www.dufu.com" > /var/www/html/dufu/index.html # 生成测试页
(2)Nginx 配置
nginx
server {listen 80;server_name www.dufu.com; # 绑定域名access_log logs/www.dufu.com.access.log; # 独立访问日志location / {root /var/www/html/dufu; # 站点根目录index index.html;}
}server {listen 80;server_name www.libai.com;location / {root /var/www/html/libai;index index.html;}
}
(3)验证方法
[root@localhost ~]# curl www.dufu.com
dufu
[root@localhost ~]# curl www.libai.com
libai
- 访问
http://www.dufu.com
和http://www.libai.com
,显示不同内容
3.3 基于 IP 的虚拟主机
(1)服务器多 IP 配置(示例:添加虚拟 IP)
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens160 ifcfg-ens160:0
cp ifcfg-ens160 ifcfg-ens160:1# 复制网卡配置文件
vim ifcfg-ens160:0 # 修改IP为192.168.10.100
vim ifcfg-ens160:1 # 修改IP为192.168.10.200
nmcli c reload && nmcli c up ens160 # 重启网络服务 这里的:0指的是子接口或者虚拟ip 这些是基于物理网卡而生产的reload要对真实存在的网卡才能生效
ip addr show # 验证IP是否生效
(2)Nginx 配置
nginx
server {listen 192.168.10.100:80; # 监听第一个IPserver_name www.dufu.com;root /var/www/html/dufu;
}server {listen 192.168.10.200:80; # 监听第二个IPserver_name www.libai.com;root /var/www/html/libai;
}
[root@localhost ~]# curl 192.168.10.200
libai
[root@localhost ~]# curl 192.168.10.100
dufu
3.4 基于端口的虚拟主机
(1)Nginx 配置
nginx
server {listen 192.168.10.101:80; # 监听8080端口server_name www.dufu.com;root /var/www/html/dufu;
}server {listen 192.168.10.101:8080; # 监听8888端口server_name www.libai.com;root /var/www/html/libai;
}
(2)访问方式
[root@localhost ~]# curl 192.168.10.101:80
dufu
[root@localhost ~]# curl 192.168.10.101:8080
libai
http://192.168.10.101:8080
和http://192.168.10.101:8080
四、LNMP 架构部署(Linux+Nginx+MySQL+PHP)
4.1 安装 mariadb-server
dnf -y install mariadb-server
4.2 编译安装 PHP 5.5(支持 MySQLnd)
(1)依赖安装
yum install -y gd libxml2-devel libjpeg-devel libpng-devel zlib-devel
gd
:图形处理库(生成验证码、图片缩略图等)libxml2
:XML 解析库(处理 API 数据)
(2)配置参数(MySQLnd 驱动)
tar -zxvf php-5.5.38.tar.gz
cd php-5.5.38
./configure \
--prefix=/usr/local/php5 \ # 安装路径
--with-gd \ # 启用GD库
--with-zlib \ # 启用压缩库
--with-mysql=mysqlnd \ # 使用MySQLnd原生驱动
--with-mysqli=mysqlnd \ # 启用MySQLi扩展
--enable-mbstring \ # 支持多字节字符(中文等)
--enable-fpm \ # 启用FastCGI进程管理器
--with-jpeg-dir=/usr/lib # JPEG库路径
(3)PHP-FPM 配置优化
cp php-fpm.conf.default php-fpm.conf # 复制默认配置
vim php-fpm.conf
关键参数:
ini
user = php # 运行用户
group = php # 运行用户组
pm.max_children = 50 # 最大子进程数(根据服务器性能调整)
pm.start_servers = 20 # 启动时初始进程数
pm.min_spare_servers = 5 # 最小空闲进程数
pm.max_spare_servers = 35 # 最大空闲进程数
4.3 Nginx 集成 PHP 解析
(1)Nginx 配置文件
nginx
server {listen 80;server_name www.bt.com;root /var/www/html;index index.php index.html;location ~ \.php$ {root /var/www/html; # PHP文件根目录fastcgi_pass 127.0.0.1:9000; # PHP-FPM监听地址(端口或Unix Socket)fastcgi_index index.php; # 入口文件include fastcgi.conf; # 引入FastCGI参数配置fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 传递文件路径}
}
(2)测试文件
-
test1.php
(查看 PHP 信息):
<?php phpinfo(); ?>
-
test2.php
(数据库连接测试):
php
<?php $link = mysqli_connect('127.0.0.1', 'root', 'pwd123'); if ($link) {echo "<h1>数据库连接成功!</h1>"; mysqli_close($link); } else {echo "<h1>连接失败:" . mysqli_connect_error() . "</h1>"; } ?>
4.4 部署 Discuz! 论坛(示例应用)
(1)准备工作
yum install -y unzip # 安装解压缩工具
unzip Discuz_X3.3_SC_UTF8.zip # 解压程序包
mkdir -p /var/www/html/bbs # 创建论坛目录
mv upload/* /var/www/html/bbs # 移动文件
chown -R php:php /var/www/html/bbs # 权限归属PHP用户
(2)创建数据库
mysql
CREATE DATABASE bbs; # 创建数据库
GRANT ALL ON bbs.* TO 'runbbs'@'127.0.0.1' IDENTIFIED BY 'bbs123'; # 允许本地IP访问
GRANT ALL ON bbs.* TO 'runbbs'@'localhost' IDENTIFIED BY 'bbs123'; # 允许localhost访问
FLUSH PRIVILEGES; # 刷新权限
(3)安装向导
访问http://服务器IP/bbs/install/index.php
,按步骤完成:
- 同意许可协议
- 检测环境(确保 PHP 扩展、目录权限符合要求)
- 配置数据库连接(填入创建的数据库信息)
- 完成安装
五、扩展知识:Nginx 与 Apache 对比
功能 | Nginx | Apache |
---|---|---|
并发模型 | 事件驱动(异步非阻塞) | 多进程 / 线程(阻塞式) |
静态资源处理 | 性能优异(直接磁盘读取) | 需模块支持(如 mod_static) |
动态内容处理 | 依赖 FastCGI(如 PHP-FPM) | 内置模块(如 mod_php) |
虚拟主机配置 | 每个站点独立server 块 | 基于VirtualHost 指令 |
内存占用 | 低(单进程轻量设计) | 高(每个进程独立内存) |
六、运维常用命令
操作场景 | Nginx 命令 | MySQL 命令 | PHP 命令 | |||
---|---|---|---|---|---|---|
检查配置语法 | nginx -t | mysql -u root -p -e "status" | `php -i | grep mysqlnd` | ||
重启服务 | systemctl restart nginx | systemctl restart mysqld | systemctl restart php-fpm | |||
查看进程状态 | `ps -ef | grep nginx` | `ps -ef | grep mysql` | `ps -ef | grep php-fpm` |
端口监听检测 | `netstat -anpt | grep nginx` | `netstat -anpt | grep 3306` | `netstat -anpt | grep 9000` |
七、故障排查指南
- 401 认证失败:
- 检查密码文件路径是否正确(
auth_basic_user_file
) - 确认密码文件权限为 400 且属主为 Nginx
- 清除浏览器缓存后重试
- 检查密码文件路径是否正确(
- PHP 页面无法解析:
- 检查 Nginx 配置中
fastcgi_pass
是否指向正确端口(9000) - 确认 PHP-FPM 服务已启动(
systemctl status php-fpm
) - 查看 PHP 错误日志(
/usr/local/php5/var/log/php-fpm.log
)
- 检查 Nginx 配置中
- 虚拟主机访问异常:
- 检查
server_name
是否与域名匹配 - 确认站点目录权限为 Nginx 用户可读写
- 清除本地 DNS 缓存(Windows:
ipconfig /flushdns
,Linux:systemd-resolve --flush-caches
)
- 检查