Nginx基本配置 Nginx服务基础Nginx访问控制Nginx虚拟主机

news2024/11/23 21:44:12

本章结构
Nginx服务基础
Nginx访问控制
Nginx虚拟主机

原理:


关于Nginx
一款高性能、轻量级Web服务软件
稳定性高
系统资源消耗低   apache多线程或多进程实现连接(多线程比多线程稍微好些,切换资源浪费少) Nginx单线程
对HTTP并发连接的处理能力高
单台物理服务器可支持30 000 ~ 50 000个并发请求apahce就一两万。面试的时候都说两三万不要太高,理论值

 

Nginx相对于Apache的优点:
轻量级,同样是 web 服务,比Apache 占用更少的内存及资源,高并发,Nginx 处理请求是异步非塞的,而Apache 则是阻塞型的,在高并发下Nginx 能保持低资源低消耗高性能;高度模块化的设计
编写模块相对简单;社区活跃,各种高性能模块出品迅速.
Apache 相对于Nqinx 的优点:
rewrite,比Nginx 的rewrite强大; 模块超多,基本想到的都可以找到; 少bug,Nginx 的bug 相对较多; 超稳定存在就是理由,一般来说,需要性能的web 服务,用Ninx 。如果不需要性能只求稳定,那就Apache。Nginx处理动态一般动态请求要Apache去做,Nginx只适处理静态网页或反向代理


阻塞型:一个链接请求过来,必须处理完该请求后才能处理第二个链接请求。
异步非阻塞:可以同时接受多个请求,请求之间不是相互阻塞的交给别人处理,别人处理完后再返回。链接请求之间没有阻塞功能
nginx作为网关只负责接受请求转发给后台服务器处理。返回结果。

手动清理Swap和buffers/cache
(1)清理Swap I
swapoff -a && swapon -a
操作说明:如果已经使用了Swap,且当前清空下+buffers/cache还有空间,在执行 swapoff -a操作时,会触发把Swap中的内容交换到内存中,数据不会丢失。
(2)清理buffers/cache:
sync; sync; sync;&& echo 3 >/proc/sys/vm/dropcaches
sleep 2
echo 0 >/proc/sys/vm/drop_caches
操作说明
sync-->将缓存的内从写回到硬盘中echo 3 >/proc/sys/vm/drop_caches--> 修 改drop_caches的值为3,默认为0,改为3系统会清理缓存的内容;


Nginx有几种进程以及作用:
master进程:用来管理worker进程,用于读取配置文件   只有一个
worker进程:用于处理用户链接请求的    可以有多个,配置文件可以修改


网站应用一版推荐使用最新版本,bug最少,功能最全

反向代理:网关服务器


退出进程
kill -3:发送信号给进程让进程关闭服务(会做日志记录)
kill -3 $(cat /usr/local/nginx/logs/nginx.pid)
netstat -Intp  | grep nginx
也可:killall -s QUIT nginx(肯能误杀)

不中断服务情况加载配置文件:kill -1  PID号

做计划性定时任务
Nginx日志分割通过mv方式将文件移走

管理服务使用绝对路径nginx允许,关闭服务使用kill指定PID号杀掉
习惯于使用systemctl管理
方法一:
在 /etc/init.d中创建一个脚本,再加入到系统管理管理服务。
vim nginx

#!/bin/bash
#chkconfig: 35 20 99
#desc: this is nginx service control script

NGINX_CMD="/usr/local/nginx/sbin/nginx"
NGINX_PID=" /usr/local/nginx/logs/nginx.pid"
case $l in
start)
$NGINX_CMD
;;

stop)
kill -3  $(cat SNGINX_PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -1 $(cat SNGINX_PID)
;;
status)
if ss -Intp | grep nginx &> /dev/null
then
echo 'nginx is running!'
else
echo 'nginx is not running!'
fi
;;
*)
echo "Usage: $o {startlstoplrestart|reload status}'
exit 1

