侧边栏壁纸
  • 累计撰写 46 篇文章
  • 累计创建 11 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux记录【QC-24-2-9】

加夫列尔·加西亚·马尔克斯
2024-02-09 / 0 评论 / 1 点赞 / 59 阅读 / 57032 字 / 正在检测是否收录...
温馨提示:
有问题欢迎加入QQ交流群交流:461796942
广告 广告

Linux记录【QC-24-2-9】

简介

 Linux下所有的目录所有的分区都是基于“根” /  运行目录从根开始
    1.""/"根是所有目录的顶点,对于Linux目录来说。一切从视开始。
    2.新设备可以挂载到任何目录上使用。
    3.所有的目录都是按照一定的类别有规津的进行组织和命名的。
    4.磁盘必统被挂载才能使用,没有挂载的磁盘相当于没有门窗的监狱,是不能被使用的。
    5.目录路径分为相对路经和绝对路径。

用法规则

 1.不用用户身份符
 管理员用户:
 [root@localhost ~]#
        【管理员用户是#】
   普通用户:
 [hzz@localhost ~]$
        【普通用户是$】
 ========================================================
 2.命令  [选项]  [参数]
 ​
 选项:(可以有0个或多个)
     短选项:-
         多个选项可以组合: -a -b = -ab
     长选项:--  例:--stdin
         长选项通常不能组合
         
 参数:命令的作用对象(可以有0个或多个)
 ========================================================
 3.type    //显示指定命令属于哪种类型(查看命令属性)
 [root@hzz ~]# type cd
 ========================================================
 4.命令行技巧:
 tab一下   命令补全 ,路径,文件名
 tab两下   列出候选项  
 history   列出执行过的历史命令
 ========================================================
 5.文件的三种权限:
 r   读权限
 w   写权限
 x   执行权限
 ========================================================
 6.修改主机名生效的两种方法
 reboot  重启生效(永久生效,开关机后仍然有效)
 bash    直接生效(临时有效,开关机后失效)
 ========================================================
 7.路径问题
 #  相对路径:以当前目录为基准
 #  绝对路径:已/为起点,完整的路径
 ========================================================
 8.关闭selinux命令
 1. 直接命令输入   sed -i s/'SELINUX=enforcing'/'SELINUX=disabled'/g /etc/selinux/config
 2. 进入文件内修改
 [root@qcc ~]# vim /etc/sysconfig/selinux 
 [root@qcc ~]# cat /etc/sysconfig/selinux 
 ​
 # This file controls the state of SELinux on the system.
 # SELINUX= can take one of these three values:
 #     enforcing - SELinux security policy is enforced.
 #     permissive - SELinux prints warnings instead of enforcing.
 #     disabled - No SELinux policy is loaded.
 SELINUX=disabled  <=========== 修改为disabled==========>
 # SELINUXTYPE= can take one of three two values:
 #     targeted - Targeted processes are protected,
 #     minimum - Modification of targeted policy. Only selected processes are protected. 
 #     mls - Multi Level Security protection.
 SELINUXTYPE=targeted 
 ========================================================
 9.          &&:与
 systemctl start httpd && systemctl enable httpd
 开启httpd服务同时设置httpd服务开机自启动
 ========================================================
 10.rz
 直接上传物理机文件到该目录下

一、目录管理命令

1. ls //列出目录内容

                       -l   //#长格式(显示详细信息)
 //以长格式显示的第一段含义: 第一个字符:文件类型
 ​
    -   //普通文件(f)
                        d   //目录文件
                        b   //块设备文件(block)
                        c   //字符设备文件(character)
                        l   //符号链接文件(symbolic link file)
                        p   //命令管道(pipe)
                        s   //套接字文件(socket)
                        后面九位字符:文件权限        
                        9位,每3位一组,每一组:rwx(读,写,执行)
        //以长格式显示的第二段含义:
                    文件硬链接的次数
        //以长格式显示的第三段含义:
                    文件的属主(owner)
        //以长格式显示的第四段含义:
                    文件的属组(group)
        //以长格式显示的第五段含义:
                    文件大小(size),单位是字节
        //以长格式显示的第六,七,八段含义:
                    时间戳(timestamp),最近一次被修改的时间
                        访问      //access,访问的时间
                        修改      //modify,文件内容被修改的时间
                        改变      //change,metadata(元数据)变化的时间
                 -h     //做单位转换
 #               -a     //显示以.开头的隐藏文件   (常用)
                  .     //表示当前目录
                 ..     //表示父目录
                 -d     //显示目录自身属性
                 -i     //显示文件的inode(index node)
                 -r     //逆序显示
                 -R     //递归(recursive)显示
                

2.cd //切换目录

            使用方法:
            cd  [参数] [目录]
            关键参数:
            cd      直接返回根目录
         -  返回上一次所在的目录
                    ~
                    .. 返回上一层目录
 ​
             相对路径:以当前所在的目录为基准,表示其他的目录位置
             绝对路径:以/为起点,完整的路径

3.pwd //查看当前所在目录路径

 pwd     //查看当前所在目录路径   

4.tree //查看目录树

         -d          //只显示目录
         -L level    //指定显示的层级数目
         -P 字符串    //显示指定字符串匹配到的文件
         #查看目录树

二、基本操作命令

1.创建用户xx【useradd】

 useradd xx

2.查看创建的用户 【id】

 id xx

3.查看当前系统存在的文件【cat】

 cat /etc/shadown

4.创建用户xxx并且设置附属组(admins)【useradd -G】

 useradd -G(设置当前用户的附属组,在原有基础上增添一个组)admins xxx
 ​
 -g和-G的不同用法【-g修改原有的gid和groups,-G在原有组基础上添加附属组】

5.设置用户xxx没有可交互的登录【shell】

 shell useradd -s /sbin/nologin xxx

