Nginx、LNMP万字详解

目录

Nginx

特点

Nginx安装

添加Nginx服务

Nginx配置文件

全局配置

HTTP配置

状态统计页面

Nginx访问控制

授权用户

授权IP

虚拟主机

基于域名

测试

基于IP

测试

基于端口

测试

LNAMP

解析方式

LNMP转发php-fpm解析

Nginx代理LAMP解析

LNMP部署示例

实验环境

MariaDB

修改密码

授权数据库

PHP

拷贝配置文件

让bash能够读取php的命令

配置提高php解析效率的模块

配置 Nginx 支持 PHP 环境

Nginx配置

使用NFS文件系统部署Discuz论坛


Nginx


Nginx是一个高性能的开源Web服务器软件,也可以用作反向代理服务器、负载均衡器和HTTP缓存。

特点
  1. 可以跨平台
  2. 轻量化
  3. 并发请求(请求量),假如Apache的并发量能达到3000-5000,那么Nginx可以达到30000-50000

Nginx安装

在XShell中拖入Nginx的源代码软件包

使用systemctl stop firewalld命令关闭防火墙,使用vim /etc/sysconfig/selinux命令编辑selinux文件,将SELINUX参数改为disabled设置永久关闭内核完全机制

使用yum -y install pcre-devel zlib-devel gcc* openssl-devel命令安装nginx所需开发环境

  • Zlib是一个压缩库,Nginx使用它来支持HTTP数据的gzip压缩功能。zlib-devel包含Zlib库的头文件和静态库,用于编译时链接。
  • OpenSSL是一个开放源代码的加密库,提供了安全套接字层(SSL)和传输层安全(TLS)协议的实现。Nginx通常与OpenSSL一起使用来支持HTTPS协议,即加密的HTTP通信。openssl-devel包含OpenSSL库的头文件和静态库,用于编译时链接。

为了提高系统安全性,运行nginx时不使用root用户,创建一个专门运行该程序的用户。使用useradd -M -s /sbin/nologin nginx命令创建程序用户,-M:不创建家目录;-s:指定登录Shell为nologin(不能登录)

使用tar zxvf nginx-1.12.0.tar.gz命令解压源码包,cd进入源码包解压的目录下准备下一步配置安装

运行./configure脚本,自定义安装设置

