进入 vim

命令描述
vim filename打开或新建文件, 并将光标置于第一行首
vim +n filename打开文件,并将光标置于第 n 行首
vim + filename打开文件,并将光标置于最后一行首
vim +/pattern filename打开文件,并将光标置于第一个与 pattern 匹配的串处
vim -r filename在上次正用 vim 编辑时发生系统崩溃,恢复 filename
vim filename….filename打开多个文件,依次编辑

vim 配置

命令描述
all列出所有选项设置情况
term设置终端类型
ignorance在搜索中忽略大小写
list显示制表位 (Ctrl+I) 和行尾标志($)
number显示行号
report显示由面向行的命令修改过的数目
terse显示简短的警告信息
warn在转到别的文件时若没保存当前文件则显示 NO write 信息
nomagic允许在搜索模式中,使用前面不带 “\” 的特殊字符
nowrapscan禁止 vi 在搜索到达文件两端时,又从另一端开始
mesg允许 vi 显示其他用户用 write 写到自己终端上的信息
:set number / set nonumber显示 / 不显示行号
:set ruler /set noruler显示 / 不显示标尺
:set hlsearch高亮显示查找到的单词
:set nohlsearch关闭高亮显示
:syntax on语法高亮
:set nu显示行号
:set tabstop=8设置 tab 大小, 8 为最常用最普遍的设置
:set softtabstop=84:4 个空格, 8: 正常的制表符, 12: 一个制表符 4 个空格, 16: 两个制表符
:set autoindent自动缩进
:set cindentC 语言格式里面的自动缩进

移动光标