esac
exit 0

chmod +x nginx
chkconfig --add nginx
chkconfig --list nginx

之后可以使用service nginx 

方法二:
在 /etc/systemd/system 下创建以.service结尾的文件创建服务脚本
vim /lib/systemd/system/nginx.service
[Unit] 
Description=nginx
After=network.target
[Service]
Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -S HUP SMAINPID
ExecStop=/bin/kil1 -S OUIT SMAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
-------
[Unit]:服务的说明
Description:描述服务After:依赖,当依赖的服务启动之后再启动自定义的服务
[Service]服务运行参数的设置Type=forking是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程ExecStart为服务的具体运行命令ExecReload为重启命令Execstop为停止命今
PrivateTmmp=True表示给服务分配独立的临时空间注意:启动、重启、停止命令全部要求使用绝对路径
[Instal1]服务安装的相关设置,可设置为多用户
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

Nginx编译安装
安装支持软件(依赖包)
 yum -y install pcre-devel(正则表达式) zlib-devel(压缩功能) openssl-devel(支持HTTPS ) (Nginx使用c语言开发的)
创建运行用户、组(专门为Nginx创建一个账号用户,便于访问)
useradd -M -s /sbin/nologin nginx
.编译安装Nqinx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/        
cd nginx-1.12.0/                                    
./configure 
--prefix=/usr/local/nginx                   #指定nginx的安装路径
--user=nginx                                           #指定用户名
--group=nginx                                  #指定组名
--with-http stub status module           #启用 http stub status module 模块以支持状态统计

make && make install
nginx命令执行路径优化(软连接)
In -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
ls -I /usr/local/sbin/nginx

实现升级操作:
nginx -V 
cd /opt

tar -zxvf nginx-1.xx.xx.tar.gz
cd nginx-1.XX.XX
./configure
-prefix=/usr/local/nginx-user=nginx
-group=nginx
--with-http stub status module-with-http ssl module
make   升级软件包时这里不要make install   objs中生产新的二进制文件
mv /usr/local/nginx/sbin/nginx /usr/local/nqinx/sbin/nginx_old
cp objs/nginx /usr/local/nginx/sbin/nginx

不中断的方式杀进程:kill -uer2 PID 号或者 到软件包所在位置 make upgrade
make upgrade#或者先 killall nginx ,
再/usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx  (启动nginx)

nginx -V 

筛选出nginx配置文件中没有使用的行过滤出来
^$ 空行      ^#以#号开头        \s表示空格或tab等空字符   不止一个多个空字符\s+
cat nginx.conf  egrep -v "^$I^\s*#"

认识Nqinx服务的主配置文件 nginx.conf
1、全局块:全局配置,对全局生效:
2 events块:配置影响 Nqinx 服务器与用户的网络连接:
3http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置:
4、server块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块:
5 location块:用于配置匹配的 uri :
6 upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。

vim /usr/local/nginx/conf/nginx.conf,全局配置
#user nobody;                 #运行用户,若编译时未指定则默认为 nobody
worker processes 1;         #工作进程数量,一般设置为和 CPT 核数一样
#error log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid;         #PID 文件的位置

2.I/0 事件配置
events [
use epoll;          #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 4096;         #每个进程处理 4096 个连接
}

#如提高每个进程的连接数还需执行"limt n5535”命今临时修改本地每个进程可以同时打开的最大文件数。
#在linux平台上,在进行高发CP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制 (这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄
#可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linx下多路复用I0接口selet/poll的增强版本,它能显著的减少程序在大量并发连按中只有少量活跃的情况下的系统CPU利用率