6.设置用户密码的两种方法【passwd】

 1.直接设置(较繁琐,需要输入两次密码)
 passwd xxx 设置xxx的密码
 ​
 2.利用echo命令输入密码设置给指定用户
 echo 123 | passwd --stdin xxx
 用输入命令echo将密码123设置给用户xxx

7.给文件内容注入内容【echo】

 echo 123 > test.txt   #将123替换test.txt内部所有内容
 ​
 echo 456 >> test.txt  #将456追加进入test.txt文件内

8.设定某用户定时执行某命令【crontab】

    -u      //指定用户
    -e      //执行
    -l      //查看配置的计划命令的配置内容
    
    crontab -u xxx -e */5 * * * * echo hbgthbgt  
    #   * * * * * 代表分时日月周,用法:在对应*后加/和数字
        注意!!!*****之间有空格
    例:
        */5 * * * *    每5分钟
        * * * /2 * *   每两天
    
    给用户xxx设置每5分钟执行输入hbgthbgt的命令

9.查看目录下的文件权限和所属组等信息【ll】

ll /var/temp

10.对某文件设置读写执行等权限并且查看操作文件的用户权限【setfacl】【getfacl】

(1)
setfacl用法:setfacl -m u:用户: 权限 要给权限的文件路径

-m更改文件访问控制列表
权限:分为 r读权限 w写权限 x执行权限,不给的权限用-表示,给的权限则用r/w/x表示 

setfacl -m u:xxx:rw- /var/tmp/fstab
给用户xxx设置可读写/var/tmp/fstab的权限

(2)
getfacl用法:getfacl 需要查询用户操作权限的文件路径

11.创建用户并且指定id以及设置密码【useradd -u】

useradd -u(设置用户id) 2020 xxx
创建用户xxx,设置id为2020

密码设置与步骤二/6同
echo 123 | passwd --stdin xxx
给用户xxx设置密码123

12.查找文件并且复制的命令【find】

find /etc -size +5M 
查找/etc下文件大于5M的文件

查找/etc下的文件大于5M的,并且复制到/root/findfiles下
find /etc -size +5M -exec cp -a {} /root/findfiles/ \;

-name                  根据文件名进行查找

-perm                  根据文件权限进行查找

-prune                 排除 查找目录

-user                  根据文件属主查找

-group                 根据文件属组查找

-mtime -n | +n         根据文件更改时间查找

-nogroup               查找无有效数组的文件

-nouser                查找无有效属主的文件

-newer file1 ! file2   查找更新时间比file1新但比file2旧的文件

-type                  按照文件类型查找

-size -n +n            按文件大小查找

-mindepth n            从n级子目录开始搜索

-maxdepth n            最后搜索到n级子目录

13.修改文件名称【mv】

mv 原文件名 新文件名   ====>>  mv index.html css.html  #将index.htmlming'c修改为css.html

14.查询程序各种信息【rpm】

-a:查询所有套件;

-b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;

-c:只列出组态配置文件,本参数需配合"-l"参数使用;

-d:只列出文本文件,本参数需配合"-l"参数使用;

-e<套件档>或--erase<套件档>:删除指定的套件;

-f<文件>+:查询拥有指定文件的套件;

-h或--hash:套件安装时列出标记;

-i:显示套件的相关信息;

-i<套件档>或--install<套件档>:安装指定的套件档;

-l:显示套件的文件列表;

-p<套件档>+:查询指定的RPM套件档;

-q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户;

-R:显示套件的关联性信息;

-s:显示文件状态,本参数需配合"-l"参数使用;

-U<套件档>或--upgrade<套件档>:升级指定的套件档;

-v:显示指令执行过程;

-vv:详细显示指令执行过程,便于排错。

=> rpm -qa        #列出所有安装过的包
=> rpm -q tree    #获得某个软件包的文件全名
=> rpm -q samba   #查询程序是否安装

15.查看指定端口占用情况和进程ID【netstat】

netstat -nap | grep 3306
查看端口占用情况并且筛选3306端口显示

16.杀死某个进程【kill】

kill -9 进程号

示例:
[root@qcc halo]# netstat -nap | grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      20970/docker-proxy  
[root@qcc halo]# kill -9 20970
查看并筛选3306端口,拿到其进程号“20970”,用kill -9 强制杀死该进程

17.删除名叫"linux"的用户【userdel】

sudo userdel -r linux   =>使用`-r`参数会同时删除该用户的主目录及其它相关文件

18.用户切换命令【su】

su test 将当前用户切换为名为test的用户
=>如果不指定用户名,则默认切换到root用户。且不会切换到新的工作目录,但会切换到root用户的权限下

参数使用:
'-':切换到目标用户的环境变量,类似于登录该用户  su - halo 登录halo账号
'-c':行指定的命令,然后切换回原用户
'-l' 或 '--login':切换到目标用户的环境变量,类似于登录该用户

三、文件管理命令

1.mkdir //创建目录

        -p      //创建目录时若父目录不存在则自动创建
        -p      递归创建目录,递归的意思就是指目录下面还有目录
		        默认不加参数时如果要创建的目录已经存在,就会报错提示。使用-p参数后即			
		        使需要创建的目录已经存在了,也不会提示报错。
		        #创建目录命令

2.rmdir //删除目录,只能删除空目录

        rmdir   //删除目录,只能删除空目录  #删除目录命令

3.touch //创建一个空文件

        touch   //创建一个空文件   #创建文件命令

4.stat //显示文件或文件系统的状态

       stat    //显示文件或文件系统的状态

5. rm //删除文件,删除命令默认会提示是否需要删除,如果要使用命令本身可以在命令前加一个\

	    例如:\rm,这样删除就不会有提示了
        -r      //#递归删除,删除目录时必须使用此选项
        -f      //#强制删除,不询问

6.cp //复制文件,一个文件到一个文件,多个文件到一个目录

        -r      //#递归拷贝,拷贝目录时必须使用此选项
        -p      //#拷贝时保留原权限
        -a      //#相当于-rp