[root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module

选项

说明

--prefix=/usr/local/nginx

这指定了安装 Nginx 的根目录。在这里,Nginx 将被安装到 /usr/local/nginx 目录下。通常情况下,这是默认的安装路径,但可以根据需要修改。

--user=nginx --group=nginx

这两个参数指定了 Nginx 进程运行的用户和用户组。在这里,Nginx 进程将以 nginx 用户和 nginx 组的身份运行。这是为了增强安全性,使得 Nginx 进程不以 root 用户的权限运行。

--with-http_ssl_module

这个参数启用了 Nginx 的 HTTPS 支持,启用了SSL或TLS加密协议的功能。这使 Nginx 可以处理通过 HTTPS 协议传输的数据流量。

--with-http_stub_status_module

这个参数启用了 Nginx 的状态页功能,允许你查看 Nginx 当前的运行状态和一些基本的性能统计信息。

./configure完成后,生成了MAKEFILE文件(配置参数文件)然后使用make && make install命令编译并安装

使用ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/命令创建软链接,这样在终端中也可以调用nginx的命令

可以使用nginx -t命令测试一下bash解释器能否读取nginx命令,检查配置文件是否有语法错误, 提示successful就代表语法没有错误

[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

输入nginx命令启动nginx服务,还可以使用netstat命令查询nginx有没有运行

[root@localhost ~]# nginx
[root@localhost ~]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      17125/nginx: master 

此时在宿主机的浏览器中访问该主机的IP地址,测试能否访问Nginx的服务器

如果要关闭Nginx服务,可以使用以下命令

命令

说明

nginx -s stop

停止nginx服务

pkill -9 nginx

杀死nginx进程来停止nginx服务

killall -3 nginx

停止nginx服务

killall -s QUIT nginx

停止nginx服务

killall -1 nginx

重载nginx服务

killall -s HUP nginx

重载nginx服务

添加Nginx服务

使用systemctl管理服务需要在/lib/systemd/system/目录下创建对应的服务文件

使用service管理服务需要在/etc/init.d/目录下创建对应服务脚本,这里我们使用systemctl管理

进入/lib/systemd/system/目录下,创建nginx服务的文件,添加以下内容,保存并退出,重启systemd,设为开机自启然后启动nginx

[root@localhost ~]# cd /lib/systemd/system/
[root@localhost system]# vim nginx.service[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
#ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecStop=/usr/sbin/nginx -s stop
ExecReload=/usr/local/sbin/nginx -s reload[Install]
WantedBy=multi-user.target# 重启systemd
[root@localhost system]# systemctl daemon-reload
[root@localhost system]# systemctl enable nginx
[root@localhost system]# systemctl start nginx
  • #chkconfig: 35 99 20
    • 35:表示在运行级别3(多用户文本模式)和5(图形模式)下启用这个服务,使用 - 可以表示所有运行级别
    • 99:表示启动服务的优先级。数字越高,启动越靠后。
    • 20:表示停止服务的优先级。数字越高,停止越靠后。

Nginx配置文件

cd到/usr/local/nginx/conf/目录下,进入Nginx存放配置文件的目录,打开nginx主配置文件:vim nginx.conf

全局配置

#user  nobody;    运行用户
worker_processes  2;    # 进程数量,与内核数量对应
#error_log logs/error.log;         # 错误日志文件的位置 
#pid logs/nginx.pid;         # PID 文件的位置events {worker_connections  1024;  # 每个进程允许承载的连接数,与内存对应
}

HTTP配置

下方代码块讲解了部分参数的意义,以及对一些参数的修改,以便进行实验

http{日志格式,该格式的名称为"main"#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';# log_format 格式名称 '客户端IP地址 - 客户端用户名 [请求时间]  "请求方式" '#                    '状态码 报文字节数  "HTTP请求头信息" '#                    '"客户端的用户代理字符串" "客户端原始IP列表,使用代理时有效"'每一个server块都对应一个站点server {listen       80;  # 监听端口server_name  www.test.com;  # 服务名称,如果要实现虚拟主机这一项是必须填的charset utf-8;    # 字符编码#access_log  logs/host.access.log  main;location / {  # 这里的/(根)指的是nginx的安装路径,/usr/local/nginxroot   html;  # 在该根目录下有一个html子目录,存放网页文件index  index.html index.htm;    # 索引文件    }
}
状态统计页面

在location块下方,添加一个location块

该块内的功能的前提是在安装nginx时配置了--with-http_stub_status_module模块

  • stub_status:当客户端访问 /status 路径时,Nginx将会返回当前服务器的状态信息
  • access_log:通常情况下,Nginx会自动记录所有对于日志的访问,通过设置为off后,可以防止用户访问指定站点的访问信息写入到日志中

假设你有一个网站,其中有一个页面 /test,这个页面包含了一些敏感信息,只有内部员工才能访问。

为了确保这些敏感信息不会被记录在访问日志中,你可以使用 access_log off。来禁止记录对 /test 页面的访问

        location /status {   # status:访问网站url的子目录名称(http://www.test.com/status)stub_status on;  # 启用该站点的状态统计功能access_log off;  # 关闭访问日志记录}

保存并退出,在终端输入systemctl restart nginx这个命令来启动nginx服务

在宿主机使用浏览器访问nginx服务,可以显示出状态信息

在此处做一个快照,方便后续LNMP部署

Nginx访问控制

授权用户

使用yum -y install httpd-tools安装Apache的工具集

使用htpasswd -c /usr/local/nginx/pass.db tom命令生成用户认证文件,并创建名为tom的用户和对应加密过的密码,回车后设置密码

如果要再次创建授权的用户,需要将命令的-c选项去掉,因为认证文件已经生成过了不需要再生成,否则就会覆盖原文件:htpasswd /usr/local/nginx/pass.db jerry

为了访问的安全性,应该只设置读的权限,使用chmod 400将pass.db文件改为只能读取,而在nginx运行时应该由nginx的程序用户来调用该文件,所以将属主也改为nginx

[root@localhost ~]# ll /usr/local/nginx/pass.db 
-rw-r--r-- 1 root root 86 7月  14 10:25 /usr/local/nginx/pass.db
[root@localhost ~]# chmod 400 /usr/local/nginx/pass.db
[root@localhost ~]# ll /usr/local/nginx/pass.db 
-r-------- 1 root root 86 7月  14 10:25 /usr/local/nginx/pass.db
[root@localhost ~]# chown nginx /usr/local/nginx/pass.db 
[root@localhost ~]# ll /usr/local/nginx/pass.db 
-r-------- 1 nginx root 86 7月  14 10:25 /usr/local/nginx/pass.db

还需要在nginx配置文件中配置基本认证的功能,

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
修改location块内的参数
location / {root   html;index  index.html index.htm;auth_basic "secret";  # 定义认证区域,显示一个提示信息"secret"给客户端,当客户端尝试访问受保护的资源时,会弹出一个对话框要求输入用户名和密码。auth_basic_user_file /usr/local/nginx/pass.db;  # 当客户端提供凭据pass.db中的记录匹配时,Nginx才会允许访问资源}

此时用浏览器访问Nginx服务器就会弹出身份验证的窗口

授权IP

因为规则是从上往下匹配的,如果匹配到规则就停止,不再往下匹配。

所以可以先添加deny规则 拒绝102主机访问,然后再下一条规则添加允许所有主机访问,就变成了只拒绝102主机的请求,允许其他所有主机

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location / {root   html;index  index.html index.htm;#auth_basic "secret";#auth_basic_user_file /usr/local/nginx/pass.db;deny 192.168.10.102;allow all;}

虚拟主机

基于域名

将nginx配置文件中第一个server站点下方的被注释的server站点注释全部去掉,准备定义第二个站点,注意想要在同一主机上托管多个站点,server_name必须不同,服务器要根据server_name来判断用户访问的URL

把第一个server站点的网页位置改为/var/www/html,第二个站点网页位置改为/var/www/html/accp

再为accp站点添加访问日志,保存并退出使用nginx -t测试语法正确性

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.test.com;charset utf-8;access_log  logs/test.com.access_log;location / {root   /var/www/html/test;index  index.html index.htm;#auth_basic "secret";#auth_basic_user_file /usr/local/nginx/pass.db;#deny 192.168.10.102;#allow all;}# 省略部分内容
}server {listen       80;server_name  www.accp.com;access_log logs/accp.com.log;location / {root   /var/www/html/accp;index  index.html index.htm;}
}[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

在配置文件中配置的网页存放位置,由于我们是用源码包安装的Nginx,所以系统不会生成/var/www/html目录,所以这里需要手动创建出来两个对应目录

再使用重定向将测试的字符串覆盖到index.html文件中,如果没有该文件,重定向会在覆盖时自动生成该文件

[root@localhost ~]# mkdir -p /var/www/html/test
[root@localhost ~]# mkdir -p /var/www/html/accp
[root@localhost ~]# echo "www.test.com" > /var/www/html/test/index.html
[root@localhost ~]# echo "www.accp.com" > /var/www/html/accp/index.html
测试

因为有两个站点需要测试,所以需要向hosts文件写入对应解析,这里开启第二台虚拟机作为客户端(192.168.10.102)

将解析站点写入hosts文件

[root@localhost ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.101 www.test.com
192.168.10.101 www.accp.com

使用curl测试

[root@localhost ~]# curl www.test.com
www.test.com
[root@localhost ~]# curl www.accp.com
www.accp.com
基于IP

手动添加子接口

或使用ifconfig命令创建临时子接口

ifconfig ens33:0 192.168.10.211

ifconfig ens33:0 192.168.10.212

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:1

在子接口0中修改IP和设备名

[root@localhost network-scripts]# vim ifcfg-ens33:0
IPADDR=192.168.10.211
NAME=ens33:0
DEVICE=ens33:0

在子接口1中修改IP和设备名

[root@localhost network-scripts]# vim ifcfg-ens33:1
IPADDR=192.168.10.212
NAME=ens33:1
DEVICE=ens33:1

重启网络服务,使用ip a查看地址

[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a
2: ens33: inet 192.168.10.101/24 brd 192.168.10.255 scope global ens33inet 192.168.10.211/24 brd 192.168.10.255 scope global secondary ens33:0inet 192.168.10.212/24 brd 192.168.10.255 scope global secondary ens33:1

修改配置文件,将两个站点的监听参数改为子接口IP : 端口号

检测语法正确性,重启nginx服务

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
# test站点
listen       192.168.10.211:80;
# accp站点
listen       192.168.10.212:80;
[root@localhost ~]# nginx -t
[root@localhost ~]# systemctl restart nginx
测试

来到102客户端主机使用curl测试

[root@localhost ~]# curl 192.168.10.211
www.test.com
[root@localhost ~]# curl 192.168.10.212
www.accp.com
基于端口

直接修改配置文件中的监听参数

修改完后重启服务

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
# test站点
listen       192.168.10.101:80;
# accp站点
listen       192.168.10.101:8001;
[root@localhost ~]# nginx -t
[root@localhost ~]# systemctl restart nginx
测试

需要注意的是,访问accp.com不加端口号访问的也不是accp.com,只有加了8001端口号才能正常访问

[root@localhost ~]# curl 192.168.10.101:80
www.test.com
[root@localhost ~]# curl 192.168.10.101:8001
www.accp.com
[root@localhost ~]# curl www.test.com
www.test.com
[root@localhost ~]# curl www.test.com:8001
www.accp.com
[root@localhost ~]# curl www.accp.com
www.test.com
[root@localhost ~]# curl www.accp.com:8001
www.accp.com

LNAMP

前面的文章说过Linux、Apache、MySQL、PHP结合构建LAMP,那么把Apache换成Nginx也可以构建LNMP

把Nginx加入到LAMP就可以构建成LNAMP

解析方式

LNMP转发php-fpm解析

在运行LAMP环境的时候,其中的PHP并没有实际运行的进程,只是安装了PHP的模块给Apache使用

由于php没有给Nginx提供模块,所以在LNMP环境下就需要额外运行一个php环境的主机,提供一个进程 ——》php-fpm,该进程负责解析动态资源请求。

就实现了:Nginx专门处理静态资源解析,php专门负责动态资源解析

Nginx代理LAMP解析

Nginx也可以通过 cgifast-cgi 连接两个程序,Nginx接收动态资源请求后需要转发给php解析,这么一来解析的速度就变慢了

可以让Nginx通过代理功能把动态请求转发给LAMP的环境,就实现了Nginx解析静态请求,LAMP解析动态请求,达到更快的解析速度(动静分离

  • cgi:通用网关接口
  • fast-cgi:快速通用网关接口

LNMP部署示例

实验环境

IP地址

操作系统

主要软件及版本

192.168.10.101

CentOS7.9

Nginx

192.168.10.102

CentOS7.9

php

192.168.10.103

CentOS7.9

mysql

为了方便测试,关闭3台主机的防火墙:systemctl stop firewalld


在103主机安装

MariaDB

为了快速部署,这里使用yum来安装mariadb数据库的服务端和客户端:yum -y install mariadb-server mariadb

安装完mariadb,使用systemctl start mariadb命令启动服务

修改密码

使用mysqladmin命令指定连接MySQL的用户名为root,密码设为123456

然后使用mysql -uroot -p测试密码能否进入数据库

[root@localhost ~]# mysqladmin -uroot password '123456'
[root@localhost ~]# mysql -uroot -p

授权数据库

对数据库的连接授权,授权后可以使用主机名连接

登录数据库,切换操作的数据库为mysql,授予root用户可以从任何主机访问数据库的所有权限,并设置密码为'aptech'。

为了使授权生效,需要刷新MySQL的权限缓存

%:%通配符表示所有IP地址

[root@localhost ~]# mysql -u root -p123456
use mysql;    # 切换数据库为mysql
grant all on *.* to root@'%' identified by 'aptech';
flush privileges;    # 刷新权限

PHP

在102主机安装

拖入php的源代码软件包

使用tar zxvf php-5.5.38.tar.gz解压该源码包

使用yum -y install gd libxml2-devel libjpeg-devel libpng-devel gcc*命令安装php所需开发环境

gd是一个用于动态创建图像的开源库。它允许你创建 GIF、JPEG、PNG 等格式的图像,以及进行简单的图像操作和合成。

libxml2是一个用于解析XML文档的函数库。

libjpeg 一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现

libpng 是一个用于处理 PNG 格式图像的C语言函数库,提供了 PNG 图像的读取和写入功能。

cd进入解压目录,使用./configure脚本自定义安装

[root@localhost php-5.5.38]# ./configure --prefix=/usr/local/php5 --with-gd --with-zlib --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib
  • mysqlnd
    • 用ip地址的方式连接数据库,既可以是php和mysql装在同一个服务器,也可以装在不同的服务器。
    • 用127.0.0.1本地连接不需要为连接授权,用192.168.10.101连接需要授权,哪怕连接本地数据库。

选项

说明

--prefix=/usr/local/php5

指定安装路径

--with-gd

启用GD图形库的支持

--with-zlib

启用Zlib库的支持

Zlib是一个用于数据压缩和解压的库,PHP使用它来处理压缩格式的数据。

--with-mysql=mysqlnd

启用MySQL数据库的支持

--with-mysqli=mysqlnd

启用mysqli的支持,并且使用mysqlnd驱动

--with-config-file-path=/usr/local/php5

指定了PHP配置文件(php.ini)的存放路径

--enable-mbstring

启用多字节字符串支持。

mbstring扩展允许PHP处理多字节编码的字符串,例如UTF-8。

--enable-fpm

启用了FastCGI Process Manager(FPM)支持。FPM是一个PHP FastCGI管理器

使用make && make install编译并安装php

拷贝配置文件

将php提供的模板配置文件拷贝到指定的安装目录下

[root@localhost php-5.5.38]# cp php.ini-development /usr/local/php5/php.ini

让bash能够读取php的命令

[root@localhost php-5.5.38]# ln -s /usr/local/php5/bin/* /usr/local/bin/
[root@localhost php-5.5.38]# ln -s /usr/local/php5/sbin/* /usr/local/sbin/

配置提高php解析效率的模块

拖入ZendGuardLoader压缩包

解压后进入解压目录,拷贝ZendGuardLoader.so文件到指定目录

[root@localhost ~]# tar -zxvf zend-loader-php5.5-linux-x86_64_update1.tar.gz
[root@localhost ~]# cd zend-loader-php5.5-linux-x86_64/ 
[root@localhost zend-loader-php5.5-linux-x86_64]# cp ZendGuardLoader.so /usr/local/php5/lib/php/ 

在php配置文件中添加下列内容

[root@localhost zend-loader-php5.5-linux-x86_64]# vim /usr/local/php5/php.ini [PHP] zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so # 指定该模块位置 zend_loader.enable=1 # 启用该模块 保存并退出

配置 Nginx 支持 PHP 环境

在102主机操作

拷贝php提供的php-fpm功能配置文件,并创建用于运行php-fpm的程序用户

[root@localhost ~]# cd /usr/local/php5/etc/
[root@localhost etc]# ls
pear.conf  php-fpm.conf.default
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# useradd php    # 创建程序用户

修改php-fpm的配置文件,将运行用户改为刚刚创建的php

[root@localhost etc]# vim php-fpm.conf
在末行模式下搜索:/user
修改150、151行的内容
user = php
group = php

再找到164行,修改监听IP为自己本机的IP地址,用于处理本机接受的动态解析请求

listen = 192.168.10.102:9000

再找到第230行、235行、240行、245行,将子进程的数量改为50

pm.max_children = 50    # 最大子进程数量
pm.start_servers = 20    # 启动时初始子进程数量
pm.min_spare_servers = 5    # 最小空闲子进程数量
pm.max_spare_servers = 35    # 最大空闲子进程数量

保存并退出,使用php-fpm命令启动服务,使用netstat命令也可以看到监听的IP也变为102

[root@localhost etc]# php-fpm
[root@localhost etc]# netstat -anpt | grep php
tcp        0      0 192.168.10.102:9000     0.0.0.0:*               LISTEN      106322/php-fpm: mas

Nginx配置

转到101主机

恢复之前做的快照

这里直接使用前面文章开头的Nginx安装过的环境

现在实现让101主机的主机连接到102主机的php-fpm服务

在大概72行,取消location块的注释,修改为以下内容

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
在44、45行修改内容
location / {root   /var/www/html;index  index.html index.htm index.php;}location ~ \.php$ {root           /var/www/html;    # 指定网页存放位置fastcgi_pass   192.168.10.102:9000;# 指定cgi接口监听ip和端口号fastcgi_index  index.php;
# 指定索引文件格式fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;include        fastcgi.conf;
# 指定配置文件}

如果nginx是开启状态,需要先关闭,然后再开启nginx

[root@localhost conf]# nginx -s stop    # 关闭nginx
[root@localhost conf]# nginx

来到102主机

使用mkdir -p命令递归创建存放网页文件的目录,创建test.php动态网页文件,调用phpinfo()函数显示php版本信息内容

如果解析的是静态文件,将文件放到101主机,如果解析的是动态文件,将文件放到102主机的/var/www/html

[root@localhost html]# cd /var/www/html
[root@localhost html]# vim test.php
<?php 
phpinfo();
?>

记得关闭防火墙systemctl stop firewalld

此时访问192.168.10.101/test.php可以测试解析动态页面,显示php版本信息

再新建一个test02.php文件,测试数据库是否能够连接

[root@localhost html]# vim test02.php
<?php
$link=mysqli_connect('192.168.10.103','root','123456');
if($link) echo "<h1>数据库连接成功</h1>"; 
mysqli_close($link);
?>

使用NFS文件系统部署Discuz论坛

nfs:网络文件系统,作用是远程共享目录或文件给其他主机

转到103主机

安装支持nfs文件系统的软件包

[root@localhost ~]# yum -y install nfs-utils
[root@localhost ~]# yum -y install unzip

将Discuz开源论坛系统压缩包拖入XShell,使用unzip命令解压该压缩包

进入解压出的upload目录,移动upload目录内所有文件到共享给其他主机访问的目录

[root@localhost ~]# unzip Discuz_X3.3_SC_UTF8.zip
[root@localhost ~]# cd upload/
[root@localhost upload]# mv * /opt/share/

登录mysql,创建名为bbs的数据库,授予用户runbbs对bbs数据库的所有权限,并设置密码为aptech,然后刷新权限

创建程序用户,将共享目录内的文件权限属主和属组都分配给php用户

[root@localhost upload]# mysql -uroot -paptech
# 创建属于论坛的数据库,名为bbs
create database bbs;
grant all on bbs.* to runbbs@'%' identified by 'aptech';
flush privileges;[root@localhost share]# useradd php
[root@localhost share]# chown -R php:php *

创建共享目录,启动共享目录对应的服务

[root@localhost ~]# mkdir /opt/share
[root@localhost ~]# systemctl start nfs
[root@localhost ~]# systemctl start rpcbind

转到101主机

安装让系统支持nfs的软件包

使用mount命令挂载103主机的共享目录

[root@localhost ~]# yum -y install nfs-utils
[root@localhost ~]# mount 192.168.10.103:/opt/share /var/www/html/

当103主机的共享目录存放了文件,在挂载过共享目录后,cd进入指定挂载的目标目录(/var/www/html)下就可以看到共享目录中存放的文件

转到102主机

安装让系统支持nfs的软件包

使用mount命令挂载103主机的共享目录

[root@localhost html]# yum -y install nfs-utils
[root@localhost ~]# mount 192.168.10.103:/opt/share /var/www/html/

使用浏览器访问192.168.10.101/install 进入论坛安装页面,根据提示安装论坛系统

安装完成后,访问192.168.10.101,Web服务器会自动跳转到论坛首页,完成部署

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

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

相关文章

linux之mysql安装和使用

数据库之Mysql 一、数据库介绍 1、什么是数据库 数据库就是一个存放计算机数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来对数据进行组织和存储的,可以通过数据库提供的多种方法来管理其中的数据。 2、数据库的种类 最常用的…

微分段Microsegmentation简介

目录 微分段Microsegmentation简介什么是微分段&#xff1f;微分段的防范措施微分段的防护层级 基于网络的微分段微分段基本工作机制微分段的角色VxLAN的额外字段 业务链分组与传输策略场景1&#xff1a;三层报文本地转发场景场景2&#xff1a;三层报文跨设备转发场景 微分段的…

中国贸易外经统计年鉴(2006-2023年)

数据年限&#xff1a;2006-2023年全 数据格式&#xff1a;pdf、excel、caj 数据内容&#xff1a;《中国贸易外经统计年鉴》是一部反映中国国内贸易、对外经济贸易和旅游业发展情况的资料性年刊。收录了 中国国内消费品市场、批发和零售业、住宿和餐饮业、国际收支、对外贸易、利…

具有I2S输出的多模数字麦克风ICS-43434咪头LR引脚接地或电源WS接LRCLK

外观和丝印 ICS-43434麦克风3.50 mm x 2.65 mm&#xff0c;丝印为434&#xff08;图片不好拍&#xff0c;隐约可见434&#xff09; 一般描述 ICS-43434 是一款数字 IS 输出底部收音孔麦克风。完整的 ICS-43434 解决方案包括 MEMS 传感器、信号调理、模数转换器、抽取和抗混叠滤…

在mybatis-plus中关于@insert注解自定义批处理sql导致其雪花算法失效而无法自动生成id的解决方法

受到这位作者的启发 > 原文在点这里 为了自己实现批量插入&#xff0c;我在mapper层使用insert注解写了一段自定义sql //自定义的批量插入方法 Insert("<script>" "insert into rpt_material_hour(id,sample_time,rounding_time,cur_month,machine_no…

Elasticsearch 批量更新

Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作&#xff0c;索引已经建过了&#xff0c;本文主要讲Elasticsearch批量更新指定字段语句&#xff0c;下面开始写更新语句执行更新啦&#xff01; 查询数据 查询指定shif…

视频号矩阵系统,AI自动生成文案,实现批量上传视频和定时发布

在数字化浪潮席卷全球的今天&#xff0c;视频内容已成为信息传播的重要载体。然而&#xff0c;对于众多自媒体创作者和企业而言&#xff0c;如何高效、精准地发布视频内容&#xff0c;依然是一个不小的挑战。幸运的是&#xff0c;随着技术的不断进步&#xff0c;视频号矩阵系统…

Kafka消息队列python开发环境搭建

目录 引言 Kafka 的核心概念和组件 Kafka 的主要特性 使用场景 申请云服务器 安装docker及docker-compose VSCODE配置 开发环境搭建 搭建Kafka的python编程环境 Kafka的python编程示例 引言 Apache Kafka 是一个分布式流处理平台&#xff0c;由 LinkedIn 开发并在 2…

SpringBoot整合阿里云RocketMQ对接,商业版

1.需要阿里云开通商业版RocketMQ 普通消息新建普通主题,普通组,延迟消息新建延迟消息主题,延迟消息组 2.结构目录 3.引入依赖 <!--阿里云RocketMq整合--><dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</…

Qt类 | QLabel类详解

文章目录 一、QLabel类介绍二、Properties&#xff08;属性&#xff09;三、Public Functions&#xff08;公共函数&#xff09;1.构造函数2.alignment与setAlignment函数 -- 标签内容的对齐方式3.buddy与setBuddy函数 -- QLabel关联的伙伴控件4.hasScaledContents与setScaledC…

基于YOLOv8深度学习的水果智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、卷积神经网络

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

C#字符串基本操作

1、代码 //1、创建字符串&#xff08;获取长度&#xff09;string str "Hello, World!";Console.WriteLine($"string:{str},length:{str.Length}");//2、字符串连接string str1 "Hello, ";string str2 "World!";Console.WriteLine…

在 Windows 11/10/8 上恢复误删除文件的最佳方法

如果您刚刚在计算机上重新安装了 Windows 操作系统&#xff0c;结果硬盘上的所有文件都消失了&#xff0c;有没有办法从 Windows 11/10 中恢复误删除的文件&#xff1f; 许多因素都可能导致 PC 上的文件被删除。除了重新安装操作系统外&#xff0c;其他常见原因还包括意外删除…

Vue.js 生命周期详解:从创建到销毁的全过程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

【BUG】已解决:java.lang.reflect.InvocationTargetException

已解决&#xff1a;java.lang.reflect.InvocationTargetException 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发…

STM32 IAP 需要关注的一些事

1、首先要知道STM32的程序是如何分布在FLASH中的。 2、升级的时候涉及到两个程序&#xff0c;一个是bootloader&#xff0c;一个是user程序&#xff0c;这两个程序的功能分别的什么作用的&#xff1f; 3、编译的固件是怎么分布的&#xff1f;通过那个配置文件去指导编译器去排布…

Spring Boot集成kudu快速入门Demo

1.什么是kudu 在Kudu出现前&#xff0c;由于传统存储系统的局限性&#xff0c;对于数据的快速输入和分析还没有一个完美的解决方案&#xff0c;要么以缓慢的数据输入为代价实现快速分析&#xff0c;要么以缓慢的分析为代价实现数据快速输入。随着快速输入和分析场景越来越多&a…

十五、【机器学习】【监督学习】- 神经网络回归

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

Django Q()函数

Q() 函数的作用 在Django中&#xff0c;Q()函数是一个非常有用的工具&#xff0c;主要用于构建复杂的查询。它允许你创建复杂的查询语句&#xff0c;包括AND、OR和NOT逻辑操作。这对于处理复杂的数据库查询特别有用&#xff0c;特别是在你需要组合多个条件或处理复杂的过滤逻辑…

HLS加密技术:保障流媒体内容安全的利器

随着网络视频内容的爆炸性增长&#xff0c;如何有效保护视频内容的版权和安全成为了一个亟待解决的问题。HLS&#xff08;HTTP Live Streaming&#xff09;加密技术作为一种先进的流媒体加密手段&#xff0c;凭借其高效性和安全性&#xff0c;在直播、点播等场景中得到了广泛应…