HTTP 配置
http{
##文件扩展名与文件类型映射表
include mime .types ;
##默认文件类型
default type application/octet-stream;
##日志格式设定
#log format main '$remote addr - $remote user [Stime local] "$request"'
$status $body_bytes_sent "$http_referer"
'"$http user agent" "$http_x_forwarded for"';

##访问日志位置
#access 1og logs/access.1ogmain;
##开启文件传输模式
sendfile on;
##减少网络报文段的数量
#tcp nopush on:
##连接保持超时时间,单位是秒
#keepalive timeout 0;
keepalive timeout 65;
##gzip模块设置,设置是否开启qzip压缩输出
#qzip on;
##web 服务的监听配置
server 
##监听地址及端口
listen 80;
##站点域名,可以有多个,用空格隔开
server name www.kgc.com;
##网页的默认宁符集
charset utf-8;
##根目录配置
location / {
##网站根目录的位置/usr/local/nginx/htmlroot html;
##默认首页文件名
index index.html index.php;
}
##内部错误的反馈页面
error page 500 502 503 504 /50x.html;
##错误页面配置
location = /50x.html {
root html;
}
}


Nigix和apache的区别:

Nigix:轻量级,能处理的并发量更大,异步非阻塞(基于事件)处理进程

apache:资源占用率更高,处理的并发量较低,阻塞的处理进程

怎么查看nginx最大并发数:

查看配置文件有多少工作进程和每个进程能处理的连接数两者相乘为最大并发数

worker_process 与CPU核数一样(auto)

worker_connection 每个进程允许的最大并发数

uname -a 查看

nginx有几种进程和做啥的
master 管理工作进程,管理配置文件
worker  处理用户链接请求

日志格式设定:
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址:
$remote_addr:对于客户端记录客户端地址,对于后端服务器记录网关服务器地址。只记录上一个节点的地址
$http_x_forwarded_for: 将沿途经过的客户端地址都记录下来,后端服务器可以看到原始客户端地址,也可看到中间转发的网关地址。
$remote_user:用来记录客户端用户名称;
$time_local:用来记录访问时间与时区:
$request:用来记录请求的url与http协议:
$status:用来记录请求状态:成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer: 用来记录从哪个页而链接访问过来的;  直接访问服务器的话该值为空
$http_user_agent: 记录客户浏览器的相关信息:
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过Sremote add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加 forwarded for信息,用以记录原有客户端的IP地址和原来客户端的适求的服务器地址

location常见配置指令,root、alias、proxy pass
root(根路径配置): root /var/www/html
请求www.kqccom/test/lhtml,会返回文件/var/www/html/test/1.html
alias (别名配留) : alias /var/www/html
请求www.kgc.com/test/l.html,会返回文件/var/www/html/l.html
proxy_ pass (反向代理配留)


访问状态统计配置
1.先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块
cat /opt/nginx-1.12.0/auto/options l grep YES    #可查看 nginx 已安装的所有模块
2.修改 nginx.conf 配置文件,指定访问位置并添加 stub_status配置
cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.bak
vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
listen 80:
server_name www.kgc.comf
charset utf-8;

location / {
root html;
index index.html index.php;
}
##添加 stub_status配置##
location /status {        #访问位置为/status
stub status on;           #打开状态统计功能
access log off;           #关闭此位置的日志记录
}
}
}
重启服务,访问测试:
systemctl restart nginx
刘华器访间 http;//192168.80.10/status
Active connections : 表示当前的活动连接数:
server accepts handled requests ;表示已经处理的连接信息,三个数字依次表示已处理的连接数,成功的TCP提手次数、 已处理的请求数

设置一个脚本,监控服务并发数,每一秒监控当前网站的并发数超过10000(这里用1方便验证)及时报警
#!/bin/bash
count=$(curl -Ls 192.168.80.20/state l grep 'Active connections'   awk '(print $3)')
while true
do
if [ scount -ge 1 ];then
echo '警告当前并发负载过高,,并发数为:Scount'
fi
sleep 1
done