7. mv //移动文件

        mv     //移动文件   #mv 原路径  新路径

8.chmod //文件权限赋予

先用ll命令查看文件权限
ll /var/www/html
赋予x/r/w权限(执行、读、写权限)
chmod -x/r/w /var/www/html

9. du -h //查看目录下文件大小并列出

sudo du -h --max-depth=1 /usr/local/
查看目录/usr/local/下的文件和目录,按大小排序

四、文本内容查看命令

1.cat //将文件内容输出至标准输出(屏幕)

       -n      //#显示行号
       # 注意:使用cat查看文件内容时会将文件的所有内容加载至内存,所以应避免使用cat打开巨大文件

2.tac //倒序打印文件内容至标准输出

      tac     //#倒序打印文件内容至标准输出

3.more //全屏查看文本文件内容,只能从前往后,不能从后往前

      more  //全屏查看文本文件内容,#只能从前往后,不能从后往前
	        //文件内容显示完后#自动退出

4.less //全屏查看文本文件内容,可从前往后亦可从后往前。推荐使用

      less  //全屏查看文本文件内容,#可从前往后亦可从后往前。推荐使用

5. head //从头部开始打印文件内容,默认打印10行

      -n   //#指定要打印的行数,-n 可以是15也可以是-15

6.tail //查看文本文件尾部内容

     -n    //指定要打印的行数,可以是-n 15也可以是-15
     -f    //实时监测文件末尾内容

7. history //查看命令历史

//命令历史 
        -c              //清空命令历史
        -d OFFSET [n]   //删除指定位置的命令历史
        -w              //保存命令历史至历史文件~/.bash_history中

    //命令历史的使用技巧
        !n          	//执行命令历史中的第n条命令
        !-n         	//执行命令历史中倒数第n条命令
        !!          	//执行上一条命令
        !string     	//执行命令历史中最近一个以指定字符串开头的命令
        !$          	//引用前一个命令的最后一个参数
        esc,.       	//按下esc松开后按.,引用前一个命令的最后一个参数

8. ss //查看端口状态

ss -tnl               #查看所有端口状态
ss -tnl | grep 80     #查看端口状态,筛选80端口

9.docker ps //查看当前正在运行的容器

docker ps             #查看当前正在运行的容器情况

10.find //查找文件

[root@qcc ~]# sudo find / -name telnet
/etc/selinux/targeted/active/modules/100/telnet

#查找跟目录下叫telnet的文件

五、主机管理命令

1.hostname ,hostnamectl,time,clear,whoami,who,which

//主机名管理

    hostname    //查看或临时修改主机名,重开终端有效,重启失效

    hostnamectl //查看或永久修改主机名,重开终端生效,重启依然有效
    
//其它

    time        //显示命令的执行时间,例如time ls /etc

    clear       //清屏

    whoami      //显示当前登录用户
   
    who         //查看当前在线用户

    which       //显示指定命令的绝对路径

2. date //显示或设置日期与时间


        	//不带参数的date用于显示当前系统日期与时间
            //格式化输出时间:
            %Y      //年
            %m      //月
            %d      //日
            %F      //年-月-日
            %H      //时
            %M      //分
            %S      //秒
            -s      //以字符串方式设置时间
            查看当前时区
#		    命令 : "date -R"  (重要常用)

修改系统时间
[root@localhost ~]# date -s 02:02:10//修改系统时间
Sun Apr 9 02:02:10 EDT 2023

修改时间及日期
[root@localhost ~]# date -s “02:02:10 20230409” //修改时间和日期
Sun Apr 9 02:02:10 EDT 2023
[root@localhost ~]# date -s “20230409” //修改日期,未设置时间的,则默认为00:00:00
Sun Apr 9 02:02:10 EDT 2023
[root@localhost ~]#hwclock --set --date “2023-04-09 02:02:10” //修改硬件时间
Sun Apr 9 02:02:10 EDT 2023

按照指定格式内容显示时间和日期
[root@localhost ~]# date
Sun Apr 9 02:31:49 EDT 2023
[root@localhost ~]# date -d “00:00:00 1234-01-01”//按照格式输出时间1234年1月1日00:00;实际时间不会被修改
Sun Jan 1 00:00:00 LMT 1234
[root@localhost ~]# date -d “01:00:00 1234-01-01”//按照格式输出时间1234年1月1日01:00;实际时间不会被修改
Sun Jan 1 01:00:00 LMT 1234
[root@localhost ~]# date
Sun Apr 9 02:36:38 EDT 2023

日期和时间分行显示
[root@localhost ~]# date +%F%n%T
2023-04-09
02:04:02

按照字符串的设置显示日期
[root@localhost ~]# date -d “next month” +%Y-%m-%d//显示下个月今天的日期
2023-05-09
[root@localhost ~]# date -d “-2 month ago” +%Y-%m-%d//显示两个月后今天的日期,本处易混淆的地方是-2表示的是往后推,也就是时间正序,而+2的话,就是往前推,也就是以前的时间
2023-06-09
[root@localhost ~]# date -d “+2 year ago” +%Y-%m-%d//显示两年前今天的日期
2021-04-09
[root@localhost ~]# date -d “-2 year ago” +%Y-%m-%d//显示两年后今天的日期
2025-04-09

3.cal,bc,ldd

    cal     	//打印日历
    
    bc      	//Linux中的计算器
	-l	        //使用标准数学库
                echo 'scale=2;5/2'|bc -l
	            //scale=2表示保留两位小数
        
#   ldd     	//查看指定程序有哪些依赖库文件
                程序组成:
                    二进制程序
                    库文件
                    配置文件
                    帮助文件

获取系统命令帮助方法

//内部命令
         help COMMAND
//外部命令
         COMMAND --help
//在线文档
         info COMMAND    
//命令手册  manual
         man COMMAND
