Linux学习笔记:网站服务
目录
网站服务概念介绍
网站服务部署方式
第一种方式:利用yum方式安装
第二种方式:利用rpm方式安装
第三种方式:编译安装程序
第四种方式:二进制包方式安装程序(绿色方式安装软件)
nginx程序安装
方式一:yum安装软件程序
方式二:采用编译方式安装
启动服务程序:进行测试
方式一:yum安装软件启动服务
方式二:编译安装需要使用命令脚本
网站服务目录结构
配置文件所在目录
站点目录所在位置
网站日志文件保存目录
网站服务配置介绍
主配置文件
扩展配置文件
网站服务企业应用
静态代码发布
数据共享存储功能
网站服务安全访问
网站服务状态监控
网站服务日志信息
error.log:错误日志
access.log:访问日志
网站服务LNMP架构
LNMP介绍
网站架构工作原理
LNMP部署
系统准备
PHP部署(yum方式)
数据库安装部署
将LNMP架构进行串联
网站服务动态资源发布
网站服务概念介绍
网站服务
【待】
网站服务处理请求方式
方式一: 静态方式进行处理 效应效率快
客户端浏览器 请求什么数据,响应什么数据
方法二: 动态方式进行处理 更完善数据响应
客户端浏览器 请求什么数据,将请求数据进行一定处理,再讲数据进行响应
网站服务部署方式
Linux系统中,静态网站服务nginx软件的安装方法有以下四种:
第一种方式:利用yum方式安装
(Ubuntu系统用apt-get命令)
特点:
- 需要连接外网
- 软件下载并安装
- 可以解决软件依赖
语法:
yum install -y nginx //用yum方法下载并安装nginx。-y表示确认。 yum reinstall -y nginx //重新安装 yum remov 或 erase nginx //删除软件包(慎用!因为可能有其他软件依赖于它) yum search 或 provides xxx //xxx是命令信息或文件信息,用于获取软件包名称信息或验证软件包在yum平台中是否存在
第二种方式:利用rpm方式安装
特点:
- 无法解决依赖问题
- 可以不用连接外网
需要准备rpm工具,可以用以下命令查看系统是否已有此程序:
rpm -qa lrzsz //查看系统中是否有此程序 lrzsz-0.12.20-36.el7.x86_64 //表示系统中已有此程序及其版本信息
步骤1:需要下载好软件程序包
从官网下载软件包,软件包建议下载Stable version稳定版。
nginx官网下载页面: http://nginx.org/en/download.html
步骤2:将下载好的程序包放入到系统中
Windows系统使用rz上传、sz下载:
在Linux系统中进入设定好的路径,将下载好的程序包拉进终端窗口中(命令行显示为:rz -E ),也可以用命令方法进行: rz -y //然后选择下载好的程序包上传加载到Linux中 //PS:从Linux系统中下载文件到本地可以用以下命令: sz -y 文件
Mac系统使用scp上传下载:
从Mac上传文件到虚拟机(在物理机终端上操作): scp Mac上待上传的文件绝对路径/文件 root@虚拟机地址:虚拟机路径/文件名 例: scp /Users/test/Desktop/123.txt root@10.0.0.200:/root/123.txt 从虚拟机下载文件到Mac: scp root@虚拟机地址:虚拟机路径/文件名 Mac绝对路径/文件 例: scp root@10.0.0.200:/root/123.txt /Users/test/Desktop/123.txt
步骤3:安装软件程序
语法:
rpm 参数 //安装程序包.rpm,参数一般用 -ivh
参数说明:
- i --- 表示安装指定程序包
- v --- 显示程序安装过程
- h --- 显示的过程信息尽量人类可读
安装完之后,我们需要验证一下是否安装成功:
rpm -qa //用于查看软件包是否安装 rpm -ql //查看某一个软件程序安装部署了哪些信息
第三种方式:编译安装程序
特点:
- 无法解决依赖问题
- 可以不用连接外网
- 可以定制化安装软件程序(最大的特点)
步骤1:需要下载好程序包(压缩包)/解压程序包
步骤2:进入到解压后的程序目录
步骤3:进行软件部署配置过程:自定义开启需要的功能,可以指定程序保存目录
步骤4:编译过程(软件程序代码信息翻译后让系统识别代码)
步骤5:编译安装过程
详见以下nginx安装实例。
第四种方式:二进制包方式安装程序(绿色方式安装软件)
特点:
- 安装部署过程方便
- 无法解决依赖问题
- 无需连接外网环境
这种方式没有安装过程,直接把软件包解压即可使用。
nginx程序的安装
——第一种方式:yum安装软件程序——
语法:
yum install -y nginx
此种方式需有网络,并先优化yum下载源,建议采用国内的阿里云平台:
网站:
https://developer.aliyun.com/mirror/centos
https://developer.aliyun.com/mirror/epel
优化yum下载源参考命令:
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
——第二种方式:采用编译方式安装——
步骤1:下载软件程序源码包
从官网(http://nginx.org/download/)选 Stable version稳定版下载。
步骤2:需要解决软件依赖问题
yum install -y pcre-devel openssl-devel //建议依赖包加上"-devel"以区分
步骤3:解压软件程序/进行配置过程
解压:tar xf nginx-1.18.0.tar.gz
进入目录:cd nginx-1.18.0/ 查看配置帮助信息:./configure --help
配置语法:./configure 参数
一些常用参数:
--prefix=目录:指定安装程序数据保存目录 --user=USER:管理服务进程用户(虚拟用户)信息。(虚拟用户:useradd -M -s /sbin/nologin nginx 用户不存在的可创建) --with-http_ssl_module:表示开启了https访问功能 --with-http_stub_status_module:表示开启nginx服务状态监控功能
【注:with为开启服务,without是关闭服务,可关闭没用的功能,节省资源】
步骤4: 编译过程:直接输入make命令执行
make
步骤5: 编译安装:直接输入make install命令执行
make install //步骤4和步骤5两个命令可以连写成:make && make install
nginx启动服务程序:进行测试
方式一:yum安装软件启动服务
启动:systemctl start nginx 查看进程:ps -ef|grep nginx 停止:systemctl stop nginx
方式二:编译安装需要使用命令脚本
启动文件夹下的命令启动程序:/app/nginx/sbin/nginx 【如需启用直接命令行,就将文件放在系统bin或sbin文件夹下】 或在文件夹下 启动:./nginx 停止:./nginx -s stop 启动后重载:./nginx -s reload
服务是否成功启动的验证:
一、系统安全优化做好:
关闭防火墙:systemctl stop firewalld
关闭selinux安全策略:setenforce 0
二、打开浏览器,输入服务器的地址,能够看到类似Welcome的页面,就是服务部署成功了。
注:浏览器尽量不要选择使用edge(win10),建议使用谷歌、火狐等。
网站服务启动之后,无法访问页面的排查方法:
1)确认服务运行状态:查看进程 2)确认服务网络配置 ping 10.0.0.100 telnet 10.0.0.100 80 //连接80端品,返回Connection established则为成功。 3)可以在命令行测试页面 curl -I 10.0.0.100 //参数-I,看结果HTTP状态码为200 OK的为成功。
网站服务目录结构
配置文件所在目录
--- yum安装软件配置目录:/etc/nginx
关注文件:nginx.conf,conf.d/xxx.conf(扩展配置文件)
--- 编译安装软件配置目录:/app/nginx/conf/
关注文件:nginx.conf
站点目录所在位置
网站重要文件图片、音频、视频、代码文件等存放位置
--- 默认网站站点目录:/usr/share/nginx/html/
可以自定义目录,要规划好,且需修改配置文件。
网站日志文件保存目录
--- 默认程序日志文件路径:/var/log/nginx
tail -f /var/log/nginx/access.log //查看访问日志最新内容 tail -f /var/log/nginx/error.log //查看错误文件最新内容
网站服务配置文件介绍
主配置文件
nginx主配置文件路径:/etc/nginx/nginx.conf
配置文件区域概念:
- 主区域:一些服务运行优化配置信息
- evants区域:一些服务运行优化参数信息
- HTTP区域:配置网站服务功能指令
- server区域:针对不同网站功能指令
- location区域:针对不同页面功能配置
【官方帮助文件档:http://nginx.org/en/docs/dirindex.html】
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; //指定nginx服务worker进程管理用户信息。
【查看进程命令:ps -ef|grep nginx】
root 27435 1 0 10:49 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 27436 27435 0 10:49 ? 00:00:00 nginx: worker process
master --- boss 法人 === 服务主进程 控制服务运行状态
worker --- 公司员工 === 服务工作进程 处理网站服务任务
worker_processes auto; //指定worker进程数量,auto为自动识别设置,worker进程数量根据服务器硬件环境来定义:worker进程数量 (建议)== 服务器CPU总的核心数 == 并行处理任务能力
error_log /var/log/nginx/error.log; //定义错误日志文件保存路径 pid /run/nginx.pid; //定义进程编号文件保存路径,记录服务编号。早期作用:判断服务是否启动或关闭。如果某一服务未能正常启动,可查看此文件是否已有记录。
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; //表示加载扩展配置文件信息 events { worker_connections 1024; //每个worker进程可以承载的连接数。总的服务连接数=worker进程数量*单个进程连接数。 } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; //定义访问网站日志格式信息 access_log /var/log/nginx/access.log main; //定义访问网站日志保存路径 sendfile on; //网站优化相关,表示开启文件高效传输模式 tcp_nopush on; //网站优化相关 tcp_nodelay on; //网站优化相关 keepalive_timeout 65; //表示TCP长连接会话保持时间信息 //TCP长链接:一次链接,发送多个数据请求信息 但链路出现空闲时,会有时间倒计时算法 保证链路利用率
//TCP短链接:一次链接,发送一次数据请求信息 通讯效率会较低/ 节省通讯资源
types_hash_max_size 2048; include /etc/nginx/mime.types; //需要加载的媒体资源类型文件 default_type application/octet-stream; //未知文件类型的处理方式,会直接下载。 # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; //需要加载的不同网站服务扩展文件 server { //详见下面扩展配置文件 listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } # Settings for a TLS enabled server. # # server { # listen 443 ssl http2 default_server; # listen [::]:443 ssl http2 default_server; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # location / { # } # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } }
扩展配置文件
配置文件路径:/etc/nginx/conf.d/xxx.conf
可以有多个扩展配置文件,网站中有www.test.com, bbs.test.com, blog.test.com等,以www.conf文件为例: server{ listen 80 default_server; //指定服务监听端口信息,多个配置文件中只能有一个默认服务 server_name www.test.com; //指定网站域名信息,只有一个网站的可不写 root /usr/share/nginx/html; //指定服务站点目录,可自己部署,如:/html/test; index index.html; //指定首页文件信息,可换。用户访问网站时,若无具体要求,则默认显示的页面。 } 服务启动时报错,八九成是配置文件有问题,要检查配置文件语法:nginx -t
通过物理机进行本地测试,需在本地hosts文中加入dns解析配置信息:
10.0.0.200 www.test.com bbs.test.com blog.test.com
网站服务企业应用
静态代码发布
步骤1:上传代码,放入站点目录下
开源网站参考:github,gitee
步骤2:解压
方式一:tar xvf 代码包
方式二:unzip 代码包
步骤3:测试
本地测试要在本地hosts配置好DNS信息。以下Windows为例:
C:\Windows\System32\drivers\etc\hosts
10.0.0.200 www.test.com
数据共享存储功能
步骤1:创建共享目录,存储共享数据
mkdir /html/share
//可以将文件分类放在不同目录下,设置不同的权限,供不同的人看。
步骤2:编写共享网站配置信息:share.conf 配置文件
server{ listen 80; //端口设置为80端口
server_name share.test.com; //设置服务器名
root /html/share/; //设置站点目录 autoindex on; //去掉首页index行,加入自动列表设置,on为开启状态 charset utf-8; //设置字符集为utf-8
}
步骤3:重启nginx服务并查看
systemctl restart nginx. //重启nginx服务
share.test.com //在浏览器中进入设置的站点即可查看
(注意,需要预先在物理机本地hosts文件中做好解析配置)
网站服务安全访问
——可以根据用户地址信息进行访问控制——
步骤1:编写配置文件,设置访问控制策略。
server{ ...; location /目录/ { //指定操作的页面 allow 10.0.0.1; //允许此地址的用户访问 allow 10.0.0.0/24; //允许此网段的用户访问,10.0.0.1。。。10.0.0.254均能访问 deny all; //拒绝其他所有用户访问 }
}
【PS:IP地址规划:根据业务部门规划ip地址。】
例:总经理办公室:192.168.10.0/24
审计部门:192.168.11.0/24
运营部门:192.168.12.0/24
步骤2:进行访问测试:拒绝访问会显示403错误状态码。
——设置用户登录信息进行访问控制——
步骤1:编写配置文件
server{ ...;
location /目录/ { //子目录 auth_basic "登录认证说明"; //开启认证功能 auth_basic_user_file /目录/密码文件; //指定加载用户密码文件 }
}
步骤2:生成密码文件
采用不可逆算法,将明文生成密文,可以安装以下工具:
yum install -y httpd-tools //安装工具 htpasswd -c /目录/保存密码的文件 用户名 //创建用户名和密码,密码文件已有则无需加参数-c
步骤3:进行认证测试访问
1.重启服务:systemctl restart nginx
2.清除浏览器缓存再进行测试
网站服务状态监控
用最基本的方式监控dos、doss攻击
步骤1:在配置文件开启监控状态平台功能
server { listen 80; server_name www.test.com; root /html/www; index index.html; location /status/ { //指定访问页面 stub_status; //开启监控平台页面 } }
步骤2:进入站点查看监控信息
重启服务:systemctl restart nginx
打开浏览器进入站点:www.test.com/status/ 即可出现监控信息
步骤3:监控信息解读
监控页面信息: Active connections: 2 server accepts handled requests 2 2 3 Reading: 0 Writing: 1 Waiting: 1 解读: Active connections: 此时激活连接数信息,并发连接数信息 ****** accepts: 接收建立连接总的数量 handled: 处理连接请求总的数量 PS:通常情况 accpts == handled 服务器建立连接最大值 1000 请求建立连接 2000 accepts > handled 1000 requests:请求包总的数量
网站服务日志信息
error.log:记录网站服务运行或者访问过程中错误信息
【待续】
access.log:记录访问者的访问信息
tail -f /var/log/nginx/access.log //查看access.log日志信息最新内容,退出:ctl+c,日志信息格式如下:
10.0.0.1 - - [29/Sep/2020:15:03:56 +0800] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Safari%E6%B5%8F%E8%A7%88%E5%99%A8/15609.3.5.1.3 CFNetwork/1128.0.1 Darwin/19.6.0 (x86_64)" "-"
10.0.0.1:记录客户端IP地址
--:记录认证登录用户信息
[29/Sep/2020:15:03:56 +0800]:客户端访问网站时间信息
"GET /favicon.ico HTTP/1.1":获取访问网站的请求方法和资源【和安全有关,小心GET以外的方法】
404:服务状态码信息。200表示正常,常见的还有,301永久重定向、4XX表示请求出错、5XX服务器内部错误
153:访问过程传送字节数,单位为byte
"-":记录访问此页面是通过哪个网站进行引流转发的
"Safari...":记录客户端操作系统、浏览器版本、浏览器内核等信息
小知识:
在站点目录中加入网站图标,并改名为"favicon.ico"可以在客户浏览此站点时,在浏览器上显示此图标。
有专门的日志分析工具,可直观分析日志信息。
网站服务LNMP架构
LNMP介绍
LNMP:Linux Nginx MySQL PHP
【待】
网站架构工作原理
步骤1:用户发出访问网站服务请求
步骤2:网站服务端会接收请求,并判断请求资源信息
静态资源信息——由nginx静态网站服务进行处理,将站点目录中资源信息进行传输
动态资源信息——由nginx利用fastcgi接口,将动态访问信息转发给PHP服务
步骤3:PHP服务接收到动态资源访问请求
方式一:直接识别动态资源代码文件,进行翻译或解析,转换成HTML代码信息
方式二:需要和数据库建立连接,读取数据或存储数据信息,再将PHP代码翻译为HTML代码,进行响应
步骤4:nginx服务接收到PHP响应HTML静态资源代码信息,会转发客户端浏览器
步骤5:客户端浏览器识别HTML代码信息,加载显示网站页面
LNMP部署
——系统准备——
Linux: 系统中,/tmp/的目录权限是否是1777(1为t权限)。某些程序运行过程中需要产生临时文件,需要对tmp目录有写入权限。 系统安全优化 yum优化 Nginx: 确认好nginx站点目录权限755,属主权限设置为worker 确认好Nginx服务配置信息,并进行语法检查:nginx -t
——PHP部署(yum方式)——
【编译安装方式可参考:https://www.cnblogs.com/ksy-c/p/12785238.html 】
步骤1:确认系统是否已经存在了PHP相关程序,有则删除,避免冲突。
rpm -qa|grep php* //查看是否有PHP相关程序 yum remove -y hph-xxx //删除PHP相关程序,如php-cli、php-fpm等
步骤2:更新PHP软件下载源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
【查看yum源:ll /etc/yum.repos.d/】
步骤3:PHP程序相关软件下载安装
yum install -y php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
【这里用 php71w 版本,可以选择其他版本,如 php72w 】
步骤4:启动服务的检查
systemctl start php-fpm //启动服务 ps -ef|grep php //查看服务进程信息 netstat -lntup //查看服务端口信息
systemctl stop php-fpm //停止服务
知识扩展1:
TCP:传输控制协议 面向连接的网络协议
特点:可以保证数据传输的可靠性
用途:HTTP访问网站页面、FTP、邮件服务
UDP:用户报文协议 无连接网络协议
特点:可以保证数据传输效率
用途:DNS解析、视频通讯、语音通讯
知识扩展2:
netstat -lntup命令参数解释:
-l:列表显示端口和服务进程信息
-n:以数字方式显示信息
-t:显示tcp信息的端口和服务进程信息
-u:显示udp信息的端口和服务进程信息
-p:显示服务进程信息
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1687/php-fpm: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1968/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1311/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1490/master
tcp6 0 0 :::80 :::* LISTEN 1968/nginx: master
tcp6 0 0 :::22 :::* LISTEN 1311/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1490/master
——数据库安装部署——
【这里用MariaDB数据库代替MySQL进行部署】
步骤1:直接用yum方法安装
yum install -y mariadb mariadb-server //mariadb为工具包,操作管理数据库
//mariadb-server为服务端,用户通过网络访问数据库的服务
步骤2:启动数据库程序并简单配置
systemctl start mariadb //启动数据库服务 mysqladnin -uroot password xxx //为root用户设置密码xxx mysql -uroot -pxxx //连接数据库 drop databases test; //没用的库比如test要删掉 select user, host from mysql.user; //查看操作数据库的用户 delete from user where user=""; //删除无用的数据库用户信息
exit 或 quit //退出数据库
将LNMP架构进行串联
步骤1:让nginx和php进行串联:编写nginx配置文件
server { listen 80 default_server; server_name bbs.test.com; root /html/bbs; index index.php index.html; location ~ \.php$ { //匹配客户端访问php动态资源信息,【~区分大小写,~*不区分大小写,\为转义符号】 fastcgi_pass 127.0.0.1:9000; //将动态资源请求抛送给后端PHP程序,Python用uwsgi_pass方法 root /html/bbs; //告知PHP程序,默认资源信息保存目录 fastcgi_index index.php; //默认处理的index.php首页文件,需在站点目录下有此文件 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;//把请求信息更精准地告诉后端 include fastcgi_params; } }
步骤2:在站点目录中创建php动态代码文件,重启nginx和php-fpm服务
<?php phpinfo(); ?> //php动态代码文件
systemctl restart nginx //重启nginx服务
systemctl start php-fpm //启动php-fpm服务
bbs.test.com/xxx.php //在浏览器中查看站点页面
步骤3:php和数据库进行串联
在站点目录中创建php文件,利用php代码进行串联:
<?php $servername = "localhost"; //服务器名,数据库在同一台主机上用localhost $username = "root"; //用户名 $password = "123456"; //密码 $conn = mysqli_connect($servername, $username, $password); if ($conn) { echo "mysql successful by root !\n"; //连接成功 }else{ die("Connection failed: " . mysqli_connect_error()); //连接失败+错误信息 } ?>
网站服务动态资源发布
步骤1:获取网站动态资源代码,上传解压
//省略,详见上文介绍。这里以 Discuz_X3.4_SC_UTF8【20200818】为例。
步骤2:进行网站初始化(针对从开源网站获取的代码)
一、修改配置文件:/etc/php.ini,改动配置文件后需要重启服务:systemctl restart php-fpm 二、站点特定目录的权限调整
1.更改config目录属主属组给apache:chown -R apache.apache config/
nginx和apache两个在一起,一般建议将工作进程用户都统一归一个管:
改/etc/nginx/nginx.conf配置文件中的user为apache【建议】
或者在/etc/php-fpm.d/www.conf配置文件中改user为nginx
2.更改data目录属主属组给apache:chown -R apache.apache data/
3.更改uc_client目录属主属组给apache:chown -R apache.apache uc_client/
4.更改uc_server目录属主属组给apache:chown -R apache.apache uc_server/
三、选择全新安装
四、数据库信息设置
填写数据库信息 数据库服务器: //数据库服务器地址, 一般为 localhost 数据库名: //需预先在数据库中创建 数据库用户名: 数据库密码: 数据表前缀: //同一数据库运行多个论坛时,请修改前缀(数据库名) 系统信箱 Email: //用于发送程序错误报告或有其他问题时联系到网站管理人员 填写管理员信息 管理员账号: 管理员密码: //管理员密码不能为空 重复密码: 管理员 Email:
在点击下一步前,需要在数据库中创建相应的数据库并授权给用户:
create database bbs;
grant all on bbs.* to 'bbs'@'localhost' identified by '123456';
步骤3:测试访问
发贴时图片无法上传: 将以下目录属主属组给虚拟用户apache 站点目录bbs chown apache /var/lib/nginx/
【待】
【安全人员关注:是否有安全隐患,
数据库要防止不安全SQL注入
【待】

浙公网安备 33010602011771号