基于授权的访问控制
1.生成用户密码认证文件
yum install -y httpd-tools
htpasswd-c /usr/local/nginx/passwd.db zhangsan
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nqinx/passwd.db
2.修改主配置文件相对应目录,添加认证配置项
vim /usr/local/nginx/conf/nginx.conf
server {
location / {
......##添加认证配置##
auth basic "secret";      #设置密码提示框文字信息
auth basic user file /usr/ocal/nginx/passwd.db;
}
}
3.重启服务,访问测试
nginx -t
systemctl restart nginx
浏览器访问 http://192,168,80,10

基于客户端的访问
控制访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。

vim /usr/local/nginx/conf/nginx.conf
server {
location / {
......##添加控制规则##
deny all;
allow 192.168.80.200;

}
}
#允许访问的客户端 IP#拒绝其它IP客户端访问
systemctl restart nginx


基于IP,基于域名,基于端口部署虚拟主机

一。什么是虚拟主机
把一台物理服务器划分成多个 “虚拟” 的服务器,我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。Nginx 提供虚拟主机的功能,就是为了让我们不需要安装多个 Nginx,就可以运行多个域名不同的网站。
每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。
Nginx 下,一个 server 标签就是一个虚拟主机。nginx 的虚拟主机就是通过主配置文件 nginx.conf 中 server 节点指定的,想要设置多个虚拟主机,配置多个server节点即可。

配置虚拟主机的方法
配置虚拟主机有三种方法:
基于域名的虚拟主机 : 不同的域名、相同的IP(此方式应用最广泛)。
基于IP地址的虚拟主机 : 不同的域名、不同的IP ( 需要加网络接口 ,应用的不广泛), 基于IP地址。
基于端口的虚拟主机 : 不使用域名、IP来区分不同站点的内容,而是用不同的TCP端口号。

二。基于域名的 Nginx 虚拟主机
为虚拟主机提供域名解析
echo "192.168.92.30 www.wt.com www.nan.com"  >> /etc/hosts
为虚拟主机准备网页文档
mkdir -p /var/www/html/wt
mkdir -p /var/www/html/nan
echo '<h1>www.wt.com</h1>' > /var/www/html/wt/index.html
echo '<h1>www.nan.com</h1>' > /var/www/html/nan/index.html

vim /usr/local/nginx/conf/nginx.conf

server_name   www.yuji.com;
access_log   logs/www.wt.access.log;
 root   /var/www/html/wt;
server_name   www.nan.com;
access_log   logs/www.nan.access.log;
root   /var/www/html/nan;

http {
server {
            listen   80;
            server_name   www.wt.com;
            charset   utf-8;
            access_log   logs/www.wt.access.log;
            location / {
                   root   /var/www/html/yuji;
                   index   index.html   index.php;
            }
            error_page   500 502 503 504 /50x.html;
            location = 50x.html {
                  root   html;
            }
       }

       server {
            listen   80;
            server_name   www.nan.com;    
            charset   utf-8;
            access_log   logs/www.nan.access.log;  
            location / {
                   root   /var/www/html/nan;  
                   index   index.html   index.php;
            }
            error_page   500 502 503 504 /50x.html;
            location = 50x.html {
                  root   html;
            }
       }
 }

重启服务,访问测试
nginx -t 
systemctl restart nginx


三、基于ip地址的nginx虚拟主机
设置临时ip,以达到一台服务器拥有多个ip地址,不同ip访问不同的服务页面
ifconfig ens33:0 192.168.92.30/24

修改配置文件,之后重启服务,访问测试
vim /usr/local/nginx/conf/nginx.conf

listen   192.168.92.30:80;
access_log   logs/www.wt.access.log;
root   /var/www/html/wt;
listen   192.168.92.30:80; 
access_log   logs/www.nan.access.log; 
root   /var/www/html/nan; 

nginx -t
systemctl restart nginx


四。基于端口的nginx虚拟主机
vim /usr/local/nginx/conf/nginx.conf
listen   192.168.72.10:666;
access_log   logs/www.yuji.access.log;
root   /var/www/html/yuji; 

