nginx基础
Nginx 简介
Nginx是 高性能Web服务器
- 静态资源服务器:html,css,js,img,视频,音频
- 反向代理:代理客户访问 **内部 **(本机、局域网的服务器)服务
- 负载均衡:将请求(流量)分发给集群中的多台服务器,避免单点压力过大
- 网站(后端API)入口:根据访问请求的路径参数,进行分发实现动静分离
- Nginx架构:多进程+单线程架构、适合多核处理器
- 一个Master进程,N个Work进程
- Master监控所有的Work进程,旧的Work进程终止时,随时可以启动新的进程
- Work进程使用单线程接受请求处理请求,避免了线程切换带来的消耗
- IO多路复用技术:异步非阻塞架构,同时处理更多的请求
- 异步非阻塞是“任务完成了通知你”,IO 多路复用是“同时盯多个任务,看谁先完成”—— 两者结合,就是高性能服务器的核心逻辑。
Nginx安装
- apt/yum安装
#乌班图安装
#方法1 apt安装
apt update
apt install nginx
#方法2 编译安装
## 安装依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
## 下载源码
wget http://192.168.57.200/Software/nginx-1.26.2.tar.gz
#wget http://nginx.org/download/nginx-latest.tar.gz
## 解压
tar -zxvf nginx-*.tar.gz
## 进入解压后的Nginx源码目录,执行配置脚本,并指定安装目录和其他选项
./configure --prefix=/usr/local/nginx --with-http_ssl_module
## 编译并安装
make && sudo make install
- 源码编译安装
Centos7安装
#第1.rpm包安装
yum -y install wget vim
# 下载nginx源
$ wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装nginx源
rpm -ivh nginx-*.rpm
# 正式安装nginx
yum -y install nginx
# 设置防火墙
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
# 启动nginx
systemctl start nginx
# 开机启动nginx
systemctl enable nginx
#第2种.编译安装
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
# nginx依赖pcre库
wget http://192.168.57.200/Software/pcre-8.45.tar.bz2
或者 wget http://downloads.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
#解压
tar -xvf pcre-8.45.tar.bz2
cd pcre-8.45/
./configure
#make 负责将源代码编译成可用的程序或库,而 make install 负责将编译好的软件部署到系统中合适的位置,以便用户能够方便地使用和调用。
make && make install
# 检验是否安装
pcre-config --version
# 下载编译nginx
cd ..
wget http://192.168.57.200/Software/nginx-1.21.4.tar.gz
tar -xvf nginx-1.21.4.tar.gz
cd nginx-1.21.4
./configure --with-http_stub_status_module --with-http_ssl_module --with-pcre=../pcre-8.45
make && make install
# 安装成功后直接执行nginx启动
/usr/local/nginx/sbin/nginx
nginx 的常用命令
- nginx 启动nginx
- nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
- nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。
- nginx -s reload 重新加载配置文件;因改变了Nginx相关配置,需要重新加载配置而重载。
- nginx -s reopen 重新打开日志文件。
- nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。
- nginx -t 不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
- nginx -v 显示 nginx 的版本。
- nginx -V 显示 nginx 的版本,编译器版本和配置参数。
使用系统服务管理工具管理nginx
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#重新启动加载配置
systemctl daemon-reload
systemctl reload nginx
Nginx基本配置
nginx.conf
-
全局配置块
#启动work进程的用户 user www-data; #启动worler进程的数量,auto 自动获取数量 worker_processes auto; #全局错误日志 error_lpg logs/error.log; #pid 进程号的路径 pid /run/nginx.pid;- events模块配置
#性能优化 events { use epoll; # 使用 epoll 事件模型(Linux) worker_connections 10240; # 每个 worker 最大连接数 multi_accept on; # 一次性接受所有新连接 accept_mutex on; # 启用连接接收互斥锁 }- http配置:所有HTTP请求与响应的配置
- sever配置:网站配置;可以配置多个(虚拟主机)
- location配置:网站路径配置
- sever配置:网站配置;可以配置多个(虚拟主机)
http { include /etc/nginx/mime.types; #引入加载外部模块,mime.types是文件格式; default_type application/octet-stream; #二进制流 MIME 类型,表示 “未知的二进制数据”。通常会将其视为 “需要下载的文件” #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 logs/access.log main; sendfile on; # 启用内核级文件传输,减少 CPU 消耗和延迟 tcp_nopush on; # 配合 sendfile,合并小包发送 keepalive_timeout 65; # 长连接超时时间 65 秒 #gzip on; # 启动压缩,节省带宽,省流量,但是会占用cpu资源 server { listen 80; #监听的端口 server_name localhost; #绑定域名,一台服务器可以使用多个域名 #charset koi8-r; #设置默认字符集 #access_log logs/host.access.log main; #设置独立的访问日志路径 location / { #设置网站的根路径 root html; #设置网站根目录对应的系统目录,默认nginx的安装路径下的html路径 index index.html index.htm; #指定首页的名称 } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } #location ~ .php$ { # proxy_pass http://127.0.0.1; #反向代理,将请求 #} } } -
搭建文件下载服务器
autoindex on;
#不显示文件大小
autoindex_exact_size off;
#显示文件时间
autoindex_localtime on;
虚拟主机
虚拟主机是指在同一台服务器上通过不同的标识(域名、IP、端口)托管多个网站的技术,实现 “一台服务器运行多个独立网站” 的效果。
- 基于IP的虚拟主机
- 给服务器配置多个IP地址
- 给每个网站绑定一个IP:192.168.25.25 -> A
# 临时给同一个网卡临时添加多个IP ,重启失效
ip addr add 192.168.25.35/24 dev ens33
ip addr add 192.168.25.36/24 dev ens33
ip addr add 192.168.25.37/24 dev ens33
#在nginx配置文件中新添加上对应的sever配置,一个IP对应一个sever块
server {
#ip地址+端口号
listen 192.168.25.35:80;
server_name 192.168.25.35;
location / {
#设置网站根目录对应的系统目录,手动创建好我们设置的目录,并加上.html文件
root /data/html1;
index index.html index.htm index.php;
}
}
#检测配置
nginx -t
#重启nginx
nginx -s -stop
nginx
#在浏览器进行测试
- 基于域名的虚拟主机
- IP只有一个,但绑定多个域名,每个域名对应一个独立的站点
#先配置windows的域名配置
1.先以管理员的身份打开记事本
2.打开/c盘/Windows/System32/drivers/etc/
3.查看所有文件(包括影藏文件)
4.打开hosts
#增加内容
192.168.25.201 www.ll.com
192.168.25.201 ccc.ll.com
192.168.25.201 zzz.ll.com
#在配置文件中修改sever块中的域名
#只需要修改域名
server_name www.ll.com ;
server_name ccc.ll.com ;
server_name zzz.ll.com ;
#检测配置
nginx -t
#重启nginx
nginx -s -stop
nginx
#在浏览器进行测试
#测试没问题记得把hosts记事本新添加d内容删除
- 基于端口号的虚拟主机
- 配置多个端口,每个端口对应一个站点
#在配置文件中修改sever块中的端口号
#只需要修改端口号
listen 8081;
listen 8082;
listen 8083;
#检测配置
nginx -t
#重启nginx
nginx -s -stop
nginx
#在浏览器进行测试
日志配置
日志级别: debug > info > notice > warn > error > crit > alert > emerg
#access_log日志配置
#语法格式:
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
默认值 : access_log logs/access.log combined;
作用域 : http, server, location, if in location, limit_except
#log_format 定义日志格式
语法格式: log_format name [escape=default|json] string ...;
默认值 : log_format combined "...";
作用域 : http
日志常见的变量
$remote_addr,$http_x_forwarded_for记录客户端IP地址$remote_user记录客户端用户名称$request记录请求的URL和HTTP协议(GET,POST,DEL,等)$status记录请求状态$body_bytes_sent发送给客户端的字节数,不包括响应头的大小;该变量与Apache模块mod_log_config里的“%B”参数兼容。$bytes_sent发送给客户端的总字节数。$connection连接的序列号。$connection_requests当前通过一个连接获得的请求数量。$msec日志写入时间。单位为秒,精度是毫秒。$pipe如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。$http_referer记录从哪个页面链接访问过来的$http_user_agent记录客户端浏览器相关信息$request_length请求的长度(包括请求行,请求头和请求正文)。$request_time请求处理时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。$time_iso8601 ISO8601标准格式下的本地时间。$time_local通用日志格式下的本地时间。
站点路径配置 location
#语法
location [修饰符] 路径 {
# 配置内容
}
location url路径 {
#root /usr/var/www;
alias /usr/var/www;
index index.html;
}
- root 指定站点的“根”路径; URL访问到的真实目录是“网站根路径”+“url目录”
- /web1 -> /var/www/html/web1;
- alias 指定是路径本身
- /web2 -> /data/web2;
常用的修饰符
- 无修饰符:默认情况下使用前缀匹配。以该路径开头的路径都能匹配到;
=:精确匹配。只匹配指定的路径,不进行正则表达式或前缀匹配。
location = /login.html {
root /data/web1 ;
}
~:区分大小写的正则表达式匹配。
location ~ \.php$ {
proxy_pass http://php_server;
}
~*:不区分大小写的正则表达式匹配。
location ~* \.(jpg|jpeg|png|gif)$ {
root /var/www/images;
}
^~:前缀匹配,如果找到匹配项,将不再进行正则表达式匹配。
location ^~ /static/ {
root /var/www/static;
}
#匹配所有以/static/开头的路径,优先于正则表达式匹配。
匹配优先级
在Nginx中,location的匹配优先级如下:
- 精确匹配(
=):最高优先级。 - 前缀匹配(
^~):优先于正则表达式匹配。 - 正则表达式匹配(
~和~*):若有多个正则表达式匹配,则使用第一个匹配的规则。 - 前缀匹配(无修饰符):最低优先级。
重写和重定向
- rewrite重写
rewrite 是在服务器内部改变 URL,客户端不会察觉到 URL 的变化。rewrite 通常用于将一个 URL 模式匹配到另一个 URL 模式,而不改变浏览器中的 URL。
#语法:
rewrite 正则表达式 替换目标 [标志];
#示例:
location /oldpage {
rewrite ^/oldpage/(.*)$ /newpage/$1 last;
}
#访问oldpage时,页面会自动显示newpage的网页的内容,但网址显示的是oldpage
- return重定向
重定向是让客户端浏览器实际改变 URL。Nginx 返回一个 HTTP 状态码(通常是 301 永久重定向或 302 临时重定向),告诉客户端浏览器去请求一个新的 URL。
#案例
location /oldpage {
return 301 /newpage;
}
#当请求 /oldpage 时,Nginx 会返回一个 301 永久重定向状态码,告诉客户端浏览器去请求 /newpage。浏览器中的 URL 会改变为 /newpage。
重写与重定向的区别
- URL 是否改变:
- rewrite 重写:URL 不会在客户端浏览器中改变。
- return 重定向:URL 会在客户端浏览器中改变。
- HTTP 状态码:
- rewrite 重写:不涉及 HTTP 状态码。
- return 重定向:返回 301 或 302 状态码。
- 应用场景:
- rewrite 重写:常用于内部 URL 重写,比如将动态 URL 重写为静态 URL,或者将复杂的 URL 结构简化。
- return 重定向:常用于永久或临时改变 URL,比如网站改版后将旧 URL 重定向到新 URL。
http状态码
- 100 Continue:客户端发送请求头后,服务器允许继续发送请求体(需客户端显式请求)。
- 101 Switching Protocols:服务器同意客户端切换协议(如 HTTP 切换到 WebSocket)。
- 200 OK:请求成功(最常见,如正常返回网页内容)。
- 201 Created:请求成功且创建了新资源(如 POST 提交表单创建数据)。
- 204 No Content:请求成功,但无返回内容(如 DELETE 请求删除资源后)。
- 206 Partial Content:部分请求成功(如断点续传,客户端请求文件的一部分)。
- 301 Moved Permanently:资源永久迁移到新地址(Nginx 中通过
rewrite ... permanent;配置)。 - 302 Found:资源临时迁移(临时重定向,Nginx 默认
rewrite不带参数时返回 302)。 - 304 Not Modified:资源未修改,客户端可使用本地缓存(基于请求头
If-Modified-Since或If-None-Match)。 - 307 Temporary Redirect:临时重定向,严格保持请求方法(如 POST 请求重定向后仍用 POST)。
- 308 Permanent Redirect:永久重定向,严格保持请求方法(301 的升级版)。
- 400 Bad Request:请求格式错误(如请求头无效、参数格式不正确)。
- 401 Unauthorized:请求需要身份验证(如未登录访问受保护资源,配合
auth_basic模块)。 - 403 Forbidden:服务器拒绝请求(常见原因:权限不足、目录无索引文件且未开启
autoindex)。 - 404 Not Found:请求的资源不存在(如访问不存在的页面、文件路径错误)。
- 405 Method Not Allowed:请求方法不被允许(如用 POST 访问只支持 GET 的接口)。
- 408 Request Timeout:客户端请求超时(Nginx 可通过
client_body_timeout等配置控制)。 - 409 Conflict:请求与服务器资源冲突(如创建已存在的资源)。
- 413 Request Entity Too Large:请求体过大(Nginx 可通过
client_max_body_size限制)。 - 414 Request-URI Too Long:请求 URL 过长(超出服务器处理能力)。
- 429 Too Many Requests:客户端请求过于频繁(可通过 Nginx 限流模块
limit_req触发)。 - 500 Internal Server Error:服务器内部错误(如 Nginx 配置错误、后端程序崩溃)。
- 502 Bad Gateway:Nginx 作为反向代理时,后端服务器无响应或返回无效响应。
- 503 Service Unavailable:服务器暂时不可用(如维护中,可通过
return 503;主动返回)。 - 504 Gateway Timeout:反向代理时,后端服务器处理超时(可通过
proxy_read_timeout调整)。 - 505 HTTP Version Not Supported:服务器不支持请求的 HTTP 版本(如 HTTP/3.0)。
https 证书
- HTTPS = SSL\TLS + HTTP
- 用「数字证书」防冒充(确认对方是真的);
- 用「非对称加密」安全传 “钥匙”(避免钥匙被偷);
- 用「对称加密」快速传数据(保证数据跑得快又安全);
- 用「数字签名」防篡改(确认数据没被动手脚)
- CA证书:防止“中间人攻击”
- 中间人攻击的本质是 “两头冒充”(冒充你、冒充网站),而 CA 证书的作用就是给网站的 “身份” 和 “公钥” 做官方背书 —— 让你能通过浏览器确认:“我连的这个网站,确实是我想找的那个,不是中间人伪装的”。
- 对称加密、非对称加密
- 对称加密:加密解密都是一个钥匙,速度快,容易泄露;
- 非对称加密:公钥和私钥,一方加密,另一方解密;
生成证书
# 1.进入证书目录
cd /etc/nginx/sslkey
# 2.创建本地私有密钥
openssl genrsa -out ssl.key 2048
# 3.按提示输入即可
openssl req -new -key ssl.key -out ssl.csr
# 4.创建证书crt
openssl x509 -req -days 1460 -in ssl.csr -signkey ssl.key -out ssl.crt
# 5.创建证书pem
openssl dhparam -out ssl.pem 2048
nginx 配置证书
#在配置文件中添加修改以下内容
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
#修改到对应的路径
ssl_certificate /etc/nginx/sslkey/ssl.crt;
#修改到对应的路径
ssl_certificate_key /etc/nginx/sslkey/ssl.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!KRB5:!aECDH:!EDH+3DES;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
}
代理与反向代理
正向代理代理的是客户端,反向代理代理的服务端
正向代理:代理用户访问其他网站,比如ss,蓝灯。
反向代理:用来发布服务器,比如nginx
#在代理服务器上修改配置文件
#编辑配置文件中的location模块 绑定要代理的服务器IP
location / {
proxy_pass http://192.168.25.202; # 请求转向后台服务器
#反向代理优化设置(可选项)
proxy_set_header Host $host; # 修改请求头,添加Host字段
proxy_set_header X-Real-IP $remote_addr; # 修改请求头,添加X-Real-IP字段
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 修改请求头,添加X-Forwarded-For字段
client_max_body_size 10m; # 允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; # 缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; # nginx跟后端服务器连接超时时间\(代理连接超时\)
proxy_send_timeout 90; # 后端服务器数据回传时间\(代理发送超时\)
proxy_read_timeout 90; # 连接成功后,后端服务器响应时间\(代理接收超时\)
proxy_buffer_size 4k; # 设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; # proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; # 高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; # 设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
负载均衡
作为代理服务器,一般都需要向上游服务器的集群转发请求。这里的负载均衡是指选择一种策略,尽量把请求平均地分布到每一台上游服务器上。
负载均衡的模式(算法)
- 轮询(Round Robin)(RR)
- 这是 Nginx 的默认策略。它会按照顺序将请求依次分发给每个服务器,不考虑每个服务器的负载情况。这种方式简单有效,适合服务器性能相似的场景。
- 最少连接数(Least Connections)(LS)
- 负载均衡服务器会记录每台后端服务器的连接数,它会将请求分发给当前处理连接数最少的服务器,适合连接数波动较大的场景,如长连接服务。
- IP 哈希(IP Hash)
- 通过请求的客户端IP进行哈希运算,将来自同一IP地址的请求分发到同一台服务器上,适合有会话保持需求的场景。
- 权重(Weight)
- 为不同的服务器分配权重,Nginx 将根据设置的权重值来分发请求,权重越高的服务器将承担更多的流量,适合服务器性能不均衡的场景。“加权轮询”
upstream 块
upstream块设置集群的分组,便于反向代理中的 proxy_pass 使用。
##在代理服务器上修改配置文件
#1.轮询算法
#语法: upstream name {...} 配置块: http
upstream wbe1 {
server 192.168.25.202;
server 192.168.25.204;
}
server {
listen 80;
server_name 192.168.25.201;
location / {
proxy_pass http://web1;
}
}
#这样就可以通过访问201来实现反向代理202和204并实现负载均衡
#2.最小连接数算法
upstream wbe1 {
least_conn; #最小连接数
server 192.168.25.202;
server 192.168.25.204;
}
server {
listen 80;
server_name 192.168.25.201;
location / {
proxy_pass http://web1;
}
}
#3.ip_hash 算法
upstream wbe1 {
ip_hash; #ip哈希算法
server 192.168.25.202;
server 192.168.25.204;
}
server {
listen 80;
server_name 192.168.25.201;
location / {
proxy_pass http://web1;
}
}
#4.权重算法
upstream wbe1 {
server 192.168.25.202 weight=2;
server 192.168.25.204 weight=3;
}
server {.
listen 80;
server_name 192.168.25.201;
location / {
proxy_pass http://web1;
}
}
#其他配置向 加在ip后面
weight=number: 设置向这台上游服务器转发的权重,默认为1。
max_fails=number: 该选项与 fail_timeout 配合使用,指在 fail_timeout 时间段内,如果向当前的上游服务器转发失败次数超过 number,则认为在当前的 fail_timeout 时间段内这台上游服务器不可用。max fails 默认为1,如果设置为 0,则表示不检查失败次数。
fail_timeout=time: fail_timeout 表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能。它与向上游服务器建立连接的超时时间、读取上游服务器的响应超时时间等完全无关。fail_timeout 默认为10秒。
down: 表示所在的上游服务器永久下线
backup: 它表示所在的服务器只是备份服务器,只有在所有的非备份服务器都失效后,才会向所在的备份服务器转发请求。backup 在 ip_hash 下仍有作用,只是不参与正常的哈希分配逻辑。
优化配置
- 灰度发布
- 增量发布,逐步的用新版本替换旧版本,实现平稳过渡,新版本出现问题时,方便及时回滚。
- Nginx平滑升级
- 在不停止Nginx服务的情况下,更新Nginx版本。
- Worker进程数量和最大连接数
- gzip on
- 是否压缩,压缩可以节省带宽费用,降低传输时间,增加用户体验度。
- 长连接
- 减少服务器维护因为与客户端建立http连接产生的大量tcp三次握手四次断开的开销。
- 本地缓存静态文件
- 将部分数据缓存在用户本地磁盘,用户加载时,如果本地和服务器的数据一致,则从本地加载。提升用户访问速度,提升体验度。节省公司带宽成本。
访问控制
你可以使用
allow和deny指令来根据客户端的 IP 地址允许或拒绝访问。
#允许特定 IP,拒绝所有其他 IP
location /admin {
# 只允许特定IP地址访问 /admin
allow 192.168.1.100;
allow 10.0.0.0/24;
deny all;
}
#基于用户身份的访问控制 访问时需要登陆账号密码
#1. ubuntu 安装
#安装htpasswd
apt install apache2-utils
#2.创建账号密码文件
# 账号密码文件路径 用户名
htpasswd -c /etc/nginx/.htpasswd username
#3.修改配置文件
location /admin {
auth_basic "Restricted Access";
#路径写对
auth_basic_user_file /etc/nginx/.htpasswd;
}
# 基于用户代理的访问控制 阻止某些爬虫或恶意请求
location / {
if ($http_user_agent ~* "badbot|maliciousbot") {
return 403; # 返回 403 Forbidden
}
}
跨越配置
-
前后端分离:前端代码与后端代码,开发与部署是独立的。数据通过API接口进行传输。
-
解决跨越问题的方法
-
JSONP使用
<script>实现跨越,方法较老,不推荐使用; -
CORS,在请求头中设置,运行浏览器进行跨越;
location / { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; 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'; # ... } -
反向代理,将前后代理到同一个“域”下;域名、协议、端口相同;
- https://xxx.com/api/
-
LNMP环境搭建(单机版)
- Linux+Nginx+MySQL+PHP/Python/Prel
- PHP
- 优点:简单,学习成本低,开发成本低,开发网站特别高效;
- 缺点:功能较为单一,不擅长移动端开发;
- PHP
#1.关闭防火墙
sudo ufw disable
#2.安装Nginx
#乌班图安装
#方法1 apt安装
apt update
apt install nginx
#方法2 编译安装
## 安装依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
## 下载源码
wget http://192.168.57.200/Software/nginx-1.26.2.tar.gz
#wget http://nginx.org/download/nginx-latest.tar.gz
## 解压
tar -zxvf nginx-*.tar.gz
## 进入解压后的Nginx源码目录,执行配置脚本,并指定安装目录和其他选项
./configure --prefix=/usr/local/nginx --with-http_ssl_module
## 编译并安装
make && sudo make install
#3.安装并配置MySQL
使用脚本一件安装
#4.安装并配置PHP
#下载PHP与PHP-MySQL模块
sudo apt -y install php-fpm php-mysql
#检查版本
php -v
#5.修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
----------------
user www-data;
#在server{}内,找到index开头的配置行,在该行中添加index.php。
server {
listen 80;
server_name 192.168.25.201;
root html;
index index.php index.html index.htm ;
·····
#在server{}内找到location ~ \.php$ {},去除以下配置行的注释符号。
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 匹配 PHP 8.1 的监听地址
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
-------------------
#保存退出
#检查配置文件是否正确
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
#重启nginx
systemctl restart nginx
#6.配置php
#vim <网站根目录>/phpinfo.php
vim /usr/local/nginx/html/phpinfo.php
-----------------------
<?php echo phpinfo(); ?>
-----------------------
#保存退出
#启动php服务
systemctl start php8.1-fpm
#7.在浏览器测试
http://192.168.25.201/phpinfo.php
#查看是否是php配置信息页面,是的话表示LNMP环境部署成功
#8.成功搭建LNMP环境后,建议您删除phpinfo.php测试文件,消除数据泄露风险。
#sudo rm -rf <网站根目录>/phpinfo.php
第二种
#1.关闭防火墙
sudo ufw disable
#2.安装Nginx
#乌班图安装
#方法1 apt安装
apt update
apt install nginx
#方法2 编译安装
## 安装依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
## 下载源码
wget http://192.168.57.200/Software/nginx-1.26.2.tar.gz
#wget http://nginx.org/download/nginx-latest.tar.gz
## 解压
tar -zxvf nginx-*.tar.gz
## 进入解压后的Nginx源码目录,执行配置脚本,并指定安装目录和其他选项
./configure --prefix=/usr/local/nginx --with-http_ssl_module
## 编译并安装
make && sudo make install
#3.安装并配置MySQL
使用脚本一件安装
#4.安装并配置PHP
#下载PHP与PHP-MySQL模块
apt -y install php-fpm php-mysql php-xml
#改php的配置文件
vim /etc/php/8.1/fpm/pool.d/www.conf
#第37行
listen = 9000
#重启php
systemctl restart php8.1-fpm.service
#编辑nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
}
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
systemctl restart nginx
动静分离(简单分布式)
- Nginx网关
- NFS:文件共享,不同服务器之间的数据同步
- Nginx+静态资源
- PHP
- MySQL
为什么要做动静分离?
动态服务(PHP,JAVA,Python,GO)与静态服务(HTML,CSS,JS,图片,视频,音频)进行独立部署
-
提升性能:动态服务与静态服务互不干扰,降低服务器的负载(CPU,内存占用率);
-
方便扩容:
- 当并发量大量增加时,通过增加动态服务器来,负载均衡提升性能;
- 使用CDN(内容分发网络),加速静态资源的访问速度;
-
提升安全性:对动态服务器进行隔离,增加数据的安全性;
实验步骤
准备工作
服务器分配
| IP | 功能 | 软件 |
|---|---|---|
| 192.168.25.211 | 共享服务器 | NFS服务 |
| 192.168.25.212 | 网络入口,数据转发,静态文件 | Nginx服务 |
| 192.168.25.213 | 处理动态数据 | PHP-FPM+nfs客户端 |
| 192.168.25.214 | 图片服务器 | Nginx服务+nfs客户端 |
| 192.168.25.215 | 数据库服务 | MySQL服务,开启远程账号 |
二、配置详解
1.NFS服务器配置
IP: 192.168.25.211
# CentOS7安装NFS
yum -y install nfs-utils
# Ubuntu安装NFS
apt install -y nfs-kernel-server
# 创建共享目录
mkdir -p /app/blog
chown -R www-data:www-data /app/blog
chmod -R 755 /app/blog
# 修改共享配置
vim /etc/exports
# 只允许内网网段挂载,提高安全性。
/app/blog 192.168.25.0/24(rw,sync,root_squash,no_all_squash,no_subtree_check)
# 刷新 NFS 配置
exportfs -r
# Ubuntu 重启服务
systemctl restart nfs-kernel-server
systemctl enable nfs-kernel-server
# CentOS7 重启服务
sudo systemctl start rpcbind nfs-server
sudo systemctl enable rpcbind nfs-server
# 下载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
# 进入共享数据
chown -R www-data:www-data /app/blog
cd /app/blog
2.Nginx服务器配置
IP: 192.168.25.212
首先Nginx与PHP服务器都要挂载NFS。实现统一部署方便管理
# CentOS7安装依赖
yum install nfs-utils
# Ubuntu安装依赖依赖
apt install -y nfs-common
# 安装Nginx
## 安装依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
## 下载源码
wget http://192.168.57.200/Software/nginx-1.26.2.tar.gz
#wget http://nginx.org/download/nginx-latest.tar.gz
## 解压
tar -zxvf nginx-*.tar.gz
## 进入解压后的Nginx源码目录,执行配置脚本,并指定安装目录和其他选项
./configure --prefix=/usr/local/nginx --with-http_ssl_module
## 编译并安装
make && sudo make install
# 创建共享目录
mkdir -p /app/blog
# 将NFS的/app/blog挂载至本地的/app/blog
mount 192.168.25.211:/app/blog /app/blog
# 永久挂载:编辑 /etc/fstab,添加一行
echo "192.168.25.211:/app/blog /app/blog nfs defaults 0 0" >> /etc/fstab
# 验证挂载:mount -a (无报错则正常)
然后再配置Nginx
Nginx主要是server中的location的配置。配置location将.php结尾的交给PHP服务器。将.jpg、gif结尾的交给Image。其他配置按默认即可。
#修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 1. 日志路径:编译安装的 Nginx 日志默认存放在 /usr/local/nginx/logs
access_log /usr/local/nginx/logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# 2. mime.types 路径:编译安装的 Nginx 配置文件默认在 /usr/local/nginx/conf
include /usr/local/nginx/conf/mime.types;
default_type application/octet-stream;
# 3. 子配置文件引入路径:匹配编译安装的 conf.d 目录位置
include /usr/local/nginx/conf/conf.d/*.conf;
server {
listen 80 default_server;
server_name 192.168.25.212; # 可根据实际需求修改为服务器IP或域名
index index.php index.html;
# 4. 网站根目录:若 NFS 挂载点在 /usr/local/nginx 下(如 /usr/local/nginx/html/blog),需按实际挂载路径调整
# (注:若原 /app/blog 是 NFS 挂载点,需确保新路径已正确挂载 NFS,示例按 "NFS挂载到 /usr/local/nginx/html/blog" 调整)
root /app/blog;
# 5. 子配置文件引入:匹配编译安装的 default.d 目录位置
include /usr/local/nginx/conf/default.d/*.conf;
# 静态文件直接处理(补充:.css/.js/.ico 等)
location ~* \.(css|js|ico|txt|xml)$ {
expires 1d; # 缓存优化
}
# PHP 解析配置(保持 fastcgi_pass 等参数不变,仅确保 SCRIPT_FILENAME 与 root 路径一致)
location ~ \.php$ { # 用 ~ 而非 ~*(区分大小写,符合 PHP 规范)
fastcgi_pass 192.168.25.213:9000;
fastcgi_index index.php;
# 关键:SCRIPT_FILENAME 与 root 一致
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 图片请求转发(保持原配置不变,确保目标 Image 服务器 192.168.25.214 正常提供服务)
location ~* \.(jpg|jpeg|png|gif|webp)$ {
proxy_pass http://192.168.25.214;
proxy_set_header Host $host; # 传递主机头,避免图片服务器 404
}
# 7. 错误页面路径:匹配编译安装的 html 目录(默认存放错误页面的位置)
error_page 404 /404.html;
location = /40x.html {
root /usr/local/nginx/html; # 明确错误页面所在目录
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/nginx/html; # 明确错误页面所在目录
}
}
}
# 4. 重启 Nginx 并验证
/usr/local/nginx/sbin/nginx -t # 检查配置语法(必须无报错)
/usr/local/nginx/sbin/nginx -s reload
3.PHP服务器配置
IP: 192.168.25.213
# CentOS7安装依赖
yum install nfs-utils
# Ubuntu安装依赖 nfs客户端
apt install -y nfs-common
# 创建共享目录
mkdir -p /app/blog
# 将NFS的/app/blog挂载至本地的/app/blog
mount 192.168.25.211:/app/blog /app/blog
#永久挂载
echo "192.168.25.211:/app/blog /app/blog nfs defaults 0 0" >> /etc/fstab
mount -a
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 安装php
sudo apt update
sudo apt install php-fpm php-mysql
#编辑php配置文件
vim /etc/php/8.1/fpm/pool.d/www.conf
# 只写监听端口,即监听所有IP
listen = 9000
# 将这行注释,可以允许所有IP进行访问,否则只能本机访问。
; listen.allowed_clients = 127.0.0.1
user = www-data
group = www-data
# 启动 PHP 8.1-FPM 服务
sudo systemctl start php8.1-fpm
# 设置开机自启(可选,推荐)
sudo systemctl enable php8.1-fpm
# 查看服务状态,确认是否启动成功
sudo systemctl status php8.1-fpm
4.Image服务器配置
IP: 192.168.25.214
# CentOS7安装依赖
yum install nfs-utils
wget http://192.168.57.200/Software/nginx_install.sh
bash nginx_install.sh
# Ubuntu安装Nginx和nfs-common
sudo apt install nginx nfs-common -y
# 创建共享目录
mkdir -p /app/blog
# 将NFS的/app/blog挂载至本地的/app/blog
mount 192.168.25.211:/app/blog /app/blog
#永久挂载
echo "192.168.25.211:/app/blog /app/blog nfs defaults 0 0" >> /etc/fstab
mount -a
#修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.25.214;
root /app/blog; # 指向 NFS 挂载点
# 仅允许图片类型请求,其他请求返回 403
location / {
if ($request_filename !~* \.(jpg|jpeg|png|gif|webp)$) {
return 403;
}
expires 7d; # 图片缓存 7 天,优化性能
}
}
}
#检查配置文件
/usr/local/nginx/sbin/nginx -t
#重启服务
systemctl restart nginx
5.MySQL服务器
IP: 192.168.25.215
# Ubuntu
#apt安装
#apt -y install mysql-server
# 或者二进制脚本安装
wget http://192.168.57.200/Software/mysql_install.sh
bash mysql_install.sh
# 编辑环境变量配置文件
vim /etc/profile
#在文件末尾添加以下内容(指定 MySQL bin 目录路径)
export PATH=$PATH:/usr/local/mysql/bin
#保存退出后,使环境变量立即生效
source /etc/profile
# 开启远程访问(Ubuntu 关键步骤)
vim /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0 # 改为 0.0.0.0(监听所有网卡)
systemctl restart mysql # 重启 MySQL
# 创建wordpress数据库与远程账号
mysql -uroot -proot123
CREATE DATABASE wordpress charset utf8mb4;
CREATE USER 'wordpress'@'192.168.25.%' IDENTIFIED BY 'admin1234';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'192.168.25.%';
FLUSH PRIVILEGES;
6.配置wordpress
#在 NFS 服务器(211)上执行(确保配置同步到所有客户端)
cd /app/blog
cp wp-config-sample.php wp-config.php
#修改配置文件
vim wp-config.php
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress'); # wpdb为MySQL中创建的数据库
/** MySQL数据库用户名 */
define('DB_USER', 'wordpress'); # wpadm为MySQL中授权的用户
/** MySQL数据库密码 */
define('DB_PASSWORD', 'admin1234'); # 授权用户的密码
/** MySQL主机 */
define('DB_HOST', '192.168.25.215'); # MySQL主机地址
# 保存退出,修正配置文件权限
chown www-data:www-data wp-config.php
chmod 600 wp-config.php # 仅属主可读写,提升安全
至此配置就已经完成。达到了图片从图片服务器返回,静态nginx直接返回,动态交给PHP进行处理。
#验证
访问前端 Nginx:在浏览器输入 http://192.168.25.212,应进入 WordPress 安装向导(填写站点名称、管理员账号)。
验证 PHP 处理:安装完成后,能正常登录 WordPress 后台(说明 PHP 与 MySQL 通信正常)。
验证图片服务器:在后台上传一张图片,查看图片 URL 应为 http://192.168.25.214/wp-content/uploads/...,且能正常显示(说明图片转发生效)。
验证 NFS 同步:在 NFS 服务器(211)的 /app/blog/wp-content/uploads 中,应能看到上传的图片文件(说明共享目录同步正常)。
总结
1.前端Nginx要做好location匹配,将.php与.jpg等进行反向代理。
2.后端PHP服务器要修改配置文件,PHP自带配置文件只监听本地,且只允许本地访问
3.后端Image服务器,不论是apache还是Nginx要开启WEB服务。根目录要指向图片根目录,且根目录下的图片要与原本图片文件目录结构一致。
Tomcat基础
- java:编译型、面向对象、一次编译到处运行
- JVM(JAVA虚拟机)运行JAVA的字节码
- Java的编译流程
- 1.安装JDK(Java开发运行环境);
- 2.安装Maven(Java包管理工具):一键下载依赖、编译、打包;
- 3.下载源代码,git clone ;选装IDEA;
- 4.使用Maven编译打包生成war包;JPress;
- 5.安装配置Tomcat,将xxx.war包复制到webapps目标中;
- 6.运行Tomcat,war包自动解压缩,安装配置MySQL;
- 7.打开浏览器,查看 IP:8080 ,是否运行正常;
- 8.使用Nginx反向代理Tomcat;
Tomcat介绍
Tomcat 是Web应用服务器, 用来部署JavaWeb项目;
Linux 操作系统上 安装JPress(Tomcat 部署项目)
#在windows 桌面操作
#1.下载jdk1.8.0_451 Windows版 到f盘school_apps
·下载好后搭建系统环境变量
·桌面右键此电脑->属性->高级系统设置->环境变量
·在系统变量里新建 JAVA_HOME 变量值是文件路径 F:\school_apps\jdk1.8.0_451
·在系统变量中找到 Path ->双击-> 新建->添加 %JAVA_HOME%\bin
·在终端中输入 java -version 测试是否设置成功
显示--------------------
java version "1.8.0_451"
Java(TM) SE Runtime Environment (build 1.8.0_451-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.451-b10, mixed mode)
------------------------测试成功
#2.下载apache-maven-3.9.10 Windows版 到f盘school_apps
·下载好后搭建系统环境变量
·桌面右键此电脑->属性->高级系统设置->环境变量
·在系统变量里新建 MAVEN_HOME 变量值是文件路径 F:\school_apps\apache-maven-3.9.10
·在系统变量中找到 Path ->双击-> 新建->添加 %MAVEN_HOME%\bin
·在终端中输入 mvn -version 测试是否设置成功
显示----------------------
Apache Maven 3.9.10 (5f519b97e944483d878815739f519b2eade0a91d)
Maven home: F:\school_apps\apache-maven-3.9.10
Java version: 1.8.0_451, vendor: Oracle Corporation, runtime: F:\school_apps\jdk1.8.0_451\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"
-------------------------测试成功
#3.在maven 的安装目录F:\school_apps\apache-maven-3.9.10里
·新建一个文件夹 maven_repository
#4.配置 maven 的配置文件 F:\school_apps\apache-maven-3.9.10\conf\settings.xml
·在浏览器搜索 华为开源镜像站
语言类->Maven->找到并复制
-----------------------------------
<mirror>
<id>huaweicloud</id>
<mirrorOf>*</mirrorOf>
<url>https://mirrors.huaweicloud.com/repository/maven/</url>
</mirror>
-----------------------------------
复制到settings.xml中的161行附近 </mirrors>上面的位置 然后把原有的内容注释掉
·复制第53行注释掉的<localRepository>/path/to/local/repo</localRepository>
在下面重新粘贴并修改路径,这个位置是安装依赖所在的位置
<localRepository>F:\school_apps\apache-maven-3.9.10\maven_repository</localRepository>
#5.创建修改好后,打开终端中
输入mvn help:system
出现BUILD SUCCESS 说明执行成功
找到新建的maven_repository文件夹查看里面是否有 org 文件夹
如果里面生成文件,即说明修改成功。
#6.下载源代码到F:\school_apps中
·在终端中切换目录到F:\school_apps
cd F:\school_apps
·使用命令下载源代码
git clone https://gitee.com/JPressProjects/jpress.git
#7.下载好源码后进行编译 使用命令行编译
·切换到下载好的源码目录
cd F:\school_apps\jpress
·执行编译命令 mvn clean package 然后回车 等待编译结束
mvn clean package
·编译完成后查看F:\school_apps\jpress\starter-tomcat\target中是否有 starter-tomcat-5.0.war
#在Linux虚拟机上操作
#8.在linux上安装jdk 安装到/usr/loacl/jdk
·先创建/usr/loacl/jdk 目录
cd /usr/loacl
mkdir jdk
cd jdk
·在windows终端中将提前下载好的jdk-8u451-linux-x64.tar.gz 安装包 发送到Linux 的/usr/loacl/jdk 目录中
scp E:\lwy用户\下载\JDK-Tomcat-Maven\jdk-8u451-linux-x64.tar.gz root@192.168.25.211:/usr/local/jdk
·然后在jdk目录中解压
tar -xvf jdk-8u451-linux-x64.tar.gz
·解压好后修改一下文件名
mv jdk1.8.0_451/ jdk1.8
·查看jdk1.8的完整路径
cd jdk1.8
pwd
·配置 jdk 环境变量
vim /etc/profile
在最后一行后面添加
#set java enviroment
JAVA_HOME=/usr/local/jdk/jdk1.8
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
·保存退出,并重置环境
source /etc/profile
·查看版本,输出是否正确
java -version
#9.在linux上 Centos7 上安装tomcat 安装到/usr/loacl/tomcat
·先创建/usr/loacl/tomcat 目录
cd /usr/loacl
mkdir tomcat
cd tomcat
·在windows终端中将提前下载好的apache-tomcat-9.0.106.tar.gz 安装包 发送到Linux 的/usr/loacl/tomcat 目录中
scp E:\lwy用户\下载\JDK-Tomcat-Maven\apache-tomcat-9.0.106.tar.gz root@192.168.25.211:/usr/local/tomcat
·在tomcat目录中解压
tar -xvf apache-tomcat-9.0.106.tar.gz
·解压好后修改一下文件名
mv apache-tomcat-9.0.106 tomcat9.0.106
·进入 tomcat9.0.106 的 bin 目录,输入启动指令
cd tomcat9.0.106/bin
执行 ./startup.sh
·测试是否启动成功,在浏览器中输入:192.168.25.211:8080
查看是否进入tomcat 9.0.106 页面
·配置 tomcat 环境变量
·在windows终端中将提前编译好的starter-tomcat-5.0.war 发送到Linux 的/usr/local/tomcat/tomcat9.0.106/webapps 目录中
scp F:\school_apps\jpress\starter-tomcat\target\starter-tomcat-5.0.war root@192.168.25.211:/usr/local/tomcat/tomcat9.0.106/webapps
·把webapps里的原有文件删除,只留下我们上传上去的.war文件
·测试是否启动成功,在浏览器中输入:192.168.25.211:8080
#9.在linux上 UBuntu 上安装tomcat
·使用apt 下载 tomcat
apt -y install tomcat9
·查找webapps的文件路径
find / -name webapps
/var/lib/tomcat9/webapps
·修改配置文件
vim /etc/tomcat9/server.xml
修改port端口号为9527
<Connector port="9527" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
·保存退出,重启tomcat9
systemctl restart tomcat9
·在windows终端中将提前编译好的starter-tomcat-5.0.war 发送到Linux 的 /var/lib/tomcat9/webapps目录中
scp F:\school_apps\jpress\starter-tomcat\target\starter-tomcat-5.0.war root@192.168.25.211:/var/lib/tomcat9/webapps
·把webapps中的原有文件删除,只保留上传的.war文件
·去浏览器测试搜索 192.168.25.211:9527 是否能打开JPress页面
#10.在linux上安装MySQL
·使用二进制脚本安装MySQL
wget http://192.168.57.200/Software/mysql_install.sh
·执行脚本
bash mysql_install.sh
·编辑环境变量配置文件
vim /etc/profile
·在文件末尾添加以下内容(指定 MySQL bin 目录路径)
export PATH=$PATH:/usr/local/mysql/bin
·保存退出后,使环境变量立即生效
source /etc/profile
·开启远程访问(Ubuntu 关键步骤)
vim /etc/mysql/mysql.conf.d/mysqld.cnf
·改为 0.0.0.0(监听所有网卡)
bind-address = 0.0.0.0
·重启MySQL
systemctl restart mysql
·进去mysql 创建一个库
mysql -uroot -proot123
·创建 jpress 库
create database jpress ;
·退出
·去浏览器测试搜索 192.168.25.211:9527 安装步骤创建jpress网页
- LNMT环境搭建
浙公网安备 33010602011771号