命令描述
k nk上 向上移动 n 行
j nj下 向下移动 n 行
h nh左 向左移动 n 行
l nl右 向右移动 n 行
Space光标右移一个字符
Backspace光标左移一个字符
Enter光标下移一行
w/W光标右移一个字至字首
b/B光标左移一个字至字首
e 或 E光标右移一个字至字尾
)光标移至句尾
(光标移至句首
}光标移至段落开头
{光标移至段落结尾
n$光标移至第 n 行尾
H光标移至屏幕顶行
M光标移至屏幕中间行
L光标移至屏幕最后行
0(注意是数字零)光标移至当前行首
^移动光标到行首第一个非空字符上去
$光标移至当前行尾
gg移到第一行
G移到最后一行
f移动光标到当前行的字符 a 上
F相反
%移动到与制匹配的括号上去(),{},[],<> 等
nG移动到第 n 行上
G到最后一行

屏幕滚动

命令描述
Ctrl+u向文件首翻半屏
Ctrl+d向文件尾翻半屏
Ctrl+f向文件尾翻一屏
Ctrl+b向文件首翻一屏
nz将第 n 行滚至屏幕顶部,不指定 n 时将当前行滚至屏幕顶部

插入文本类

命令描述
i在光标前
I在当前行首
a光标后
A在当前行尾
o在当前行之下新开一行
O在当前行之上新开一行
r替换当前字符
R替换当前字符及其后的字符,直至按 ESC 键
s从当前光标位置处开始,以输入的文本替代指定数目的字符
S删除指定数目的行,并以所输入文本代替之
ncw/nCW修改指定数目的字
nCC修改指定数目的行

删除命令

命令描述
x/X删除一个字符,x 删除光标后的,而 X 删除光标前的
dw删除一个单词 (删除光标位置到下一个单词开始的位置)
dnw删除 n 个单词
dne也可,只是删除到单词尾
do删至行首
d$删至行尾
dd删除一行
ndd删除当前行及其后 n-1 行
dnl向右删除 n 个字母
dnh向左删除 n 个字母
dnj向下删除 n 行, 当前行 + 其上 n 行
dnk向上删除 n 行, 当期行 + 其下 n 行
cnw[word]将 n 个 word 改变为 word
C$改变到行尾
cc改变整行
shift+j删除行尾的换行符,下一行接上来了

复制粘贴

命令描述
p粘贴用 x 或 d 删除的文本
ynw复制 n 个单词
yy复制一行
ynl复制 n 个字符
y$复制当前光标至行尾处
nyy拷贝 n 行

撤销

命令描述
u撤销前一次的操作
shif+u(U)撤销对该行的所有操作

搜索及替换

命令描述
/pattern从光标开始处向文件尾搜索 pattern
?pattern从光标开始处向文件首搜索 pattern
n在同一方向重复上一次搜索命令
N在反方向上重复上一次搜索命令
cw newword替换为 newword
n继续查找
.执行替换
:s/p1/p2/g将当前行中所有 p1 均用 p2 替代, g 表示执行 用 c 表示需要确认
:n1,n2 s/p1/p2/g将第 n1 至 n2 行中所有 p1 均用 p2 替代
:g/p1/s//p2/g将文件中所有 p1 均用 p2 替换
:1,$ s/string1/string2/g在全文中将 string1 替换为 string2

书签

命令描述
m[a-z]在文中做标记,标记号可为 a-z 的 26 个字母
`a移动到标记 a 处

visual 模式

命令描述
v进入 visual 模式
V进入行的 visual 模式
ctrl+v进如块操作模式用 o 和 O 改变选择的边的大小
在所有行插入相同的内容如 include<将光标移到开始插入的位置,按 CTRL+V 进入 VISUAL 模式,选择好模块后按 I(shift+i),后插入要插入的文本,按 [ESC] 完成

行方式命令

命令描述
:n1,n2 co n3 或者 :n1,n2 copy n3将 n1 行到 n2 行之间的内容拷贝到第 n3 行下
:n1,n2 m n3 或者 :n1,n2 move n3将 n1 行到 n2 行之间的内容移至到第 n3 行下
:n1,n2 d将 n1 行到 n2 行之间的内容删除
:n1,n2 w!command将文件中 n1 行至 n2 行的内容作为 command 的输入并执行之
若不指定 n1,n2,则表示将整个文件内容作为 command 的输入

命令描述
q[a-z]开始记录但前开始的操作为宏,名称可为【a-z】,然后用 q 终止录制宏
reg显示当前定义的所有的宏,用 @[a-z] 来在当前光标处执行宏 [a-z]

窗口操作

命令描述
:split分割一个窗口
:split file.c为另一个文件 file.c 分隔窗口
:nsplit file.c为另一个文件 file.c 分隔窗口,并指定其行数
ctrl+w在窗口中切换
:close关闭当前窗口

文件及其他

命令描述
:q退出 vi
:q!不保存文件并退出 vi
:e filename打开文件 filename 进行编辑
:e!放弃修改文件内容,重新载入该文件编辑
:w保存当前文件
:wq存盘退出
:ZZ保存当前文档并退出 VIM
:!command执行 shell 命令 command
:r!command将命令 command 的输出结果放到当前行
:n1,n2 write temp.c
:read file.c将文件 file.c 的内容插入到当前光标所在的下面

常用正则

  • 删除行尾空格::%s/\s+$//g
  • 删除行首多余空格:%s/^\s*// 或者 %s/^ *//
  • 删除沒有內容的空行:%s/^$// 或者 g/^$/d
  • 删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
  • 删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
  • 清空某一行或多行文本::n1,n2 s/\w//g
  • 给一行或多行首字符添加注释:n1,n2 s/^/#/g
  • 给一行或多行首字符删除注释:n1,n2 s/^#//g

Update: 2018-12-17,最近又有亲戚朋友需要这个功能,把代码提炼的一下,可以在链接中加入唯一 key。另外说一下主流浏览器似乎 HTTP 获取不到位置权限?

背景

昨天下午,在家闲的蛋疼,准备写一个自己的项目,想在年前给自己一个礼物(我才不会说这项目我拖了好久了,懒癌晚期我也很绝望)。打开环境,正当我提臀收腹摆好姿势准备开始写的时候。

我一个大表哥微信突然找我了,菊花一紧。毕竟这不经常联系的朋友突然找你肯定没啥好事儿,无事不登三宝殿。颤抖的划开微信,对话如下:

表哥:在?现在有没有手机定位的软件?

我:应该有,问问我朋友。

我一想,你这是要跟踪谁呀?没多想,便跑去问我一个会做 Android APP 的朋友。正在讨论打包隐藏图标,后台自动唤醒,定时发送地理位置等等一大堆技术实现问题的时候。

还没等我问完,表哥又回消息了。

表哥:我有他车牌号。

我:?

表哥:还有他手机号和微信号。

我:??

我:你找他干嘛啊?

表哥:他欠我钱,法院都在找他。

我:我能做的是在他手机上安装一个 APP。

表哥:我能找他还让你定位?

对不起!公安和电信我能拿到接口我还敲什么代码,早就坐着收钱了。

和我大表哥聊完,正准备写我的项目,表哥又来消息了。

表哥:有人给我推了一个微信号,可以做定位的。

表哥:需要跟踪定位可以安装公司定位软件到自己手机里,以后不管这个人去哪儿都能跟踪监控,费用 1000 元先交定金 400 元,十分钟绑定到你手机,可长期使用,没有额外费用。

表哥:[视频](骗子的空壳 APP 介绍视频)

表哥:[视频](骗子的截取电影里定位视频)

我:这是骗子,你放心的去吧。

表哥:。。

表哥:怎么可能喔。

我去,这么赤裸裸的骗术你都能相信,我这就很绝望了,你是愿意相信他也不相信我是吧?

那好吧,终极大招。

我:那你让他定你的位置看看,还让你交定金就直接删掉。

表哥:嗯,好。

我就不信这骗子还能怎么编理由。我就不信你今天还真把位置给定出来了。

然而,十分钟后。

表哥:你看,真的可以定位!

表哥:[图片](骗子发的表哥地图位置)

我顿时就诧异了,脑海里第一个想的是你不会被人给装上啥软件了吧?

我:他没给你发软件吧?

表哥:没有啊,真的定位到我的位置了。

背后冷汗惊起,莫非这人真是大佬?抓微信包分析地理位置?这么玄乎?

我还是不敢相信,社会乱套成这样了?一个手机号、微信号就能随便定位别人的详细位置?

我:把你和他的聊天记录我看看。

表哥:图片

我:。。。

看到聊天记录我瞬间惊呆,还有这操作。人家让你点你就点?这特么的不就获取你的地理位置了吗?

我:这么 low 的操作?这我也可以呀。

表哥:那好呀,你快帮我做,我晚上要去找他。

我:那个。。

实现

首先能利用的是 HTML5 的地理位置接口,和一个后端进行保存日志。

不过 HTML5 的地理位置接口 需要用户手动确定权限,这肯定是有风险一半一半,没办法。

前端部分代码

// index.php
.
.
.
<script>
function getLocation()
{
    console.log('start...');
    if (navigator.geolocation)
    {
        console.log('authorization...');
        navigator.geolocation.getCurrentPosition(showPosition);
    }else{
        console.log('failed...');
        $.post('/backend.php', {
            'key': "<?php echo $_GET['key'] ?? 'unknow';?>",
            'message': "Permission denied.",
        }, function() {}, 'JSON');
    }
}

function showPosition(position)
{
    console.log('success...');
    $.post('/backend.php', {
        'key': "<?php echo $_GET['key'] ?? 'unknow';?>",
        'message': "Bingo!",
        'latitude': position.coords.latitude,
        'longitude': position.coords.longitude
    }, function() {}, 'JSON');
}

getLocation();
</script>

后端部分代码

<?php
file_putypecho_contents('./location.log', '[' .date("Y-m-d H:i:s") .'] '. $_POST['key'] . '-' . $_POST['message'] . ' ' . json_encode($_POST) . PHP_EOL , FILE_APPEND);

监听日志

$ tail -f location.log

对,没错,这么 low 的代码,居然敢卖 1000。

对着朋友测试了一下,精确度有点低,大概差个 1 KM 吧。。

精度比较:PC <= 打开 Wi-Fi 设备 < 打开移动数据的设备

看来我得申请个小号去卖定位了,还写什么代码。

后续

晚上,我哥给发消息,让我把字(title)改一下,就是那个连接分析后的标题,最开始我给的是新闻,但是想想,谁没事儿蛋疼点你无关痛痒的新闻呐。于是。。

律师函

我太佩服我自己脑洞了,先不管对不对,看见这标题你慌不慌?何况还是一个躲债的人。你点不点?

然后呀,我哥就发给他了,立马上钩,日志就刷刷刷有反应了,一分钟内点了五次。为什么?因为打开是空白呀!(我似乎能脑补出他当时的场景,哈哈哈哈哈哈。。。)

日志

高兴的复制上经纬度,打开高德地图。Bingo~

定位地址

现在是能定位了,不过精度并不高,只能慢慢去找。

我:定出来了,你去看看。

表哥:好,我现在在路上。

我:你过去怎么找他?

表哥:找车牌呀。

我:。。

那就祝你好运咯,手动微笑脸。就这样,明天还要上班,就很早就睡了。

第二天。

表哥:你定的那个位置不准呀,我找了一晚上都没找到。

我:经纬度肯定有误差的,可能定的是附近的基站的位置。

表哥:。。

表哥:要不我再把链接给他发一次?

我:同样的套路别人能上当几次?

然后他还是发过去了,然而,日志再也没有增加一个字符。对此,我深表遗憾,没办法。怪我没有公安或电信的接口,再次手动微笑。你以为这就完了?

才不!不然我会来更新博文?

表哥:找到他了。

我:嗯嗯,好。

表哥:就在定位的附近。

我:哈哈,过年回来找你要红包!

总结

这次事件真的让我感触颇深,第一,帮朋友家人修电脑一类的,搞好了皆大欢喜,那你要是搞不好。。“看来你技术还没到家呀!”、“你能力还不够呀!我听人家说XXXX”,反正就是各种姿势嘲讽,站在道德制高点认为帮他是你的本分,拜托我一个写代码的你为难我干啥;第二,最重要的一点,不!要!点!开!陌!生!的!链!接!

你永远不知道屏幕背后的是人是狗。——我也不知道谁说的

本没打算这么早写总结,估摸着也是月底的事儿,但突发的肾结石让我在医院里实在闲得蛋疼。住院已经四天了,每天除了吃喝拉撒,其余时间便躺在病床上回想这过去的一年。

结石 I

接着结石说,在大学的时候就因为结石去过医院,记得是凌晨 4 点,在床上睡得正香莫名其妙的肚子疼,一边心里细细捣鼓着昨晚吃啥不该吃的了,一边又爬起来去厕所蹲着。那时候冷啊,得披上外套,可我在厕所还硬是蹲出了汗。估摸着半个钟过去了也没见便出来,真是见鬼了。立马冲了厕所回床上躺着,被窝都凉了。躺着躺着实在觉得奇怪,我怎么腰也疼啊?肾亏?别呀!我还小,还没结婚呐。被窝是好不容易暖和了,但是我躺不住了。也没敢叫室友,一个人穿上衣服,就往校医院走,中途在 ATM 机取钱的时候,直接疼得蹲下了。抬头看看周围,天还没亮,等会儿我要是在什么地方晕倒了会不会有人发现我呢?越想越怕。

「老子堂堂七尺男儿?能把我疼成啥样?」

我试着直起身子来,和病痛正面刚。

「哎呦,龟孙!TMD!」

刚不过刚不过。

这结石啊是真的能把你的脾气磨得一点都没有。终于一步一步挪到校医院,到了就傻眼了。没!开!门!你经历过绝望吗?掉头又往校门口走,心想着这大晚上去哪儿看病啊?怎么去啊?最近的医院也要好几公里呀。幸运的是,门口有跑客的师傅。这大冷天的,看到他们却很是格外亲切。上了一辆车,蜷缩着在副驾驶。

「去哪个医院?」

「最近的,最近的。」

一路上师傅和我谈了什么已经模糊不清了。到了医院,师傅指着急症方向让我去哪边问问。到了医院感觉就像抓住了救命稻草一样。一番检查下来,肾结石。在等待结果的过程中,腰也没那么疼了。拿着药走到医院门口,发现天已经蒙蒙亮了。看着黎明的曙光,像是见到老朋友一般。

结石 II

这次结石其实之前一直有预兆,不过没太注意。尿频尿急可以算得上是一个参考,另外左腰也时不时的会酸。可我没想过又是结石啊!可能和最近熬夜和一天两罐红牛也有关系。

早上六点,又是肚子疼疼醒了。和之前一样,蹲在厕所里想头天晚上吃啥了。

「鸭脖!」

诶呀,我就知道不是个好东西。一遍骂一遍拉,拉完了发现肚子还疼得厉害。遂起身去楼下小诊所打算买点药。

又!没!开!门!

没办法,又捂着肚子掉头回家。蜷缩在床上期待能有所好转,emmm…怎么腰也隐隐约约的疼了。

等有空再更。。。

在使用 LNMP 一类的集成环境之后,对单独编译安装从来是对着文档装。尽管在 Mac 下装过无数次,也踩过无数坑,但总是记不住一些细节步骤。将本次安装过程全程记录下来,在将来也可以作个参考。

安装环境

  • 服务器:CentOS 6.8 64 mini
  • 终端:iTerm2
注:为了环境足够干净,本次安装过程为全新安装,如果之前环境安装过集成环境请重装。

安装约定

  • 文章中命令使用到的 $ 均代表 root 用户身份,执行命令时请忽略 $ 符号
  • 为了保证正常安装,我发现许多同学喜欢跳着看,除开 Apache 和 Nginx 部分,其他强烈不建议你跳着看,除非你能解决类似 Command not found 的错误
  • Apache 和 Nginx 建议二选一,本文为测试环境,会同时安装
  • 软件包下载地址:/lnmp/,若不存在请手动执行 mkdir /lnmp 创建
  • 源码包编译安装位置:/usr/local/softwareName
  • 数据库存储文件路径:/data/mysql
  • Nginx 站点目录:/www/

Linux

CentOS 也是安装中的一部分,也记录下安装的过程。以下只截图的重点部分,其他直接默认即可。

安装

虚拟机挂载镜像后,开机,选择 Install system with basic video driver,回车。这个是基础安装,没有界面的。

选择安装模式

然后刷屏模式。。

然后检查介质,直接 Tab 键选择 Skip 跳过检查,如果手残选择了 OK 那么恭喜你,慢慢等吧,没半个小时好不了。

检查安装介质

欢迎页面,直接回车。

选择语言,默认,继续回车。

接下来是抹掉磁盘的警告,直接按 Tab 键选择 Re-initialize all 然后回车。

安装

然后输入你的管理员密码,若是弱口令会提示密码不安全,你可以修改密码或者选择 Use Anyway 来忽略警告,当然我强烈不建议你使用弱口令。

选择安装磁盘,直接默认,然后按 Tab 键切换到 OK,然后回车。

选择磁盘

然后是确认写入的警告,按 Tab 键选择 Write changes to disk

确认安装

然后是漫长的安装过程,这个过程受机器配置的影响安装时间也不确定,慢慢等。

安装中

安装完成,回车重启。

重启服务器

重启完成后直接输入用户名(root),密码登录系统。

配置网络

由于我是虚拟机安装,刚安装完成还没有网络,所以得先修改下网卡配置。

$ vi /etc/sysconfig/network-scripts/ifcfg-eth0 #修改网卡配置

ONBOOT 改为 yes,然后执行命令让网卡配置重载。

$ service network restart #重启网络服务

修改完网卡,尝试使用 ping 命令测试网络是否通畅。

更换 yum 源

总所周知的原因,国内的 yum 下载速度不用多说。先安装需要用到的工具。

$ yum install -y wget curl vim #安装需要的工具

安装完工具,然后先备份下 yum 源

$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

然后将阿里云的 yum 源下载到本地的 etc/yum.repos.d/,当然你也可以选择其他的源镜像,比如:163 或者 中科大 的镜像源。这里我直接以阿里云的为例。

你可以使用 wget 进行下载:

$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

或者使用 curl 进行下载(二选一):

$ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

然后清空缓存。

$ yum clean all
$ yum makecache

然后执行升级命令:

$ yum update

安装更新,键入 y 回车继续。这个过程的等待时间由你的服务器配置和带宽决定。

安装前的配置

防火墙配置

防火墙用于管理入栈和出栈流量,所以先配置放行端口,HTTP 协议端口:80、MySQL 数据库端口:3306、HTTPS 协议端口:443。当然,你也可以直接将防火墙关掉,但是强烈不建议这么做。

$ vim /etc/sysconfig/iptables #编辑防火墙规则

COMMIT 之前按下 i 键插入规则。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

按下 Esc 键,键入 :wq 保存,然后重启防火墙。

$ service iptables restart

然后查看防火墙规则,是否有刚添加的规则。

$ iptables -L

如果有 http 或者 80 端口开放则配置完成。

关闭 SELinux

SELinux 是红帽(Red Hat)系列系统中的一个强制访问控制系统,你可以理解为 360 安全卫士,是必须关的一个东西。(除了百度,最讨厌的就是 360 了,当然还有金山。)

首先编辑 SELinux 的配置文件:

$ vim /etc/selinux/config #配置 SELinux

按下 i 插入,将 SELINUX=enforcing 前边加一个 # 注释掉,SELINUXTYPE=targeted 同样在前面加 # 注释掉,在尾部插入 SELINUX=disabled,然后按下 Esc 键入 :wq 保存。

然后执行命令使配置生效。

$ setenforce 0
注:这里有一个坑,执行命令后,配置可能还是未生效。最好的解决方案是:重启服务器。

安装编译工具和库文件

软件的安装编译需要用到的工具,直接复制安装,这个过程比较漫长。

$ yum install -y make apr* autoconf automake curl curl-devel gcc gcc-c++  cmake  gtk+-devel zlib-devel openssl openssl-devel pcre-devel gd kernel keyutils patch perl kernel-headers compat* cpp glibc libgomp libstdc++-devel keyutils-libs-devel  libarchive   libsepol-devel libselinux-devel krb5-devel libXpm* freetype freetype-devel freetype* fontconfig fontconfig-devel libjpeg* libpng* php-common php-gd gettext gettext-devel ncurses* libtool* libxml2 libxml2-devel patch policycoreutils bison

安装 libmcrypt

libmcrypt 是 PHP 的加密拓展库。这里我准备了一个下载地址:libmcrypt-2.5.8.tar.gz

你可以使用 wget 命令进行下载。 若不存在 /lnmp/ 目录请先使用 mkdir /lnmp 创建目录。

$ cd /lnmp/ # 切换到 /lnmp 目录,不存在则先 mkdir /lnmp 再执行
$ wget https://static.openapi.link/libmcrypt-2.5.8.tar.gz  # 下载 libmcrypt 包
$ tar zxvf libmcrypt-2.5.8.tar.gz  # 解压 libmcrypt 包
$ cd libmcrypt-2.5.8  # 进入 libmcrypt 解压的目录
$ ./configure  # 配置
$ make && make install  # 编译安装

这个过程大约在 10s-20s内完成,接下来开始安装 Nginx。

Nginx

创建 Nginx 用户组

首先,下载 Nginx,下载地址:Nginx-1.13.2.tar.gz,下载到 /lnmp/

$ cd /lnmp/
$ wget http://nginx.org/download/nginx-1.13.2.tar.gz
$ tar zxvf nginx-1.13.2.tar.gz
$ cd nginx-1.13.2

到这里,建议为 Nginx 创建一个运行的账户 www,且该账户不允许登录系统。

$ useradd www -s /sbin/nologin  # 创建一个运行账户

安装 Nginx

开始编译 Nginx 并安装。

$ ./configure --prefix=/usr/local/nginx --user=www --group=www --without-http_memcached_module --with-http_stub_status_module --with-http_ssl_module  # 配置
$ make && make install  # 编译并安装

配置

要将 Nginx 加入开机启动项,需要先下载一个管理脚本,下载地址:nginx,同样下载到 /lnmp/ 中。

$ cd /lnmp/
$ wget https://static.openapi.link/nginx  # 下载脚本

或者编写一个名为 nginx 脚本。

$ cd /lnmp/
$ vim nginx

将以下代码复制粘贴进该脚本中。

#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
# It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /var/run/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/usr/local/nginx/logs/nginx.pid
RETVAL=0
prog="nginx"
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
echo "nginx already running...."
exit 1
fi
echo -n $"Starting $prog: "
daemon $nginxd -c ${nginx_config}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
return $RETVAL
}
# Stop nginx daemons functions.
stop() {
echo -n $"Stopping $prog: "
killproc $nginxd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /usr/local/nginx/logs/nginx.pid
}
reload() {
echo -n $"Reloading $prog: "
#kill -HUP `cat ${nginx_pid}`
killproc $nginxd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|reload|status|help}"
exit 1
esac
exit $RETVAL

然后按下 Esc 键,键入 :wq 保存并退出。

设置将 Nginx 加入开机启动项,并赋予执行权限。

$ cp /lnmp/nginx /etc/init.d/  # 将脚本拷贝至服务项
$ chmod 755 /etc/init.d/nginx  # 赋予脚本执行权限
$ chkconfig nginx start  # 设置开机启动项
$ service nginx start  # 启动 Nginx
nginx already running....

此刻,通过本地浏览器访问该服务器 IP 地址,能看到 Welcome to nginx 说明安装成功。

Welcome to nginx

若访问失败,请检查 #防火墙配置 或检查是否有开启 Shadowsocks 类似的翻墙程序。

MySQL

创建 MySQL 用户组

MySQL 的安装同样需要新建一个 mysql 的用户(组),且不允许登录。

$ useradd mysql -s /sbin/nologin

创建 MySQL 数据库文件存放目录,并修改所属用户为 mysql

$ mkdir -p /var/mysql/data  # 创建数据库文件存放目录
$ chown -R mysql:mysql /var/mysql/data  # 设置该目录用户为 mysql

安装 MySQL

开始安装 MySQL,同样需先下载 MySQL,下载地址:mysql-5.5.28.tar.gz,下载到 /lnmp/ 目录下。

$ cd /lnmp/
$ wget https://static.openapi.link/mysql-5.5.28.tar.gz  # 下载 MySQL
$ tar zxvf mysql-5.5.28.tar.gz  # 解压
$ cd mysql-5.5.28  # 进入解压目录
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/var/mysql/data \
-DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306
$ make && make install  # 编译安装

这个等待过程视机器性能而定,完成后配置 MySQL 的配置文件。

$ cd /usr/local/mysql
$ cp ./support-files/my-huge.cnf /etc/my.cnf  #拷贝配置文件
#键入 y 覆盖
$ vim /etc/my.cnf  #编辑配置文件,在 [mysqld] 部分增加

[mysql] 中添加数据库文件的保存路径。

datadir = /var/mysql/data

按下 Esc 键,键入 :wq 保存并退出,接着生成数据库文件,并将 MySQL 添加至服务项。

$ ./scripts/mysql_install_db --user=mysql  #生成mysql系统数据库
$ cp ./support-files/mysql.server /etc/init.d/mysql  #把 Mysql 加入系统启动

配置

$ vim /etc/init.d/mysql

找到 basedirdatadir,默认情况下,他们应该没有值,将配置修改。

basedir=/usr/local/mysql
datadir=/var/mysql/data

按下 Esc 键,键入 :wq 保存并退出,接着赋予脚本执行权限并加入开机启动项。

$ chmod 755 /etc/init.d/mysql  # 赋予执行权限
$ chkconfig mysql on  # 添加开机启动项
$ chown -R mysql /usr/local/mysql  # 将 /usr/local/mysql 所属用户修改为 mysql
$ service mysql start  # 启动 MySQL
Starting MySQL.. SUCCESS!

最后,将 MySQL 加入系统环境变量中,即可使用 mysql 命令。

$ vim /etc/profile

在文件末尾追加。

export PATH=$PATH:/usr/local/mysql/bin

按下 Esc 键,键入 :wq 保存并退出,然后将配置生效。

$ source /etc/profile

配置 MySQL 管理员密码。

$ mysql_secure_installation
...
Enter current password for root (enter for none):  # 输入 root 密码,没有,直接回车
...
Set root password? [Y/n]  # 输入 y 回车
...
New password:  # 设置密码
Re-enter new password:  # 确认密码
...
Remove anonymous users? [Y/n]  # 移除匿名用户,输入 y 回车
...
Disallow root login remotely? [Y/n]  # 不允许 root 用户远程登录,允许,输入 n 回车
...
Remove test database and access to it? [Y/n]  # 移除 test 数据库,这个随便
...
Reload privilege tables now?  # 重载,是,输入 y 回车
...
Thanks for using MySQL!

现在,在终端中输入 mysql 命令是否正常。

$ mysql -uroot -p
Enter password:
mysql>

按下 Ctrl + C 退出 MySQL,至此,MySQL 安装完成。

PHP7

首先下载 PHP7 的包,下载地址:php-7.1.11.tar.gz,下载到 /lnmp/ 目录下。

$ cd /lnmp/
$ wget -O php-7.1.11.tar.gz http://cn2.php.net/get/php-7.1.11.tar.gz/from/this/mirror  # 下载
$ tar zxvf php-7.1.11.tar.gz  # 解压
$ cd php-7.1.11
$ ./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc  --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mysqlnd --with-mysql-sock=/usr/local/mysql/mysql.sock --with-gd --with-iconv --with-zlib --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --enable-session --with-mcrypt --with-curl --with-jpeg-dir --with-freetype-dir   --with-pdo-mysql=/usr/local/mysql/
$ make && make install  # 编译并安装

这个过程就有点长了,可以喝杯茶 ????,放松放松眼睛 ,或者给我留个言吧 _(:зゝ∠)__。

配置

一杯茶之后,继续。

$ cp php.ini-production /usr/local/php7/etc/php.ini  # 复制 php 配置文件到安装目录
$ rm -f /etc/php.ini  # 删除系统自带配置文件
$ ln -s /usr/local/php7/etc/php.ini /etc/php.ini  # 添加软链接
$ cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf  # 拷贝模板配置文件为php-fpm配置文件
$ vim /usr/local/php7/etc/php-fpm.conf

找到 ;pid = run/php-fpm.pid 将前面的 ; 去掉。

$ cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf  # 复制配置文件
$ vim /usr/local/php7/etc/php-fpm.d/www.conf  # 编辑配置文件

找到 user = nobodygroup = nobodynobody 均改为 www 用户(组)。

开机启动

$ cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm  #拷贝php-fpm到启动目录
$ chmod 0755 /etc/init.d/php-fpm  #修改权限
$ chkconfig php-fpm on  #设置开机启动
$ service php-fpm start  #启动php-fpm
Starting php-fpm  done

配置 Nginx 支持 PHP

$ vim /usr/local/nginx/conf/nginx.conf  # 编辑 nginx 配置文件

找到一下代码去掉前面的注释符号 #

location ~ .php$ {
    ...
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    # 注释掉以上条代码添加下面代码
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

至此,PHP 与 Nginx 关联配置完成,你可以在 /usr/local/nginx/html/ 新建 index.php 中写入 PHP 代码测试。

配置主机

Nginx 默认的路径:/usr/local/nginx/html/ 这样的目录太深了不利于操作,我把他放到根目录以便查找。

$ ln -s /usr/local/nginx/html/ /www  # 设置软连接

然后配置虚拟主机。

$ vim /usr/local/nginx/conf/nginx.conf  # 编辑 Nginx 配置文件

最末尾的 } 之前一行 插入 include "vhost/*.conf";,并创建虚拟主机配置目录。

$ cd /usr/local/nginx/conf
$ mkdir vhost

若需要新增一个虚拟站点,则直接在 /usr/local/nginx/conf/vhost 目录下新建一个站点配置文件,并在 /www/ 下创建一个同名的目录即可。

格式如下:

server {
        listen       80;  # 监听端口
        server_name  www.example.com;  # 域名
        root         /www/www.example.com;  # 站点根目录
        index  index.php index.html index.htm;

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}

Apache *

注:强烈不建议同时安装 Apache 和 Nginx。

首先你到官网下载 Apache,这里我安装的是 2.2.34 比较稳定的版本,我准备了一个地址:httpd-2.2.34.tar.gz

你可以使用 wget 命令进行下载。 若不存在 /lnmp/ 目录请先使用 mkdir /lnmp 创建目录。

$ cd /lnmp  # 切换到 /lnmp 目录,不存在则先 mkdir /lnmp 再执行
$ wget http://mirrors.shuosc.org/apache//httpd/httpd-2.2.34.tar.gz  #下载 httpd 包

然后解压并进入解压后的目录。

$ tar zxvf httpd-2.2.34.tar.gz  #解压 httpd 包
$ cd httpd-2.2.34  #进入 httpd 解压后的目录

配置安装位置并开始安装。

$ ./configure --prefix=/user/local/apache2  #配置安装目录
$ make && make install  #编译并安装

启动 Apache 服务器。

$ /usr/local/apache2/bin/apachectl start

关于 Apache 只简单介绍到这里,关于开机启动项、系统服务、虚拟主机(virtual host)等配置先立个 flag,有时间再更新。

前言

昨天 网易云音乐 日推给我一首歌让我想到了这篇文章,静静躺在博客搬迁时的备份中,索性整理整理出来。这篇文章并不是我写的,而是我一个朋友的日记。

11月1日更新:以冬的版本被下架了,更新下链接。

11月2日更新:双笙的版本也下架了,再更新下链接。

好好珍惜身边的人,有些人一转身或许就真的是一辈子。

正文

在你心中是否有个无法被抹去的人,在你的记忆深处是否有个你不愿去触碰的人。每每想起她(他)就疼到无法呼吸,害怕遇见却又在心底期盼。

当在途中偶尔瞥见相似的身影时,你便会想起你们曾经的点点滴滴。岁月如水,温柔的流淌。但那个人终究不是那个人了,只能带着叹息离开。

你们或许联系过,但讲的都是彼此的近况,无关痛痒。谁也不愿提起那些个敏感话题。添加过好友,却又随即删掉。或许在某一天,某一个晚上,思恋就像无人打理的野草肆无忌惮的疯长,蔓延。

厚厚的被子将自己裹得严实却丝毫感觉不到温暖。

恋爱中最珍贵的纪念物是她(他)留在你身上的印记,如同冰川留给地形的痕迹,那些你为她(他)的改变。

曾经她说她喜欢短头发的男生。于是我剪掉了自己的刘海,换成了自己不喜欢的短发,后来心理使然又留回了长发。

再后来,当我们分开后,却喜欢上了曾经不喜欢的短发。从此再未留过长发。时光把你我捉弄。一生爱一次,一次爱一生。说得很浪漫,很完美。但那幸运并不属于我。

爱情就像一罐蜂蜜与黄莲的混合体,有人专挑甜的,有人专挑苦的,大多数的青春片里的男女主最后都未走到一起。人生如戏,你在台上演,别人在台下看而已。如《平凡的世界》里的孙少平和田晚霞一样,你可以幻想着为她们营造一个美丽的结局。梨花盛开,虫萤嗡嗡,一只只蝴蝶再身旁跳着舞,他们相聚于此,热情相拥,许诺一生。。。但那只不过是自己丰富的幻想,只为了自己能好受一点。

有多少时光,多少人儿。把自己的热情和青春给了一个人,却把生活与安定给了另一个人。这让我想到了《天堂电影院》。多年之后,他回到那个记忆深处的故乡,找到了她,聊起从前,却发现彼此的离开不过是一场精心安排的误会,他们相拥,接吻,哭泣。但他们无法再续前缘,只因各自拥有的生活。

最后啊,他只能带着遗憾离开,老去,死去后将这悔恨带进墓地。

左小慈曾说过:

每个人的心都是一座城,爱可倾城,亦可毁城。我们终其一生所等待的那个倾城人,不是来的太早,便是来的太迟。

每次将这句话说给刚失恋的人,他们都会低着头,默默叹息。

是啊!想要在对的时光里遇到对的人是多么的艰难啊。喜欢一个人,就会想起她(他)的微笑,至于她(他)是否明白我微笑的原因,都不在意。

就像微风拂面,又如阳光温暖。风与太阳跟你一样,不会明白我微笑的原因。我该如何对待风和太阳,就如何对待你。有人曾说过:当爱逐渐死去,人心不过是一座活着的坟墓。

最后,愿你我都能找到那个想起他是嘴角能够上扬的人吧。

结语

引用一句电影台词作为结语吧:人生就是一列开往坟墓的列车,路途上会有很多站,很难有人可以自始至终陪着走完。当陪你的人要下车时,即使不舍也该心存感激,然后挥手道别。