个人学习

产品经理,超级奶爸

0%

大部分的Hexo主题都将文章的分类放在了sidebar上面,并且都是支持多级分类的,然而默认的light主题并没有实现多级分类的功能,主要原因应该是该主题太老了,没人更新了,但是偏偏就有像我这样喜欢它的简洁风格的人。

有折腾就有收获,下面就来了解一下Hexo中是如何实现多级分类的。

阅读全文 »

{}花括号的用法

  • 逗号,分隔多个项目

      echo {a,b,c} #打印出a b c  
      echo user{01,02,03} #打印出user01 user02 user03  
      mkdir a{1,2,3} #创建文件夹a1,a2,a3
  • 连续两点..创建连续序列

      echo a{1..10} #打印出a1 a2 a3 a4 a5 a6 a7 a8 a9 a10  
      mkdir b{1..5} #创建文件夹b1 b2 b3 b4 b5

一、变量

  • typeset 为变量添加只读属性,防止误操作,当你想改值的时候,会报错。

      NAME=pengloo53
      typeset -r NAME
      NAME=pengloo

  • read -p "Please input your name:" NAME 提示符后输入值赋值给变量

  • export NAME 将普通变量转换成环境变量

1、变量的展开替换

  • ${varname:-word} 若varname存在且非null,则返回其值,否则返回word
  • ${varname:=word} 若varname存在且非null,则返回其值,否则设置为word
  • ${varname:?message} 若varname存在且非null,则返回其值,否则显示varname:message
  • ${varname:+word}若varname存在且非null,则返回word,否则返回null
  • ${variable#key} 从头开始删除关键词,执行最短匹配
  • ${variable##key} 从头开始删除关键词,执行最长匹配
  • ${variable%key} 从尾开始删除关键词,执行最短匹配
  • ${variable%%key} 从尾开始删除关键词,执行最长匹配
  • ${variable/old/new}将old替换成new,仅替换第一个出现的old
  • ${variable//old/new}将old替换成new,替换所有的old

2、数组

  • ${name[subscript]}调用数组变量的值,如果subscript为@*则调用所有的数组成员。

      A=(11 22 33)
      echo ${A[0]}  #显示11
      echo ${A[@]}  #显示11 22 33
      echo ${A[*]}  #显示11 22 33
  • ${ #name[subscript]}返回${name[subscript]}的长度。

      B=(aa bbb cccc)
      echo ${ #B[2]} #显示4(cccc字符串的长度)
      echo ${ #B[@]} #显示3(数组成员个数)

3、算数运算

expr命令工具大部分应该都知道,如下:

  • expr 8 + 4 加法
  • expr 8 - 4 减法
  • expr 8 \* 4 乘法
  • expr 8 / 4 除法

然而你也可以通过变量表达式来进行算术运算,语法为:$((expression)),例如:

  • $((x+y))
  • $((x-y))
  • $((x*y))
  • $((x/y))
  • $((x%y)) 取余
  • $((x++)) 自加
  • $((x--)) 自减
  • $((x**y)) 幂运算

4、测试运算

命令行工具test ,应该不陌生,这里举几个例子就清楚了。

  • test -d /etc/ && echo "yes" || echo "no" /etc/是目录就显示yes,不是就显示no,它等价与[ -d /etc/ ] && echo "yes" || echo "no"

一对中括号就替代了test,这里注意的是,中括号左右都要留有空格。

二、正则表达式

1、基本正则表达式(grep)

  • . 任意单个字符
  • * 匹配前一个字符出现零次或者多次
  • [] 匹配集合中任意单个字符
  • [x-y] 匹配连续的字符串范围
  • ^ 匹配字串的开头
  • $ 匹配字串的结尾
  • [^] 集合取反
  • \ 转义后的字符串
  • \{n,m\} 匹配前一个字符重复n到m次
  • \{n,\} 匹配前一个字符重复至少n次
  • \{n\} 匹配前一个字符重复n次
  • \(\)\(\)之间的内容存储在『保留空间』,最大存储9个
  • \n 通过\1\9调用保留空间中的内容

除了最后两个,其他的都比较好理解,针对最后两个举个例子:grep --color "\(root\)\(:\).*\2\1" /etc/passwd 筛选出以root:开头,以:root结尾的行。

2、扩展的正则表达式(egrep)

  • + 匹配前一个字符出现一次或者多次
  • ? 匹配前一个字符出现零次或者一次
  • | 匹配逻辑or
  • () 匹配正则集合

egrep --color '(root|admin)' /etc/passwd 找出包含root或者admin的行。

3、Others

除了上述的一些表达式,还有基于其他规范的正则表达式,例如POSIX规范以及GNU规范。这里不列举了,可以自行搜索了解。

几乎所有的Hexo主题都是响应式布局的主题,在现在这个多屏的时代,特别是移动互联网时代,一个网站如果没有做成响应式的布局都不好意思拿出来,所以响应式布局非常的重要。

什么是响应式布局?响应式布局就是一套网页样式适应所有的屏幕,站点的内容不变,但是随着屏幕的大小不一样,网页的布局会随之改变。如下图所示。

阅读全文 »

通过前面的介绍,Hexo站点的布局应该了解得差不多了,这次主要介绍一下如何使用Hexo自带的帮助函数在站点中添加归档以及文章目录。添加这两块功能都是使用了Hexo提供的帮助函数,创建对应局部模块之前,首先要想想这两块内容应该属于哪个布局?要添加到哪个局部模块下?考虑这些是为了整洁性,当你添加的东西越来越多的时候才不至于令自己混乱。

阅读全文 »

上一篇大致介绍了Hexo站点的布局,每个主题的布局结构是不一样的,但是都是类似的,所以明白了Hexo生成站点的原理就能看懂所有主题的布局,这里还是以主题light-ch为例来讲解如何添加一个新的布局resume.ejs

1、在layout文件夹中添加布局文件

想要一个新的布局,要么通过对layout的判断在article.ejs局部模块中修改,要不就是新建一个resume.ejs布局文件,指向另外一个局部模块。这里我选择了后面一种方法,避免混乱。

首先在layout文件下创建resume.ejs文件,里面代码如下:

1
<%- partial('_partial/resume') %>

它指向的是一个局部模块,里面就是想要显示的样式了。把它替换到layout.ejs文件中<%- body %>的位置上就是你的resume页面了。

假如这里替换到<%- body %>的样式也不是我想要的,那么就可以修改layout.ejs文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%- partial('_partial/head') %>
<body>
<header id="header" class="inner"><%- partial('_partial/header') %></header>
<% if(page.layout == 'resume') {%>
<%- body %>
<% }else{ %>
<div id="content" class="inner">
<div id="main-col" class="alignleft"><div id="wrapper"><%- body %></div></div>
<aside id="sidebar" class="alignright"><%- partial('_partial/sidebar') %></aside>
<div class="clearfix"></div>
</div>
<% } %>
<footer id="footer" class="inner"><%- partial('_partial/footer') %></footer>
<%- partial('_partial/after_footer') %>
</body>
</html>

我只想要保留header以及footer的部分,其他的部分我想单独设计,那么如上加个判断条件就行了。当布局为resume的时候,完全按照我的_partial/resume模版样式。那么接下来就是考验设计网页的功底了。

2、resume布局的局部模块

_partial目录下创建resume.ejs局部模块,这里的内容就是想显示的页面布局了,可以发挥自己的设计能力,设计一个漂亮的页面,我的示例代码如下:

1
2
3
4
5
6
7
8
9
10
<div class="resume">
<div class="resume-left">
<img src="/image/avatar/psb.jpg" alt="photo">
<span>Email:</span>
<a href="#">1911986273@qq.com</a>
</div>
<div class="resume-entry">
<%- page.content %>
</div>
</div>

页面结构有了,下面就要添加样式文件了,你可以在source/css/_partial/目录中添加resume.styl,然后在source/css/style.styl中引入(在最后一行加入@import '_partial/resume')就行了。

3、在页面中添加page

通过命令hexo new page resume创建一页,Hexo会自动在根目录下的source文件夹下创建resume文件夹,文件夹下有index.md文件,编辑index.md写上你的简历主要内容。

index.md的前置声明一定要加上layout: resume,不然你的布局就形同虚设了。(如果不设置,默认会是page布局)

 source/
    ├── _drafts/
    ├── _posts/
    ├── resume/
        ├──index.md

然后打开主题light-ch目录下的_config.yml配置文件,在menu下添加一行代码。

menu:
    首页: /
    个人简历: /resume

至此,大功告成,浏览一下个人简历页面。Demo

刚看完Hexo Docs中模版那一部分的时候,很多地方不明白,这里就来谈谈Hexo的站点是怎么生成的?布局指的是什么?了解了这些,就可以对你的站点布局『为所欲为』了。

Every templates apply to layout template by default.
每个模板都默认使用layout布局。

阅读全文 »

背景

CentOS上搭建meiupic图床(一个PHP写的开源相册),之前也搭建过PHP的LNMP环境,但是那是很长时间的事了,并且当时使用的是Ubuntu Server版本服务器。本以为很快就搭建OK,却还是折腾了一晚上,真是惭愧…

一、CentOS配置网络

本是一件多简单的事,不就是在配置文件/etc/sysconfig/network-scripts/ifcfg-eth0里写入下面这几行配置嘛。

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes

ipaddr=192.168.1.123
netmask=255.255.255.0
gateway=192.168.1.1

可是还真是奇了怪了,一重启,IP就自动变了,随机分配了。明明配置的是静态IP啊。耗了我老长时间找原因了,最后照着书上一个一个校对,最后发现把ipaddrnetmaskgateway都改成大写的就行了。。(PS. 记得在Ubuntu上没有区分啊,难道我记错了~郁闷)

二、Nginx

1、安装

教程很多,贴一条备用,没准哪天又忘了怎么编译安装了。以前在Ubuntu上都是直接sudo apt-get install nginx,可是在CentOS里貌似默认没有,学会编译安装nginx还有必要的。而且编译安装的版本使用起来有一些差异。

Nginx安装

注意点:

  • pcre不要选择最新版pcre2,选择pcre2会报错,有能力解决者可以自行选择;
  • 源码全部下载在/usr/local/src/目录下,便于管理。

2、使用

重新启动service nginx restart?No,No,No,别被自动安装的软件惯坏了,nginx应该这么用。

  • /usr/local/nginx/nginx 启动主程序,安装目录下运行nginx,我的版本是1.7,其他版本nginx执行文件也许不在nginx目录下
  • /usr/local/nginx/nginx -s reload 重新加载
  • /usr/local/nginx/nginx -s stop 停止

当然不想输入那么长的路径也行,创建一个快捷方式,如果还是想使用service命令也行,在/etc/init.d目录下创建快捷方式。命令如下:

cp -s /usr/local/nginx/nginx /etc/init.d/

三、MySQL设置root密码

安装MySQL的方法倒是跟之前没两样,偷懒的方法就这样yum install -y mysql*,OK,一股脑全装上了,装完设置root密码方法如下:

方法1: 用SET PASSWORD命令

mysql -u root
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

方法2:用mysqladmin

1
2
3
mysqladmin -u root password "newpass",
如果root已经设置过密码,采用如下方法:
mysqladmin -u root password oldpass "newpass"

方法3: 用UPDATE直接编辑user表

mysql -u root
mysql> use mysql;
mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;

在丢失root密码的时候,可以这样

mysqld_safe --skip-grant-tables&
mysql -u root mysql
mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='root';
mysql> FLUSH PRIVILEGES;

瞅一眼密码啥样…

四、php+nginx配置

这次花费最长的时间就是这块了,之前基本没怎么接触过PHP开发,php的开发环境更是半知不解。其实这次搭建完也是半知不解。

想要nginx解析php文件,那么需要安装php-fpm,它是个啥?

FastCGI Process Manager:FastCGI进程管理器,fpm能根据访问的压力动态的唤起cgi进程和销毁以到达动态的调整cgi数量,这样可以有效的使用内存。

跟着yum install php*命令,全安装上了。

接下来就是配置nginx了,使其能够解析并转发meiupic开源相册,我将相册源代码解压到了/usr/www/目录下了,然后就是配置nginx了,打开nginx配置文件,vim /usr/local/nginx/nginx.conf,找到http下的server区域,改成如下:

...此处省略
http {
    ....
    server{
        listen    8080;
        server_name    192.168.1.123;
        location / {
            root    /usr/www;
            index    index.php;
        }
        location ~ \.php$ {
            root    /usr/www;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index    index.php;
            fastcgi_param    SCRIPT_FILENAME    /scripts$fastcgi_script_name;
            include    fastcgi_params;        
        }
    }
}
...省略若干

listen端口,我将默认的80改成了8080,server_name改成本机的IP,root改成php开源项目的源代码目录,然后最重要的那段php的配置当然不是我写的,只是将默认对PHP的配置注释给去掉了,改一下root就完事了。

好了,迫不及待的想试一试了。依次检查各种服务是否正常,nginx、mysql、php-fpm….启动了的重启一下,没有启动的启动一下。

service mysqld restart  
service php-fpm restart  
/usr/local/nginx/nginx -s reload  

OK ~浏览器运行http://192.168.1.123:8080,第一次嘛,必然是没有反应的。出现问题并不可怕,主要是要知道怎么找原因。

  1. 首先想到的就是网络是否通,主机ping 192.168.1.123,OK!
  2. 然后测试页面是否从服务器返回了,很显然在主机上测试是没有返回页面,而不是返回404。那么测试一下在虚拟机中是否返回页面了,没有浏览器怎么玩?没事,curl 192.168.1.123:8080,抓取页面代码。返回了。

好了,原因找到了,网络是通的,而页面无法访问,可是本地可以访问,这么一讲,就知道是防火墙的问题了。

五、设置防火墙

防火墙的配置是Linux运维的重点内容,CentOS默认只开通了22端口的访问配置。这里我们需要开启端口8080,亦或是关闭了它(当然不建议这么做)。

教程很多,或是直接看man iptables,你会学到很多。关于防火墙的配置文件是/etc/sysconfig/iptables,学习就靠自己了。

关闭的方法:service iptables stop

OK,设置好防火墙后,又是一系列重启服务操作,然后浏览器访问,这次不报错了,可是File Not Find,what’s the fuck!

六、fastcgi_params

最后找到就是fastcgi_params配置的问题,中间寻找答案的艰辛就不多说了,这里记下,给自己提个醒,同时给新人指路。我也是从前人那里找到的答案。

nginx调用php-fpm出错解决方法和nginx配置详解

问题就在上面nginx配置文件中的的这两句:

1
2
fastcgi_param	SCRIPT_FILENAME	/scripts$fastcgi_script_name;
include fastcgi_params;

解决方法有两种(其实是一个意思):

  1. 把第一句改成如下:
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  2. 或者把第二句改成如下:
    include fastcgi.conf

为什么说一样,可以自行查看一下,nginx安装目录下,fastcgi_param以及fastcgi.conf这两个文件的内容差异。

vim -O /usr/local/nginx/fastcgi_params /usr/local/nginx/fastcgi.conf

解决完这个问题后,又是一堆服务的重启,然后浏览器打开http://192.168.1.123:8080,OK,运行安装程序了。

七、安装meiupic

目录权限问题,到/usr/www目录下,设置一下,各个文件目录的访问权限。如果嫌麻烦,直接chmod 777 /usr/www/*,到这里基本就完成了。

忘记root登录密码,怎么办?

  1. 开机出现GRUB引导程序时,按e编辑GRUB引导参数
  2. 选择以kernel开始的行按e进行编辑
  3. 在kernel行末尾加上single后回车,按b启动系统进入单用户模式
  4. 在单用户模式下输入命令passwd root,输入两次密码
  5. 修改成功,shutdown -r now重启系统
  6. 新密码登入,成功。
  • history命令显示所有命令记录,然后通过!命令编号调用该命令
  • 清屏命令大家都知道clear,还有一个快捷键更方便——ctrl+l
  • Vim普通模式下输入ZZ,可以实现保存并退出文档
  • echo "hello123" | passwd --stdin jack 通过管道为用户jack设置密码
  • uptime 监控CPU使用情况

一、ACL访问控制权限

两个命令:getfaclsetfacl

  • getfacl 查看文档的ACL权限
  • setfacl 设置文档ACL权限
    • -b 删除所有附加的ACL条目
    • -k 删除默认的ACL
    • -m 添加ACL权限
    • -x 删除指定的ACL条目
    • -R 递归处理所有的子文件与子目录

示例

  • getfacl 2.log 查看文档2.log的ACL权限
  • setfacl -m u:user01:rw 2.log 添加ACL条目,使用户user01对2.log文件可读可写
  • setfacl -m g:group01:r 2.log 使用户组group01对文件2.log有可写权限
  • setfacl -x u:user01 2.log 删除用户user01的ACL条目
  • setfacl -x g:group01 2.log 删除组的权限
  • setfacl -b 2.log 清除文件2.log所有ACL权限

二、磁盘分区

之前在一篇笔记里已经介绍了fdisk命令的用法,这里就不重复了,这里说一下另外两个命令partprobeparted

  • partprobe /dev/sdb 让内核立即读取新的分区表,无需重启电脑就可以识别新创建的分区
  • parted GPT分区方式,不同与传统的MBR分区(使用fdisk

三、开机启动

学习开机启动命令,先要了解Linux的6种运行级别。

  • 0 关机模式
  • 1 单用户模式
  • 2 无NFS(共享服务)网络的字符界面模式
  • 3 全功能字符界面模式
  • 4 暂时未定义使用
  • 5 图形模式
  • 6 重启模式

通过runlevel命令可以查看当前所处的运行级别。服务器版本的Linux一般都是3级别,通过init命令可以改变当前的运行级别,如init 0命令可以直接关机.

好了,可以进入正题了,如何设置开机启动呢?使用命令chkconfig,用法如下:

  • chkconfig --list 查询系统服务运行级别信息
  • chkconfig --level 指定操作的运行级别,不指定级别时默认为2,3,4,5级别
  • 实例:
    • chkconfig --list sshd 查看sshd命令的运行级别
    • chkconfig sshd on 设置sshd服务在2.3.4.5级别开机启动

四、内存和硬盘使用情况

1、内存使用

内存的使用情况查看命令,应该很熟悉了,那就是free,但是你真的知道显示出来的各个数据都代表的是什么意思吗?至少之前我是没怎么去了解。

每次看的时候,也就扫了一眼,总共498M,用了263M,还剩235M,就完事了。其他的数据就没怎么看了,这里简单介绍一下其他数是什么含义。

在Linux开机后就会预先提取一部分内存,并划为buffer与cache以供进程随时使用。第一行的used就是这部分内存数263,而后面的buffers代表的是buffer使用剩余的内存数65,cached就是cache剩余的内存数145。那么buffer和cache用了多少呢?第二行中used就是buffer和cache使用的内存数51,那么就有等式263=65+145+51,接下来446系统总剩余的内存数,为分配的有235,分配了但是没有用完的有65+145,那么446=65+145+235

细心的读者也许一眼就看出了,等式根本不等嘛!别着急,换成字节单位,你再算算!至于原因就很明了了

2、硬盘使用

这里就补充两点。

1、df -hTT的参数代表显示文件系统

2、df -ii代表的是磁盘inode使用量信息

这里可以看出根分区还剩下313077个inode节点,也就是说如果在更分区下创建313077个空文件,那么就算该磁盘还有容量也再也容不下新增文件了。

五、网络

1、网络参数设置

有两种方式设置网络参数,一是通过命令行设置;二是通过修改参数文件。

命令行设置不外乎ifconfigroute这两个命令,具体使用可以自行查询帮助文档,这里介绍一下修改参数文件来设置网络。

网络的参数文件在/etc/sysconfig/network-scripts/ifcfg-<iface>,其中iface为网卡接口名称。如果只有一块以太网网卡,则一般为ifcfg-eth0,文件有一下字段:

  • DEVICE 设备名称 eh0,eth1...
  • TYPE 设备类型 ethernet
  • BOOTPROTO 启动协议 none|dhcp|static
  • HWADDR 硬件地址 MAC地址
  • NM_CONTROLLED 网卡是否可以被NetworkManager控制 yes|no
  • ONBOOT 开机是否启动该网卡 yes|no
  • ONPARENT 真实接口启动后虚拟接口是否启动 yes|no
  • IPADDR IP地址
  • PREFIX 网络位掩码个数
  • NETMASK 子网掩码
  • GATEWAY 默认网关
  • DNS{1,2} DNS服务器

如我网卡eth1设置静态IP,配置如下图

2、网络故障排错

这块主要介绍5个命令,pingtraceroutenslookupdignetstat

ping 非常常用的命令,测试基本如下步骤

  1. ping 127.0.0.1 ping本地回环,测试本地网络协议是否正常
  2. ping 192.168.1.101 ping本地IP,测试本地网络接口是否正常
  3. ping 192.168.1.1 ping本地网关,测试网关是否正常工作
  4. ping 61.135.169.121 ping外部网络,测试服务商网络是否正常工作
  5. ping www.baidu.com ping网址,如果上述都正常,而这步ping不通,那么肯定是DNS的问题了

traceroute 跟踪数据包的路由过程

nslookup 检测本地设置的DNS服务器工作是否正常

nslookup www.baidu.com 检测本地DNS服务器是否能解析到百度,本地设置的DNS服务器是8.8.8.8,检测到百度对应的两个IP地址

dig 查看更多关于DNS记录的信息

dig www.baidu.com 能显示比nslookup更详细的信息

netstat 网络监控命令
该命令比较强大,可以自行查看帮助文档学习,netstat -nutlp 查看当前系统开启端口信息。