listen   192.168.72.10:888;
 access_log   logs/www.nant.access.log;
root   /var/www/html/nan;

nginx -t 
systemctl restart nginx


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自己动手写CPU——第二篇

1 ori指令说明 ori是进行逻辑 或 运算的指令&#xff0c;其指令格式如下所示 从以上的指令格式&#xff0c;我们可以直到&#xff0c;这是一个I类型指令&#xff0c;ori指令的指令码是 6‘b001101&#xff0c;所以当处理器发现正在处理的指令的高6bit 是 001101 的时候&#x…

vue3 css相关知识与动态style

scoped 当 <style> 标签带有 scoped attribute 的时候&#xff0c;它的 CSS 只会影响当前组件的元素&#xff0c;和 Shadow DOM 中的样式封装类似。 <style scoped lang"scss"> </style> 注意 &#xff1a; 作用域样式并没有消除对 class 的需求…

DN-DETR源码学习记录

DN-DETR是在DAB-DETR的基础上完成的&#xff0c;DN-DETR的作者认为导致DETR类模型收敛慢的原因在于匈牙利匹配所导致的二义性&#xff0c;即匈牙利算法匹配的离散性和模型训练的随机性&#xff0c;导致ground-truth的匹配变成了一个动态的、不稳定的过程。举个例子&#xff0c;…

字节青训营(前端)打卡day01_计网

计算机网络概论 1.前沿和课程介绍 自顶向下、自底向上 网络分层、网络协议、网络应用、HTTP123、CDN GPT. 计算机网络的发展历程可以分为四个阶段&#xff1a;单机、局域网、广域网、互联网 2.蟹堡王帝国 顾客&#xff1a;客户端 分店&#xff1a;服务端 小区转发点&…

【FFmpeg】编码器流程分析

目录1 编译2 调用关系2.1 第一帧没有获取到码流&#xff0c;第二帧获取到一帧码流2.2 送帧为NULL&#xff0c;刷新编码器获取剩余的全部码流3 总结4 感受1 编译 参考文件doc/examples/encode_video.c&#xff0c;使用x264作为编码器&#xff0c;需要先安装x264&#xff0c;编译…

如何用ChatGPT写毕业论文?

老早之前就听说有同学用ChatGPT写论文了 但是一直不觉得人工智能够真的替代人类 正好最近毕业论文开始降重了&#xff0c;超高的重复率愁得我快睡不着了 刷微博突然看到这个有关ChatGPT的问题。 出于好奇的我决定先来试试这个ChatGPT到底能不能帮我解决降重问题哈哈哈 点击…

shell脚本基础之处理脚本输入

处理输入命令行参数读取参数读取脚本名测试参数特殊参数变量参数统计获取所有参数移动变量处理选项查找选项处理简单选项分离选项和参数处理带值的选项getopt 命令命令格式在脚本中使用getoptgetopts命令脚本选项标准化获取用户的输入基本的读取超时隐藏式读取文件中读取在此之…

Linux命令·ifconfig

许多windows非常熟悉ipconfig命令行工具&#xff0c;它被用来获取网络接口配置信息并对此进行修改。Linux系统拥有一个类似的工具&#xff0c;也就是ifconfig(interfaces config)。通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使…

OpenFeign#1 - FeignClient 是如何注册的?