//文档
         /usr/share/doc 
    
whatis COMMAND      //用于查看COMMAND出现在man的哪一章节中。
		            //查询man帮助中此命令的作用

//man是分章节的,以下是每一章节的内容介绍:
    1   用户命令(/bin,/usr/bin,/usr/local/bin);
    2   系统调用;
    3   库调用;
    4   特殊文件(设备文件);
    5   文件格式(配置文件 的语法);
    6   游戏;
    7   杂项(Miscellaneous);
    8   管理命令(/sbin,/usr/sbin,/usr/local/sbin)
    
//man手册注意事项:
    []              //可选
    <>              //必选
    ...             //可以出现多次
    |               //多选一
    {}              //分组
    NAME            //命令名称及功能简要说明
    SYNOPSIS        //用法说明,包括可用的选项
    DESCRIPTION     //命令功能的详尽说明,可能包括每一个选项的意义
    OPTIONS         //说明每一个选项的意义
    FILES           //此命令相关的配置文件
    BUGS            //报告bug
    EXAMPLES        //使用示例
    SEE ALSO        //另外参照
    
//man翻屏
    SPACE	        //向后翻一屏
    b		        //向前翻一屏
    enter	        //向后翻一行
    k		        //向前翻一行
    
//查找
    /text	        //向后
    ?text           //向前
    n               //下一个
    N               //前一个
    q               //退出 

bash常用操作

//光标跳转
    Ctrl+a	//跳到命令行首
    Ctrl+e	//跳到命令行尾
    Ctrl+u	//剪切光标至命令行首的内容
    Ctrl+k	//剪切光标至命令行尾的内容
    Ctrl+<-	//光标定位到离自己最近的一个单词前面
    Ctrl+p	//重复上一次命令
    Ctrl+w	//剪切前面的字符至上一个空格处
    Ctrl+y	//粘贴或者恢复上次的删除。
    Ctrl+l	//清屏
    Ctrl+s	//暂时冻结当前shell的输入
    Ctrl+q	//解冻

    
//命令行常见特殊符号
    ~       	    //展开为用户的家目录
    ~USERNAME       //展开为指定用户的家目录
    {}      	    //列表,可用于存放数据
    \		        //转义,使得后面一个特殊字符没有任何特殊含义
    &&		        //前面的命令执行成功后才执行后面的命令
    ||		        //前面的命令执行失败后才执行后面的命令
    ;		        //不管前面的命令执行成功还是失败都执行后面的命令


//文件名通配符
    *       	    //匹配任意长度的任意字符
    ?       	    //匹配任意单个字符
    []      	    //匹配指定范围内的任意单个字符
        例如:[abc],[a-m],[0-9]
        [[:space:]]	//表示空白字符
        [[:punct:]]	//表示标点符号
        [[:lower:]]	//表示小写字母
        [[:upper:]]	//表示大写字母
        [[:alpha:]]	//表示大小写字母
        [[:digit:]]	//表示数字
        [[:alnum:]]	//表示数字和大小写字母
        [^]		    //匹配指定范围之外的任意单个字符

服务介绍

一、Http服务介绍

1、httpd服务简介

Apache HTTP Server(简称Apache或httpd)是Apache软件基金会的一个开放源代码的网页服务器软件,旨在为unix,windows等操作系统中提供开源httpd服务。由于其安全性、高效性及可扩展性,被广泛使用,自1996年4月以来,Apache一直是Internet上最流行的web服务。它快速、可靠并且可通过简单的API扩充,将Perl、Python等解释器等编译到httpd的相关模块中。

Apache

2、httpd版本

  • CentOS6系列的版本默认提供的是httpd-2.2版本的rpm包

  • CentOS7系列的版本默认提供的是httpd-2.4版本的rpm包

3、httpd配置文件

