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日更新:双笙的版本也下架了,再更新下链接。

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

正文

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

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

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

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

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

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

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

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

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

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

左小慈曾说过:

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

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

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

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

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

结语

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

敲了这么久的代码,难免想出去浪一圈。一来是来深圳这么久了,还真没好好逛逛,整日埋头苦干,沉迷于学习不能自拔;二来,我这腰和脖子好像经不起长时间的盘坐了,有时候缓过神来感觉就像被人敲了闷棍一样。当然,国庆期间出去玩那自然是不敢的,总的来说就是摩肩擦踵、锣鼓喧天、人山人海没有更贴切的词语来形容了。

所以,我选在了 30 号,相信诸位 30 号那天都还在上班的上班,上课的上课吧。而我约着其他三个小伙伴,和往常一样早起,坐地铁,不过这次的目的地是——大梅沙。(真的没有故意拉仇恨)

不得不说,是真的远。早上 9 点出发,地铁公交几经转车到了已经是 11:30 以后了。下车后继续往海边走,一路上有卖泳衣泳具的,然后我选了一条最是“骚气”的沙滩裤,然后来一场轰轰烈烈的艳遇吧(媳妇儿,我就说着玩玩儿,真的)。因为都没吃早餐,二逼朋友直接钻进一家饭馆去了,里面没有顾客,我抬头望着招牌心里大喊:“不妙!不妙!”,看着服务员端茶倒水的娴熟,反手摸摸我的钱包咽了一口口水。果然,上菜单了,是酒店里的那种精装菜单,封面是錦布的那种。随手一翻,一碗番茄蛋汤 38 元你敢动?(MMP!)“老板你这有炒饭吗?”,老板犹豫了片刻,又拿出了一份小餐馆里那种胶装菜单,价格也终于回到地面了。你们这儿都准备两份菜单的?

群聊吐槽

随后,终于来到了目的地,虽然门票免费,但是还是需要身份证登记的,进去和过地铁安检挺像。

大海呀

换上泳裤,然后买了个游泳圈(第一次游泳,怕怕),二话不说就栽进去了。然鹅!在水里任凭我怎么蹬怎么划,就是不动啊。在水里就像死鱼一般,死抱着游泳圈任海浪把我各种推。一个大浪过来,屏气!然后进耳朵了。。又来一个大浪!屏气,捂耳朵!随着手的缝隙还是进去;又来一个大浪,屏气!死捂耳朵!海水灌进鼻腔,直接进喉咙了,卧槽???一时间,眼里口里耳朵里全是苦咸的海水,仿佛下半年的盐今天都一口气全吃了。

上岸!先缓缓,朋友说别人的叫“游泳圈”,而我的叫“救生圈”。

朋友拍的我

玩到下午四点半,饿得不行,再加上太阳开始不给面子,越来越大。遂打算打道回府。

冲冲身上的沙子,才发现,卧槽,晒黑了,全身通红。朋友说我脖子后边更红,然而我看不到啊!

坐上回家的公交,格外的慢。从地铁站过去只用了半个小时回去却一个多小时,硬是和放学下班的人们打作一团,地铁排到了进站口。。

可怜了我的游泳圈,让安检给我放气了。。人家小孩儿带气球的还不给人家扎了?我仿佛听到了小孩儿的哭声。

回到家,冲完澡,感觉背上是越来越疼了。这感觉不亚于冬天在家上网腿下的电热炉把腿烤伤的感觉。

这也算是第一次看见真正的海吧,沙滩、大海、阳光。不想上次在红树林看到的臭水沟一样的海,那我宁可说没见过海。谁敢下去游泳试试?傍边就是一条河沟。

红树林

出生在内陆的我,对大海的情感就如出生在海边的人对大雪的向往。年少时总脑补一些大海的画面,无尽的海水给人一种思考,就如同抬头望着这天空。

忍着背后晒伤的疼写完文章,虽然昨晚横躺不是侧躺也不是,但我不后悔呀。

人生这么短暂,快乐又那么少。活得开心就好啊~最后祝大家假日快乐,祖国生日快乐。