文章目录EnableFeignClientsFeignClientsRegistrarregisterDefaultConfigurationregisterFeignClientsFeignClientFeignClientFactoryBeanFeignContextfeign(FeignContext)EnableFeignClients 该注解会导致 FeignClientsRegistrar 的注入. Retention(RetentionPolicy.RUNTIME…

Redis AOF

一、Redis AOF 1.简介 目前&#xff0c;redis的持久化主要应用AOF(Append Only File)和RDB两大机制。AOF以日志的形式来记录每个写操作(增量保存),将redis执行过的所有写指令全部记录下来(读操作不记录)。只许追加文件&#xff0c;但不可以改写文件。redis启动之初会读取该文…

自动化测试学习(七)-正则表达式,你真的会用吗?

目录 一、正则表达式在python中如何使用 二、用正则表达式匹配更多模式 三、常用字符分类的缩写代码 总结 所谓正则表达式&#xff08;regex&#xff09;&#xff0c;就是一种模式匹配&#xff0c;学会用正则匹配&#xff0c;就可以达到事半功倍的效果。 一、正则表达式在…

工程管理系统软件 自主研发,工程行业适用

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

在 Web3 里如何寻找靠谱的创新路径——Solv V3 阶段性复盘(上)

作者&#xff1a;Solv 核心团队Solv V3 是 3 月 21 日发布的&#xff0c;到这周一整整三个星期。三周时间产生的实际交易额超过 6,000 万美元&#xff0c;预计在本月内能够破亿。而且从我们手上的 pipeline 来看&#xff0c;这个增长的势头还将持续下去。在几个月内&#xff0c…

「Long HK, Long Crypto」主题酒会在香港圆满举行!Web3er齐聚一堂共叙行业发展

「2023 香港 Web3 嘉年华」是香港有史以来规模最大的加密货币活动之一&#xff0c;邀请了300多位行业领袖、区块链项目创始人、投资人、监管机构代表、专家学者&#xff0c;为每一位参与者带来前沿的 Web3 技术&#xff0c;共同探讨 Web3 未来发展的关键问题。 Web3相关的各大…

OpenCV实战(19)——特征描述符

OpenCV实战&#xff08;19&#xff09;——特征描述符0. 前言1. 特征描述符2. 提升匹配集质量2.1 交叉检查匹配2.2 比率测试2.3 距离阈值3. 完整代码小结系列链接0. 前言 SURF 和 SIFT 关键点检测算法为每个检测到的特征计算位置、方向和比例&#xff0c;比例因子信息可用于定…

RestClient查询文档

文章目录1、RestClient查询文档----快速入门2、查询文档--match、term、range、bool3、查询文档-排序和分页4、高亮1、RestClient查询文档----快速入门 基本步骤 1.先创建SearchRequest对象&#xff0c;调用source方法&#xff08;DSL&#xff09;——>相当于红框内的大jso…

最前端|什么是低代码?与传统开发的区别是什么?

目录一、低代码介绍二、背景趋势三、低代码与传统代码开发&#xff08;一&#xff09;低代码能否替代传统开发低代码页面传统开发页面&#xff08;二&#xff09;相同业务不同方式对比1.低代码开发&#xff08;1&#xff09;优点&#xff08;2&#xff09;缺点2.传统代码开发&a…

实现一个登录功能方案设计2

需求MySQL表实现方案index页面home页面需求 实现一个登录功能 实现的功能 注册(邮箱注册)登录(邮箱密码)重置密码查看操作记录(登录, 注册, 重置密码, 登出. 都算操作)登出在第一版的基础上进行优化:\ 优化点: 存操作信息请求的post使用中间件进行储存操作信息.避免重复代码 因…

【面试】如何设计SaaS产品的数据权限?

文章目录前言数据权限是什么&#xff1f;设计原则整体方案RBAC模型怎么控制数据权限&#xff1f;1. 数据范围权限控制2. 业务对象操作权限控制3. 业务对象字段权限控制总结前言 一套系统的权限可以分为两类&#xff0c;数据权限和功能权限&#xff0c;今天我们从以下几个点&am…

阿里云服务器安装宝塔面板搭建网站全流程(一步步详解)

阿里云服务器安装宝塔面板教程&#xff0c;云服务器吧以阿里云Linux系统云服务器安装宝塔Linux面板为例&#xff0c;先配置云服务器安全组开放宝塔所需端口8888、888、80、443、20和21端口&#xff0c;然后执行安装宝塔面板命令脚本&#xff0c;最后登录宝塔后台安装LNMP&#…