httpd目前有多个版本,主流有两个版本分别为:2.2、2.4;在安装了httpd软件之后,会生成配置文件。 这些文件有:

  • 主配置文件:/etc/httpd/conf/httpd.conf ,这个是httpd最主要的配置文件

  • 扩展配置文件:/etc/httpd/conf.d/*.conf ,这个是httpd的额外配置文件

  • 网页的存放目录:/var/www/html/

  • 模块的目录:/etc/httpd/modules/

  • 日志目录:/var/log/httpd/*

    • 访问日志为:./access_log

    • 错误日志为:./error_log

4、httpd服务配置

4.1 基本配置

4.1.1服务安装

[root@hzz ~]# yum -y install httpd

[root@hzz ~]# rpm -qa | grep httpd

注意:请关闭firewalld防火墙和selinux安全子系统(方法一:通过如下命令进行更改。方法二:vim 进入到/etc/selinux/config 当中去,更改SELINUX=后面的状态)。

[root@localhost ~]# systemctl stop  firewalld.service 
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i s/'SELINUX=enforcing'/'SELINUX=disabled'/g /etc/selinux/config

4.1.2服务管理

//启动服务/关闭服务
[root@hzz ~]# systemctl start httpd
[root@hzz ~]# systemctl stop httpd

//开机自启/取消开机自启
[root@hzz ~]# systemctl enable httpd
[root@hzz ~]# systemctl disable httpd

//重启服务/查看服务状态
[root@hzz ~]# systemctl restart httpd
[root@hzz ~]# systemctl status httpd

4.1.3服务配置

//手动设置站点主页
[root@hzz ~]# cd /var/www/html/
[root@hzz html]# vim index.html
hello world!
  • 更改网站默认存放路径

//创建网站存放目录,编辑主页内容
[root@hzz ~]# mkdir /var/www/hzz
[root@hzz ~]# vim /var/www/hzz/index.html
hzz

//修改配置文件,将站点指向新创建的目录
[root@hzz ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/hzz"

//重启服务,加载配置
[root@hzz ~]# systemctl restart httpd
  • 修改默认网站主页文件名

//修改配置文件,修改默认网页文件名
[root@hzz ~]# vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
    DirectoryIndex hzz.html
</IfModule>

//编辑一个新的网页,输入网页内容
[root@hzz ~]# vim /var/www/hzz/hzz.html
hzz.html

//重启服务,加载配置
[root@hzz ~]# systemctl restart httpd

注意:最好使用默认的网页文件名;所以我们还需再修改回index.html。
  • 修改httpd服务监听端口号

//修改配置文件,监听8080端口
[root@hzz ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080

//重启服务,加载配置
[root@hzz ~]# systemctl restart httpd

//实验结束还原默认监听端口。

注意:网站存放的目录的权限,能够决定httpd服务的主页能否被访问。

4.2 网站示例

跨年烟花

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>2024烟花</title>
 
<style>
html, body{
   padding:0px;
   margin:0px;
   background:#222;
   font-family: 'Karla', sans-serif;
   color:#FFF;
   height:100%;
   overflow:hidden;
}
h1{
   z-index: 1000;
   position:fixed;
   top:50%;
   left:50%;
   transform:translateX(-50%) translateY(-100%);
   font-size:58px;
   border:2px solid #FFF;
   padding:7.5px 15px;
   background:rgba(0, 0, 0, 0.5);
   border-radius:3px;
   overflow:hidden;
}
span{ 
   position:relative;
   display:inline-block;
   animation: drop 0.75s;
}
canvas {
    width:100%;
    height:100%;
}
 
@keyframes drop {
   0% { 
      transform: translateY(-100px);
      opacity: 0;
   }
   
   90% {
      opacity: 1;
      transform:translateY(10px);
   }
   100% {
      transform:translateY(0px;)
   }
}
</style>
</head>
<body>
 
<canvas></canvas>
 
<h1>202<span>4</span></h1>
 
<script type="text/javascript">
var ctx = document.querySelector('canvas').getContext('2d')
ctx.canvas.width = window.innerWidth
ctx.canvas.height = window.innerHeight
 
var sparks = []
var fireworks = []
var i = 20; while(i--) {
   fireworks.push(
      new Firework(Math.random()*window.innerWidth, window.innerHeight*Math.random())
   )
}
 
render()
function render() {
   setTimeout(render, 1000/60)
   ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';
   ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height)
   for(var firework of fireworks) {
      if(firework.dead) continue
      firework.move()
      firework.draw()
   }
   for(var spark of sparks) {
      if(spark.dead) continue
      spark.move()
      spark.draw()
   }
   
   if(Math.random() < 0.05) {
      fireworks.push(new Firework())
   }
}
 
function Spark(x, y, color) {
   this.x = x
   this.y = y
   this.dir = Math.random() * (Math.PI*2)
   this.dead = false
   this.color = color
   this.speed = Math.random() * 3 + 3;
   this.walker = new Walker({ radius: 20, speed: 0.25 })
   this.gravity = 0.25
   this.dur = this.speed / 0.1
   this.move = function() {
      this.dur--
      if(this.dur < 0) this.dead = true
      
      if(this.speed < 0) return
      if(this.speed > 0) this.speed -= 0.1
      var walk = this.walker.step()
      this.x += Math.cos(this.dir + walk) * this.speed
      this.y += Math.sin(this.dir + walk) * this.speed
      this.y += this.gravity
      this.gravity += 0.05
      
   }
   this.draw = function() {
      drawCircle(this.x, this.y, 3, this.color)
   }
}
 
function Firework(x, y) {
   this.xmove = new Walker({radius: 10, speed: 0.5})
   this.x = x || Math.random() * ctx.canvas.width
   this.y = y || ctx.canvas.height
   this.height = Math.random()*ctx.canvas.height/2
   this.dead = false
   this.color = randomColor()
   
   this.move = function() {
      this.x += this.xmove.step()
      if(this.y > this.height) this.y -= 1; 
      else this.burst()
      
   }
   this.draw = function() {
      drawCircle(this.x, this.y, 1, this.color)
   }
   this.burst = function() {
      this.dead = true
      var i = 100; while(i--) sparks.push(new Spark(this.x, this.y, this.color))
   }
}
 
function drawCircle(x, y, radius, color) {
   color = color || '#FFF'
   ctx.fillStyle = color
   ctx.fillRect(x-radius/2, y-radius/2, radius, radius)
}
 
function randomColor(){
   return ['#6ae5ab','#88e3b2','#36b89b','#7bd7ec','#66cbe1'][Math.floor(Math.random() * 5)];
}
 
function Walker(options){
   this.step = function(){
      this.direction = Math.sign(this.target) * this.speed
      this.value += this.direction
      this.target
         ? this.target -= this.direction
         : (this.value)
            ? (this.wander) 
               ? this.target = this.newTarget() 
               : this.target = -this.value
            : this.target = this.newTarget()  
      return this.direction
   }
      
   this.newTarget = function() {
      return Math.round(Math.random()*(this.radius*2)-this.radius)
   }
   
   this.start = 0
   this.value = 0
   this.radius = options.radius
   this.target = this.newTarget()
   this.direction = Math.sign(this.target)
   this.wander = options.wander
   this.speed = options.speed || 1
}
</script>
 
<div style="text-align:center;margin:50px 0; font:normal 14px/24px 'MicroSoft YaHei';">
<p>适用浏览器:360、FireFox、Chrome、Opera、傲游、搜狗、世界之窗. 不支持Safari、IE8及以下浏览器。</p>
 
</div>
<script>document.write('<script src="//' + (location.host || 'localhost').split(':')[0] + ':35929/livereload.js?snipver=1"></' + 'script>')</script><script>document.addEventListener('LiveReloadDisconnect', function() { setTimeout(function() { window.location.reload(); }, 500); })</script></body>
</html>

粉色爱心

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <style>
  html, body {
  height: 100%;
  padding: 0;
  margin: 0;
  background: #000;
}
canvas {
  position: absolute;
  width: 100%;
  height: 100%;
}
  </style>
 </HEAD>
 
 <BODY>
  <canvas id="pinkboard"></canvas>
  <script>
  /*
 * Settings
 */
