Nginx进阶(二)
缓存配置proxy_cache
第一步,配置文件http块中开启proxy_cache模块
http {proxy_cache_path /var/cache/nginx #缓存目录的路径levels=1:2 #目录层级结构keys_zone=my_cache:10m #定义了缓存的名称为my_cache,大小为10MBinactive=60m; #定义了缓存的过期时间为60分钟,即如果60分钟内没有请求访问缓存的内容,则会被自动清除
}
第二步,配置缓存区,在location块中添加proxy_cache指令来启用缓存
server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_cache my_cache; #缓存名称,与proxy_cache_path中的名称对应proxy_cache_valid 200 60m;#状态码为200的响应,缓存的有效期为60分钟proxy_cache_valid 404 1m; #状态码为404的响应,缓存的有效期为1分钟proxy_cache_bypass $http_pragma;#用于控制是否绕过缓存,参数表示如果请求头中包含Pragma字段,则不使用缓存。proxy_cache_revalidate on;#用于控制是否需要重新验证缓存。具体参数如下,on表示需要重新验证缓存}
}
Redis 缓存与 Nginx 缓存对比表
对比维度 | Redis 缓存 | Nginx 缓存 |
---|---|---|
核心优势 | 1. 支持丰富数据结构(String、Hash、List 等),适配多场景数据缓存 2. 支持数据持久化(RDB/AOF),避免内存数据丢失 3. 支持过期时间 + 淘汰策略(如 LRU),灵活控制缓存内容 4. 支持分片与集群部署,可扩展为大规模缓存集群 | 1. 部署与维护简单,无需额外复杂配置 2. 性能极高,尤其适合静态文件(图片、JS、CSS)缓存 3. 轻量高效,对服务器资源占用低 4. 可通过简单配置控制缓存过期时间与策略 |
主要劣势 | 1. 性能低于 Nginx 缓存,不适合大量静态文件缓存 2. 集群部署、维护复杂度高,需专业技术支持 3. 缓存静态资源时,相比 Nginx 存在额外网络开销(如跨服务调用) | 1. 仅支持静态文件、简单 API 数据缓存,无法处理复杂数据类型 2. 缓存数据仅存于内存,无持久化能力,服务重启后数据丢失 3. 集群扩展困难,难以实现大规模分布式缓存 |
适用场景 | 1. 需要缓存复杂数据类型(如用户会话、商品详情结构化数据) 2. 需数据持久化、避免缓存雪崩 / 穿透的业务 3. 大规模分布式系统的缓存需求(如电商高并发场景) | 1. 静态资源加速(网站图片、前端静态文件) 2. 简单 API 接口结果缓存(如非实时性数据查询) 3. 轻量场景下的缓存需求,追求部署效率与性能 |
数据存储能力 | 支持内存 + 磁盘持久化,可长期保存关键缓存数据 | 仅内存存储,无持久化机制,服务重启缓存清空 |
扩展性 | 支持集群、分片,可横向扩展至数十 / 数百节点,应对高并发、大数据量 | 单节点性能强,但集群扩展复杂,需依赖第三方方案(如一致性哈希),灵活性低 |
操作复杂度 | 中高(需配置持久化、集群、淘汰策略等,需专业运维) | 低(通过 Nginx 配置文件即可完成缓存规则设置,上手成本低) |
Nginx访问控制
实验:
基于IP地址的访问控制#要是前面有反向代理的操作,把反向代理注释掉
#编辑Nginx配置文件
vim usr/local/nginx/conf/nginx.conf
#直接添加
#只允许特定IP地址访问
allow 192.168.1.100;
allow 10.0.0.0/24;
deny all;
#允许所有访问
#allow all;
#检查是否有错误
/usr/local/nginx/sbin/nginx -t
#重启服务
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
只有 IP 地址 192.168.1.100 和 10.0.0.0/24 网段的客户端可以访问其他所有客户端将被拒绝访问基于用户身份的访问控制创建密码文件#使用 htpasswd 工具创建密码文件
# Ubuntu安装htpasswd
apt install apache2-utils
htpasswd -c /etc/nginx/.htpasswd username创建位置 你的用户名
#根据提示输入密码,这将创建一个包含用户名和加密密码的文件。
#在htpasswd文件中,可以查看设置的用户名与密码
配置Nginx文件#编辑Nginx配置文件
vim usr/local/nginx/conf/nginx.conf
#直接添加,注意htpasswd的路径不要写错了
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
#检查是否有错误
/usr/local/nginx/sbin/nginx -t
#重启服务
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
访问需要提供用户名和密码进行身份验证
基于IP地址的访问控制
server {listen 80;server_name example.com;
location /admin {# 只允许特定IP地址访问 /adminallow 192.168.221.129; #只有IP地址为192.168.221.129可以访问allow 10.0.0.0/24; #只有10.0.0.0/24 网段的客户端可以访问/admin deny all; #其他所有客户端将被拒绝访问 /admin
# 其他配置proxy_pass http://backend;}
location / {# 允许所有客户端访问allow all;
# 其他配置proxy_pass http://backend;}
}
基于用户身份的访问控制
# Ubuntu安装htpasswd创建密码文件
apt install apache2-utils
htpasswd -c /etc/nginx/.htpasswd username 然后根据提示输入密码
# 配置Nginx
location /admin { #访问/admin时需要用户名和密码auth_basic "Restricted Access";auth_basic_user_file /etc/nginx/.htpasswd;# 其他配置proxy_pass http://backend;}
基于请求方法的访问控制
location /api {limit_except GET POST { #只允许GET和POST请求方法deny all;}#其他配置proxy_pass http://backend;}
基于用户代理的访问控制
可以根据请求中的 User-Agent 头部字段来限制访问。例如,阻止某些爬虫或恶意请求。
location / {if ($http_user_agent ~* "badbot|maliciousbot") {return 403; #返回403Forbidden}
}
跨域配置
-
跨域问题的原因:
-
协议不同(如:http和https)
-
域名不同(如:www.a.com和www.a.b.com)
-
端口号不同(如:8080和8081)
-
-
跨域问题解决策略:
-
前后端分离:前端代码与后端代码,开发与部署是独立的。数据通过API接口进行传输;
-
JSONP使用<script>实现跨域,方法较老,不推荐使用;
-
CORS,在请求头中设置,运行浏览器进行跨域
location / {add_header 'Access-Control-Allow-Origin' '*'; #用于建立跨域请求允许的来源,*表示允许任何源访问add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; #指定跨源请求允许的请求方法或 HTTP 动词add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; #允许在跨源请求期间包含特定标头信息字段add_header Access-Control-Allow-Credentials 'true'; #确定是否允许跨源使用cookie# ...}
-
反向代理,将前后端代理到同一个“域”下;域名、协议、端口相同;
-
https://192.168.221.129/api/
-
https://xxx.com/api/
-
-
LNMP环境搭建★★★
-
Linux + Nginx + MySQL + PHP/Python/Perl
-
PHP:
-
优点是简单,学习成本低,开发成本低,开发网站高效;
-
缺点是功能较为单一,不擅长移动端开发;
-
Centos7搭建LNMP
#关闭防火墙和SElinux
systemctl stop firewalld
systemctl disable firewalld
vi /etc/selinux/config
SELINUX=disabled
reboot
# 安装 Nginx
#1.执行以下命令,在 /etc/yum.repos.d/ 下创建 nginx.repo 文件。
vim /etc/yum.repos.d/nginx.repo
#2.按 i 切换至编辑模式,写入以下内容。
[nginx]
name = nginx repo
baseurl = https://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck = 0
enabled = 1
保存文件并返回。
#3.执行以下命令,安装 nginx。
yum install -y nginx
#4.执行以下命令,打开 default.conf 文件。
vim /etc/nginx/conf.d/default.conf
#5.找到 server{...},并将 server 大括号中相应的配置信息替换为如下内容。用于取消对 IPv6 地址的监听,同时配置 Nginx,实现与 PHP 的联动。
server {listen 80;root /usr/share/nginx/html;server_name localhost;#charset koi8-r;#access_log /var/log/nginx/log/host.access.log main;#location / {index index.php index.html index.htm;}#error_page 404 /404.html;#redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}#pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000#location ~ .php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}
保存文件并返回。
#6.执行以下命令启动 Nginx。
systemctl start nginx
#7.执行以下命令,设置 Nginx 为开机自启动。
systemctl enable nginx
#8.在本地浏览器中访问以下地址,查看 Nginx 服务是否正常运行。
http://IP或者IP地址
显示欢迎界面,则说明 Nginx 安装配置成功。
安装数据库
#一键安装MySQL
\q
安装配置 PHP
1.依次执行以下命令,更新 yum 中 PHP 的软件源。
rpm -Uvh https://mirrors.cloud.tencent.com/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
2.执行以下命令,安装 PHP 7.2 所需要的包。
yum -y install mod_php72w.x86_64 php72w-cli.x86_64 php72w-common.x86_64 php72w-mysqlnd php72w-fpm.x86_64
3.执行以下命令,启动 PHP-FPM 服务。
systemctl start php-fpm
4.执行以下命令,设置 PHP-FPM 服务为开机自启动。
systemctl enable php-fpm
验证环境配置
当您完成环境配置后,可以通过以下验证 LNMP 环境是否搭建成功。
1.执行以下命令,创建测试文件。
echo "<?php phpinfo(); ?>" >> /usr/share/nginx/html/index.php
2.执行以下命令,重启 Nginx 服务。
systemctl restart nginx
3.在本地浏览器中访问如下地址,查看环境配置是否成功。
http://IP/index.php
显示结果如下,则说明环境配置成功。
img
手动搭建 WordPress 个人站点(Linux)
操作场景
WordPress 是一款使用 PHP 语言开发的博客平台,您可使用通过 WordPress 搭建属于个人的博客平台。
1.执行以下命令,进入 MariaDB。
mysql
2.执行以下命令,创建 MariaDB 数据库。例如 “wordpress”。
CREATE DATABASE wordpress;
3.执行以下命令,创建一个新用户。例如 “user”,登录密码为 123456。
CREATE USER 'user'@'localhost' IDENTIFIED BY '123456';
4.执行以下命令,赋予用户对 “wordpress” 数据库的全部权限。
GRANT ALL PRIVILEGES ON wordpress.* TO 'user'@'localhost';
5.执行以下命令,设置 root 账户密码。
说明
MariaDB 10.4 在 CentOS 系统上已增加了 root 账户免密登录功能,请执行以下步骤设置您的 root 账户密码并牢记。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
6.执行以下命令,使所有配置生效。
FLUSH PRIVILEGES;
7.执行以下命令,退出 MariaDB。
\q
下载 WordPress
说明
WordPress 可从 WordPress 官方网站下载 WordPress 最新中文版本并安装,本教程采用 WordPress 中文版本。
1.执行以下命令,删除网站根目录下用于测试 PHP-Nginx 配置的index.php文件。
rm -rf /usr/share/nginx/html/index.php
2.依次执行以下命令,进入/usr/share/nginx/html/目录,并下载与解压 WordPress。
cd /usr/share/nginx/html
wget https://cn.wordpress.org/wordpress-5.0.4-zh_CN.tar.gz
tar zxvf wordpress-5.0.4-zh_CN.tar.gz
修改 WordPress 配置文件
1.依次执行以下命令,进入 WordPress 安装目录,将wp-config-sample.php文件复制到wp-config.php文件中,并将原先的示例配置文件保留作为备份。
cd /usr/share/nginx/html/wordpress
cp wp-config-sample.php wp-config.php
2.执行以下命令,打开并编辑新创建的配置文件。
vim wp-config.php
3.按 i 切换至编辑模式,找到文件中 MySQL 的部分,并将相关配置信息修改为配置 WordPress数据库 中的内容。
// ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define('DB_NAME', 'wordpress');/** MySQL database username */ define('DB_USER', 'user');/** MySQL database password */ define('DB_PASSWORD', '123456');/** MySQL hostname */ define('DB_HOST', 'localhost');
4.修改完成后,按 Esc,输入 :wq,保存文件返回。
验证 WordPress 安装
1.在浏览器地址栏输入http://IP/wordpress 文件夹,例如:
http://192.xxx.xxx.xx/wordpress
转至 WordPress 安装页,开始配置 WordPress。
配置WP1
2.根据 WordPress 安装向导提示输入以下安装信息,单击安装 WordPress,完成安装。
所需信息 说明
站点标题 WordPress 网站名称。
用户名 WordPress 管理员名称。出于安全考虑,建议设置一个不同于 admin 的名称。因为与默认用户名称 admin 相比,该名称更难破解。
密码 可以使用默认的密码或者自定义密码。请勿重复使用现有密码,并确保将密码保存在安全的位置。
您的电子邮件 用于接收通知的电子邮件地址。
现在可以登录 WordPress 博客,并开始发布博客文章了。
Ubuntu22.04部署LNMP
# 查看防火墙状态(一般默认关闭)
ufw status
# 安装Nginx
apt update
apt -y install nginx
nginx -v
# 一键安装MySQL
vim mysql_install.sh
+++++++++++++++++++++++++++++++++++
脚本
+++++++++++++++++++++++++++++++++++
bash mysql_install.sh
bash
mysql -uroot -proot123
exit;
# 安装PHP与PHP-MySQL模块
apt -y install php-fpm php-mysql
# 查看PHP版本确认安装完成(显示PHP 8.1.2-1ubuntu2.22 (cli))
php -v
# 打开Nginx默认的配置文件,修改以支持PHP
vim /usr/local/nginx/conf/nginx.conf
-----------------------------------------------------------------
#在server{}内,找到index开头的配置行,在该行中添加index.php。
location / {root html;index index.php index.html index.htm;}
#在server{}内找到location ~ \.php$ {},取消注释,记得改把路径改成/usr/local/nginx/html
location ~ \.php$ {root html;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;include fastcgi_params;}
-----------------------------------------------------------------
# 测试语法并重启nginx
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
# 配置PHP,在Nginx网站根目录中,新建phpinfo.php文件
vim index/phpinfo.php
# 输入一个函数就行
<?php echo phpinfo(); ?>
# 启动PHP
systemctl start php8.1-fpm
vim /etc/php/8.1/fpm/pool.d/www.conf
# 36和37行左右改listen
listen = 9000
systemctl restart php8.1-fpm.service
# 在浏览器输入地址查看
http://192.168.221.129/phpinfo.php
访问结果如下图所示,成功查看到PHP配置信息页面,表示LNMP环境部署成功。
动静分离(简单分布式)
-
Nginx网关 -> location
-
NFS:文件共享,实现不同服务器之间的数据同步;
-
Nginx + 静态资源
-
PHP
-
MySQL
为什么要做动静分离?
动态服务(PHP、Java、Python、GO)与静态服务(HTML、CSS、JS、图片、音频、视频)进行独立部署;
-
提升性能:动态服务与静态服务互不干扰,降低服务器的负载(CPU、内存占用率);
-
方便扩容:当并发量大量增加时,通过增加动态服务器来,负载均衡提升性能;
-
使用CDN(内容分发网络),加速静态资源的访问速度;
-
提升安全性:对动态服务器进行隔离,增加数据的安全性;
服务器 | 功能 | 软件 |
---|---|---|
192.168.221.129 | 数据共享 | NFS服务端 |
192.168.221.21 | 服务入口(网关) | Nginx服务器配置 |
192.168.221.22 | 动态服务器 | PHP+NFS客户端 |
192.168.221.23 | 静态服务 | Nginx+NFS客户端 |
192.168.221.20 | 数据库 | MySQL、开启远程账号 |
最小安装Ubuntu
#下载好安装包后解压到文件夹里,从VMware中打开
#进入Base login:输入默认的用户名和密码
root
root123
#配置网络
vim /etc/netplan/00-installer-config.yaml
++++++++++++++++++++++++++++++++++++++
# This is the network config written by 'subiquity'
network:ethernets:ens33:dhcp4: nodhcp6: nosddresses: [192.168.221/24]gateway4: 192.168.221.2nameservers:addresses: [114.114.114.114,8.8.8.8]version: 2
++++++++++++++++++++++++++++++++++++++
#重启网络
netplan apply
#修改主机名
hostnamectl set-hostname server-21
动静分离配置详解★★★
1.NFS服务器配置
IP: 192.168.221.129
# CentOS7安装NFS
yum -y install nfs-utils
# Ubuntu安装NFS
apt install -y nfs-kernel-server
# 创建共享目录
mkdir -p /app/blog
# 修改共享配置
vim /etc/exports
# 只允许内网网段挂载,提高安全性。
/app/blog 192.168.221.0/24(rw,sync,root_squash,no_all_squash,no_subtree_check)
# Ubuntu 重启服务
systemctl restart nfs-kernel-server
systemctl enable nfs-kernel-server
# CentOS7 重启服务
sudo systemctl start rpcbind nfs-server
sudo systemctl enable rpcbind nfs-server
# 进入共享数据
cd /app/blog
# 下载wordpress文件
wget http://192.168.57.200/Software/wordpress-6.6.1-zh_CN.zip
# 解压
unzip wordpress-6.6.1-zh_CN.zip
# 发送到共享数据
cp -r wordpress/* /app/blog
2.Nginx服务器配置
IP: 192.168.221.21
首先Nginx与PHP服务器都要挂载NFS。实现统一部署方便管理
# CentOS7安装依赖
yum install nfs-utils
# Ubuntu安装依赖依赖
apt install -y nfs-common
# 使用脚本安装Nginx(需要更换)
wget http://192.168.57.200/Software/nginx_install.sh
bash nginx_install.sh
# 创建共享目录
mkdir -p /app/blog
# 将NFS的/app/blog挂载至本地的/app/blog
mount 192.168.221.129:/app/blog /app/blog
# 配置Nginx(没做完先不改)
vim /usr/local/nginx/conf/nginx.conf
--------------------------------------------------
#43-45
location / {#除图片以外的静态资源访问192.168.221.21root /app/blog;index index.php index.html index.htm;}
location ~* \.php$ { #location匹配将php结尾的交给PHP服务器fastcgi_pass 192.168.221.22:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /app/blog$fastcgi_script_name;include fastcgi_params;}
location ~* \.(jpg|gif|png|webp)$ { # location匹配将图片交给Image处理proxy_pass http://192.168.221.23; #Image服务>器要开启web服务}
--------------------------------------------------
# 重启nginx
3.PHP服务器配置
IP:192.168.221.22
# CentOS7安装依赖
yum install nfs-utils
# Ubuntu安装依赖
apt install -y nfs-common
# 创建共享目录
mkdir -p /app/blog
# 将NFS的/app/blog挂载至本地的/app/blog
mount 192.168.221.129:/app/blog /app/blog
PHP服务器的配置比较简单,主要讲PHP以FPM模式安装后进行简单的配置即可
# CentOS7
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum -y install mod_php72w.x86_64 php72w-cli.x86_64 php72w-common.x86_64 php72w-mysqlnd php72w-fpm.x86_64
vim /etc/php-fpm.d/www.conf
# Ubuntu
apt update
apt install php-fpm php-mysql
vim /etc/php/8.1/fpm/pool.d/www.conf
----------------------------------------------
# 只写监听端口,即监听所有IP
listen = 9000
# 将这行注释,可以允许所有IP进行访问,否则只能本机访问。(63行一般已经注释)
; listen.allowed_clients = 127.0.0.1
----------------------------------------------
systemctl start php8.1-fpm
systemctl enable php8.1-fpm
#如果显示没有这个的话,可以用php -v检查一下版本号
4.Image服务器配置
IP: 192.168.221.23
# CentOS7安装依赖
yum install nfs-utils
wget http://192.168.57.200/Software/nginx_install.sh
bash nginx_install.sh
# Ubuntu安装Nginx和nfs-common
apt install nginx -y (需要手动编译安装)
apt install -y nfs-common
# 创建共享目录
mkdir -p /app/blog
# 将NFS的/app/blog挂载至本地的/app/blog
mount 192.168.221.129:/app/blog /app/blog
vim /usr/local/nginx/conf/nginx.conf
#43
location {root /app/blog; # 仅仅修改根目录这一行即可。Httpd同理index index.html index.htm;} # 如果使用apache要注意在CentOS7下默认拒绝所有
# 重启服务
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
5.MySQL服务器
IP: 192.168.221.20
# Ubuntu apt安装
apt -y install mysql-server
# 或者二进制安装
wget http://192.168.57.200/Software/mysql_install.sh
bash mysql_install.sh
# 创建wordpress数据库与远程账号
mysql -uroot -proot123
CREATE DATABASE wordpress charset utf8mb4;
CREATE USER 'wordpress'@'192.168.221.%' IDENTIFIED BY 'admin1234';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'192.168.221.%';
FLUSH PRIVILEGES;
没问题就进入配置界面,可以在192.168.221.129的/app/blog上创建文件
刷新一下显示已安装,直接登陆,如果不行就无痕模式打开192.168.221.21