var settings = {
  particles: {
    length:   500, // maximum amount of particles
    duration:   2, // particle duration in sec
    velocity: 100, // particle velocity in pixels/sec
    effect: -0.75, // play with this for a nice effect
    size:      30, // particle size in pixels
  },
};
 
/*
 * RequestAnimationFrame polyfill by Erik Möller
 */
(function(){var b=0;var c=["ms","moz","webkit","o"];for(var a=0;a<c.length&&!window.requestAnimationFrame;++a){window.requestAnimationFrame=window[c[a]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[c[a]+"CancelAnimationFrame"]||window[c[a]+"CancelRequestAnimationFrame"]}if(!window.requestAnimationFrame){window.requestAnimationFrame=function(h,e){var d=new Date().getTime();var f=Math.max(0,16-(d-b));var g=window.setTimeout(function(){h(d+f)},f);b=d+f;return g}}if(!window.cancelAnimationFrame){window.cancelAnimationFrame=function(d){clearTimeout(d)}}}());
 
/*
 * Point class
 */
var Point = (function() {
  function Point(x, y) {
    this.x = (typeof x !== 'undefined') ? x : 0;
    this.y = (typeof y !== 'undefined') ? y : 0;
  }
  Point.prototype.clone = function() {
    return new Point(this.x, this.y);
  };
  Point.prototype.length = function(length) {
    if (typeof length == 'undefined')
      return Math.sqrt(this.x * this.x + this.y * this.y);
    this.normalize();
    this.x *= length;
    this.y *= length;
    return this;
  };
  Point.prototype.normalize = function() {
    var length = this.length();
    this.x /= length;
    this.y /= length;
    return this;
  };
  return Point;
})();
 
/*
 * Particle class
 */
var Particle = (function() {
  function Particle() {
    this.position = new Point();
    this.velocity = new Point();
    this.acceleration = new Point();
    this.age = 0;
  }
  Particle.prototype.initialize = function(x, y, dx, dy) {
    this.position.x = x;
    this.position.y = y;
    this.velocity.x = dx;
    this.velocity.y = dy;
    this.acceleration.x = dx * settings.particles.effect;
    this.acceleration.y = dy * settings.particles.effect;
    this.age = 0;
  };
  Particle.prototype.update = function(deltaTime) {
    this.position.x += this.velocity.x * deltaTime;
    this.position.y += this.velocity.y * deltaTime;
    this.velocity.x += this.acceleration.x * deltaTime;
    this.velocity.y += this.acceleration.y * deltaTime;
    this.age += deltaTime;
  };
  Particle.prototype.draw = function(context, image) {
    function ease(t) {
      return (--t) * t * t + 1;
    }
    var size = image.width * ease(this.age / settings.particles.duration);
    context.globalAlpha = 1 - this.age / settings.particles.duration;
    context.drawImage(image, this.position.x - size / 2, this.position.y - size / 2, size, size);
  };
  return Particle;
})();
 
/*
 * ParticlePool class
 */
var ParticlePool = (function() {
  var particles,
      firstActive = 0,
      firstFree   = 0,
      duration    = settings.particles.duration;
  
  function ParticlePool(length) {
    // create and populate particle pool
    particles = new Array(length);
    for (var i = 0; i < particles.length; i++)
      particles[i] = new Particle();
  }
  ParticlePool.prototype.add = function(x, y, dx, dy) {
    particles[firstFree].initialize(x, y, dx, dy);
    
    // handle circular queue
    firstFree++;
    if (firstFree   == particles.length) firstFree   = 0;
    if (firstActive == firstFree       ) firstActive++;
    if (firstActive == particles.length) firstActive = 0;
  };
  ParticlePool.prototype.update = function(deltaTime) {
    var i;
    
    // update active particles
    if (firstActive < firstFree) {
      for (i = firstActive; i < firstFree; i++)
        particles[i].update(deltaTime);
    }
    if (firstFree < firstActive) {
      for (i = firstActive; i < particles.length; i++)
        particles[i].update(deltaTime);
      for (i = 0; i < firstFree; i++)
        particles[i].update(deltaTime);
    }
    
    // remove inactive particles
    while (particles[firstActive].age >= duration && firstActive != firstFree) {
      firstActive++;
      if (firstActive == particles.length) firstActive = 0;
    }
    
    
  };
  ParticlePool.prototype.draw = function(context, image) {
    // draw active particles
    if (firstActive < firstFree) {
      for (i = firstActive; i < firstFree; i++)
        particles[i].draw(context, image);
    }
    if (firstFree < firstActive) {
      for (i = firstActive; i < particles.length; i++)
        particles[i].draw(context, image);
      for (i = 0; i < firstFree; i++)
        particles[i].draw(context, image);
    }
  };
  return ParticlePool;
})();
 
/*
 * Putting it all together
 */
(function(canvas) {
  var context = canvas.getContext('2d'),
      particles = new ParticlePool(settings.particles.length),
      particleRate = settings.particles.length / settings.particles.duration, // particles/sec
      time;
  
  // get point on heart with -PI <= t <= PI
  function pointOnHeart(t) {
    return new Point(
      160 * Math.pow(Math.sin(t), 3),
      130 * Math.cos(t) - 50 * Math.cos(2 * t) - 20 * Math.cos(3 * t) - 10 * Math.cos(4 * t) + 25
    );
  }
  
  // creating the particle image using a dummy canvas
  var image = (function() {
    var canvas  = document.createElement('canvas'),
        context = canvas.getContext('2d');
    canvas.width  = settings.particles.size;
    canvas.height = settings.particles.size;
    // helper function to create the path
    function to(t) {
      var point = pointOnHeart(t);
      point.x = settings.particles.size / 2 + point.x * settings.particles.size / 350;
      point.y = settings.particles.size / 2 - point.y * settings.particles.size / 350;
      return point;
    }
    // create the path
    context.beginPath();
    var t = -Math.PI;
    var point = to(t);
    context.moveTo(point.x, point.y);
    while (t < Math.PI) {
      t += 0.01; // baby steps!
      point = to(t);
      context.lineTo(point.x, point.y);
    }
    context.closePath();
    // create the fill
    context.fillStyle = '#ea80b0';
    context.fill();
    // create the image
    var image = new Image();
    image.src = canvas.toDataURL();
    return image;
  })();
  
  // render that thing!
  function render() {
    // next animation frame
    requestAnimationFrame(render);
    
    // update time
    var newTime   = new Date().getTime() / 1000,
        deltaTime = newTime - (time || newTime);
    time = newTime;
    
    // clear canvas
    context.clearRect(0, 0, canvas.width, canvas.height);
    
    // create new particles
    var amount = particleRate * deltaTime;
    for (var i = 0; i < amount; i++) {
      var pos = pointOnHeart(Math.PI - 2 * Math.PI * Math.random());
      var dir = pos.clone().length(settings.particles.velocity);
      particles.add(canvas.width / 2 + pos.x, canvas.height / 2 - pos.y, dir.x, -dir.y);
    }
    
    // update and draw particles
    particles.update(deltaTime);
    particles.draw(context, image);
  }
  
  // handle (re-)sizing of the canvas
  function onResize() {
    canvas.width  = canvas.clientWidth;
    canvas.height = canvas.clientHeight;
  }
  window.onresize = onResize;
  
  // delay rendering bootstrap
  setTimeout(function() {
    onResize();
    render();
  }, 10);
})(document.getElementById('pinkboard'));
  </script>
 </BODY>
</HTML>

二、LAMP部署搭建

1.1 环境准备

  • 关闭防火墙和selinux

[root@hzz ~]# systemctl stop firewalld	#关闭三个防火墙

[root@hzz ~]# systemctl disable firewalld	#禁止三个防火墙开机自启动

[root@hzz ~]# getenforce 			#查看selinux状态enforcing为强制模式,需修改为关闭状态disabled
Enforcing

[root@hzz ~]# setenforce 0			#先使用此命令临时修改selinux为宽容状态,此状态不影响服务正常运行
[root@hzz ~]# getenforce 
Permissive

[root@hzz ~]# vi /etc/selinux/config		#修改selinux配置文件将SELINUX=enforcing修改为disabled
vi编辑器按i键进行编辑,编辑完成后按Esc键退出编辑模式,开启大写按ZZ(两个z键)保存
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

1.2 安装Apache(httpd)软件

[root@hzz ~]# yum -y install httpd

1.3 安装PHP相关软件

[root@hzz ~]# yum -y install php* --skip-broken

1.4 安装MySQL数据库软件

[root@hzz ~]# yum -y install mariadb mariadb-server mariadb-devel

1.5 启动httpd、php和MySQL服务

[root@hzz ~]# systemctl restart httpd

[root@hzz ~]# systemctl start php-fpm

[root@hzz ~]# systemctl start mariadb

[root@hzz ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

[root@hzz ~]# systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

[root@hzz ~]# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
  • 初始化一下数据库

//初始化一下数据库 每一步我都会给注释
[root@Cloud ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):  #这里直接回车 因为初始数据库没有密码
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y #这里问你要不要设置一个root密码,例如123。这个密码记好 后面要用到的
New password:     #输入新密码
Re-enter new password:     #重复输入
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y  #问你要不要去掉匿名用户 建议选择y去掉
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] n  #要不要禁止root远程登录 我这里没有禁止
 ... skipping.

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y #要不要删除测试用的数据库。这个库没啥用 直接删掉算了
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y #要不要刷新一下授权表。这里y刷新一下 因为改了密码
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB! 
弹出Thanks for using MariaDB之后我们就可以使用了

1.6 测试是否能够解析php页面

[root@hzz ~]# vi /var/www/html/test.php		#编辑一个php文件将下面代码复制进去
<?php
phpinfo();
?>
  • 在浏览器输入http://虚拟机ip地址/test.php。

1.7 商城项目上线

  • 点击网址下载商城源码,解压源码将源码上传至服务器站点目录

下载地址: http://www.phpshe.com

image-20240117141712366

  • 修改站点目录的所有者和所有组为apache

[root@hzz ~]# chown -R apache.apache /var/www/html/

1.8 安装商城系统

  • 在浏览器输入http://虚拟机或服务IP地址/install image-20240117141748305

先访问虚拟机IP+install====192.168.3.6/install设置后台数据,然后即可正常ip访问查看

三、NextCloud私有网盘部署

1、NextCloud简介

  • 关于NextCloud

    NextCloud是一个开源的私有云盘存储项目,可以快速的搭建一套属于自己的网盘平台。也可以给自己的团队使用。除了网盘以外,还提供各种插件的扩展功能,上传下载速度取决于你服务器的带宽。比某盘高到不知道哪里去了

  • 关于环境

    需要服务器提供LNMP或者LAMP环境。安装方法的话,可以把NextCloud简单理解为一个别人写好的网站。我们只需要放在服务器上即可。

  • 关于离线下载

    网盘基本上都有离线下载功能,NextCloud的离线下载用的是Aria2。

2、NextCloud部署配置

2.1 LAMP的搭建

这个地方可以自己手动搭建也可以使用一些一键脚本或者面板来搭建。通过手动搭建可以更好地了解整个过程。所以以下过程全都是手动搭建。

Apache安装配置

  • 通过yum安装apache

[root@Cloud ~]# yum install -y httpd

#开启apache服务并开机自启
[root@Cloud ~]# systemctl start httpd && systemctl enable httpd

#然后我们可以验证一下
[root@Cloud ~]# ss -tnl | grep 80
LISTEN     0      128         :::80                      :::* 

#防火墙记得关掉
[root@Cloud ~]# systemctl stop firewalld
[root@Cloud ~]# systemctl disable firewalld

#SELinux关掉(也可以配置一下安全上下文 但是太麻烦了直接关掉看效果。后期再改都可以)
[root@Cloud ~]# setenforce 0
[root@Cloud ~]# vi /etc/sysconfig/selinux 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled #这里设置成disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are pro
tected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

之后通过自己的ip访问应该会有个默认的测试页面。这里就不展示了 到此为止LAMP中的L和A我们就搞定了。

Mariadb安装配置

  • 通过yum安装Mariadb

[root@Cloud ~]# yum -y install mariadb mariadb-server mariadb-devel

#设置开机自启,启动服务
[root@Cloud ~]# systemctl start mariadb && systemctl enable mariadb

#验证一下
[root@Cloud ~]# ss -tnl | grep 3306
LISTEN     0      50           *:3306                     *:*  

#初始化一下数据库
[root@Cloud ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):  #这里直接回车 因为初始数据库没有密码
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y #这里问你要不要设置一个root密码。这个密码记好 后面要用到的
New password:     #输入新密码
Re-enter new password:     #重复输入
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y  #问你要不要去掉匿名用户 建议选择y去掉
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] n  #要不要禁止root远程登录 我这里没有禁止
 ... skipping.

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y #要不要删除测试用的数据库。这个库没啥用 直接删掉算了
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y #要不要刷新一下授权表。这里y刷新一下 因为改了密码
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB! 

#弹出Thanks for using MariaDB之后我们就可以使用了

#登录数据库 -p 后面的就是你们的密码 不要输入中文“刚才设置的密码”之后就是数据库的操作了。
[root@Cloud ~]# mysql -uroot -p刚才设置的密码 
MariaDB [(none)]> show databases; #先看一下数据库里面有啥
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

#创建一个数据库叫nextcloud_db 默认字符集使用utf8。如果不带这个的话可能会乱码。mysql默认字符集是latin1.不支持中文
MariaDB [(none)]> create database nextcloud_db default charset=utf8;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| nextcloud_db       |
| performance_schema |
+--------------------+
#再看一下数据库 发现多了个nextcloud_db

#给root所有权限使用这个数据库 密码是:123456
MariaDB [(none)]> grant all privileges on nextcloud_db.* to root@'%' identified by '123456';

MariaDB [(none)]> flush privileges;
#刷一下授权

这样数据库的搭建就完成了。最后就剩下php 我们的环境就搭好了

PHP安装配置

nextcloud搭建需要php7.2以上的版本。而如果用本地的 yum安装版本过低不符合搭建的要求。所以这个地方得用一下网络源。或者你选择使用源码安装也可以,但是没必要。这里直接找一个fedora的源去安装7.2的php

  • 首先增加一个源

[root@Cloud ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

[root@Cloud ~]# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
  • 接下来安装一下php7.2

[root@Cloud ~]# yum install -y php72w php72w-devel php72w-pear php72w-pecl php72w-gd php72w-opcache php72w-cli php72w-pdo php72w-process php72w-pecl-apcu php72w-mcrypt php72w-mysql php72w-fpm php72w-pecl-redis php72w-common php72w-xml php72w-mbstring php72w-pecl-igbinary php72w-intl php72w-pecl-imagick

安装好以后改一下apache的配置文件
[root@Cloud ~]# vim /etc/httpd/conf/httpd.conf 
#省略部分输出
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php #加上这一行

#将这个默认目录的权限给apache
[root@Cloud html]# chown -R apache.apache /var/www/html

#写一个php测试页面然后重启httpd服务
[root@Cloud ~]# vim /var/www/html/test.php
<?php
phpinfo();
?>

[root@Cloud html]# systemctl start php-fpm.service && systemctl enable php-fpm.service
[root@Cloud html]# systemctl restart httpd

################之后通过http://服务器的ip/test.php可以看到一个php的测试页面说明配置php环境成功#################

2.2 nextcloud安装

从官网下载nextcloud。

[root@Cloud ~]# wget --no-check-certificate https://download.nextcloud.com/server/releases/nextcloud-18.0.0.zip

然后使用unzip解压 
[root@Cloud ~]# unzip nextcloud-18.0.0.zip

#之后将这个文件夹整个移动到/var/www/html中
[root@Cloud html]# mv nextcloud /var/www/html

#最后给一下权限
[root@Cloud html]# chown -R apache.apache /var/www/html/nextcloud 

然后就可以通过http://服务器ip/nextcloud/index.php 访问进行配置,最后可以通过端口映射来将服务映射出去 到此基本安装就告一段落了

当然 如果映射出去了 从外网访问可能会弹出从不受信任的域名访问。这个时候需要更改一下配置文件

 [root@Cloud nextcloud]#vi /var/www/html/nextcloud/config/config.php 
 array (
    0 => '192.168.2.9',
    1 => '你的公网ip'

3、开启注册功能

下载安装注册插件

image-20240118142242444

配置邮箱验证

注意:个人信息需要填写邮箱地址

常见服务配置文件位置

http:  vim /etc/httpd/conf/httpd.conf

报错解决

一、解决yum报错:错误:Invalid version flag: if

1. 备份默认的yum:
mv /etc/yum.repos.d /etc/yum.repos.d.backup

2. 设置新的yum目录:
mkdir /etc/yum.repos.d


3. 下载阿里yum配置到该目录中,用wget,进行下载
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

4. 重建缓存
yum clean all
yum makecache

5. 升级所有包
yum upgrade -y
yum -y update:升级所有包同时,也升级软件和系统内核;(时间比较久)
yum -y upgrade:只升级所有包,不升级软件和系统内核,软件和内核保持原样

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
广告 广告

评论区