趣谈个人建站

website-edit-2

这篇文章是分四次完成的。虽然是技术文章,但我尽量把这件事写的轻松一点,大家读起来也更有趣。最后形成了一篇完整的趣谈个人建站。

2000年前后是第一波互联网浪潮,无论是幸与不幸,我的早期职业生涯都是从这波浪潮开始的,那时候很多ASP(Application Service Provider)厂商会给个人用户免费提供一些静态建站功能,大家可以写一些HTML+CSS+JS的页面传上去,算是早期的个人的站点,我记得自己的第一个站点叫做「雪域苍穹」,貌似取自一首流行歌曲的名字。无论是名称还是页面,现在看来都土的能掉出翔来,但当时的感觉是,这特么的太酷了。

后面做过一些个人网站,由于各种原因都关掉了。再后来开始写博客,很多人开始建自己的博客站点。站点不少,一直保持更新的倒没几个。我的想法是,专业的事就让专业的厂商去做吧,所以一直也没建个人博客网站,断断续续的在博客园和图灵社区写一些东西,也算是保持更新了。

终于有一天,微信公众平台来了,一个偶然的机会注册了MacTalk(原Mac技巧),之后一口气写了一百三十多篇文章,文字总数超过了我前几年的博客总和,而且保持了一定的文字水准(自以为-_-#)。然后就有很多读者一直提醒我,MacTalk里的内容有一部分是技术性质的,有存留价值,如果能够进行查询检索,对Mac的新老用户都有帮助。我想了想也是,扯淡的东西估计没人愿意重复阅读的,技术类又很难记在当下,所以就准备开始着手建站,然后macshuo.com就建成了。下面我把整个过程写一下,供大家参考,另外,我只说自己的选择,不会去比对各种指标,比如Linode和国内VPS的优劣,Apache和Nginx的性能差异等等,如果你想了解这些东西,那就用Google百度一下。

搭建个人站点,大致需要做这么几件事情:

  • 一台具备公网IP的服务器
  • 安装操作系统,搭建环境
  • 购买域名,域名绑定IP
  • 部署应用程序

基本上这四套组合拳打完,你的个人网站就算建起来了,后续的事情就是添砖加瓦和蓬荜生辉了。

好把我们依次介绍:

服务器

大部分公司都会有自己的服务器和公网IP,要么托管要么自建机房。但对于个人用户来说,就没必要费时费力做这个事情了,购买一个VPS(Virtual Private Server)即可。什么是VPS,建议大家去维基百科上查一下,简单来说就是你会拥有一台虚拟主机,除了看不见机箱之外,你可以像操作一台实体服务器那样操作它,独立操作系统和硬盘空间、独立内存和CPU资源、独立的执行程序和系统配置等,可以自己安装操作系统和软件,独立重启等等。

在VPS的选择上,我用的是Linode。Linode是一家来自于米帝的专注于提供 Linux VPS 的服务提供商, 虚拟化技术采用了Xen,Linode的含义是Linux Node。注意,这里的操作系统是Linux,我推荐所有个人建站都采用Linux,不解释,如果你想采用Windows Server,后面的内容就不用看了。

Linode在国内外口碑都不错,价格适中,质量可靠,童叟无欺。Linode提供了各种Linux操作系统供选择,比如Ubuntu、Redhat、Debian、CentOS等等,装系统和重装系统都非常简单。

好,我们下面简单说一下步骤,访问https://manager.linode.com/session/signup
填写邮箱、用户名密码,就算注册成功了,Linode会给你发封邮件确认,打开那个确认链接,大家就会看到下面这张图的内容:

website1

Linode通过它的ticket system(一套支持系统)提供7 x 24 x 365的支持服务,看清楚,不是7 x 24 x 365的不停机服务,我现在特别烦一些企业客户,一谈就说永不宕机,特么除了上帝谁能保证永不宕机?时间长了自个都得宕!另外Linode还提供了4小时的免费试用服务,比较厚道,如果你试试觉得不爽还可以选择不玩。

选择继续,就可以选机房了,Linode目前提供了东京和欧美等地的机房选择,我选了东京机房,据说是针对亚太地区用户的需求新开辟的,速度很快。然后选操作系统,设置硬盘大小、root密码等,点击「Rebuild」,你就进入了VPS的控制台,等Host Job Queue的所有任务都是绿色的Success,就可以点击「Boot」,启动系统。然后找到Remote Access这个标签,点进去就可以找到这台服务器的访问IP,打开终端,输入ssh root@x.x.x.x,就可以登录系统了,看到了吧,very simple!

试用之后,如果你觉得可以,点击Account标签,完善自己的信息,选择服务器配置,支付信息,然后就可以完整支付流程了。

我选的是Linode 1024套餐(24 GB DISK, 2000 GB),按照年付费的话230刀左右,大家这两天赞助的碎银子,差不过够一年年费了:)支付方式包括Visa,MasterCard,American Express,只有要信用卡还是很方便的。

另外需要注意的一点是,拿到了IP之后,一定要在不翻##墙的情况下测试一下是否可以正常访问。我就遇到这个问题了,在国内没法访问,但是挂了VPN的就可以,我估计是哪个倒霉孩子以前用过,被墙之后不用了。

不得已我发起了一个Ticket(支持问题),说我在中国大陆不能访问这个IP,但通过VPN可以,那哥们响应倒是挺快,但显然不懂我朝行情,让我执行mtr –r x.x.x.x,mtr可以结合ping、nslookup、tracert诊断网络传输问题。我只得把数据返给他,结果人家还要其他数据,我就不耐烦了,用蹩脚的英文给丫解释了一下什么是伟大的墙,基本意思就是少特么废话,赶紧给我换个IP。那哥们看我气势挺盛,赶紧给我换了个IP,我一试没问题了,说了声三克油,他说威尔卡姆,这事算结了。两人共交手五个回合,用时2小时,效率还可以。

好,服务器部分就介绍到这里。以下是我的linode推荐码,如果大家要购买Linode服务,可以用这个链接。

http://www.linode.com/?r=6bd100da844d8d2c191680a4792610467ce9052


搭建环境

我选用的服务器是Ubuntu12.04,64位。以下内容均基于该环境描述。

拿到了主机IP,你就算拿到了新房的钥匙,但是离入住还远着呢,因为你那个主机现在就是个毛坯房,除了进去看看,什么都不能干。好,下面我们做一下简装修。

1、创建用户

第一次登录需要root用户,什么是root?root就是整个Linux操作系统最牛逼的主,他想干嘛就干嘛,他想删谁就删谁,他是光他是电他是唯一的神话,他就是我朝就是我D,所以非常危险,你们懂的。如果用root执行一下rm -rf,那整个锡安就会被抹掉,尼奥也拯救不了,如果root愿意,他可以抹掉你曾经存在过的所有痕迹。所以,我们不能没事就用root进去耍,为了解决这个问题,我们必须要建立一个agent,平时是普通用户,关键时刻充当root的角色。

具体操作如下:

首先用root登录系统

ssh root@x.x.x.x

创建一个新用户,用户名随你喜欢,比如叫做mactalk

adduser mactalk

按照提示信息输入密码和相关信息,就可以完成操作。完成之后系统就会自动建立/home/mactalk路径。

然后是授权,输入

visudo

在编辑器中找到如下内容:

root    ALL=(ALL:ALL) ALL

在下面加一行

mactalk    ALL=(ALL:ALL) ALL

通过ctrl+x保存退出即可。然后就可以退出root,用mactalk重新登录(ssh mactalk@x.x.x.x),登录进来默认目录在/home/mactalk下,当你想行使root权限时,请在命令之前增加sudo,按照系统提示输入密码即可执行操作。

2、选择shell

用户建好了,下面我们为用户选择一种shell,估计小白看到这个又毛了,啥是shell?

shell就是Linux的一个外壳,你理解成衣服也行。它负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后再把结果返回用户或应用程序。比如你对shell说,「你好」,shell就跑到内核那说,「老大,有人问候你呢」,内核就不耐烦的说,「有事说事,我特么忙着呢」,shell就把这条信息反馈给你,大致就是这样。以前讲Mac技巧的时候,经常跟大家说在终端里输入一些命令,那就是Mac的shell,都是一脉相承的。

Linux提供了很多种Shell,你要问我为什么要有这么多,我只能告诉你,你为毛同类型的衣服有那么多件?花色,质地还不一样。写程序比买衣服复杂多了,而且程序员是不惮于把事情搞复杂的,牛程序员看到不爽的shell,就会自己重新写一套,慢慢形成了一些标准,常用的shell有这么几种,sh、bash、csh、zsh等,想知道你的系统有几种shell,可以通过以下命令查看:

cat /etc/shells

这些shell我就不解释了,维基百科和百度百科都写的很清楚,总之,坊间流传,普通程序员用bash,文艺程序员用zsh,XX程序员直接用原生的sh,我建议大家文艺一点,用zsh好一些,功能也最强大。目前各个版本的Linux默认的shell都是bash,如果你想用zsh,需要安装一下,如下:

sudo apt-get install zsh

具体的配置我就不介绍了,感兴趣的读者,可以参考

http://leeiio.me/bash-to-zsh-for-mac/

3、通用工具

介绍几个简单的工具,建站必备。

  • wget,命令行下载工具,安装sudo apt-get install wget,使用方式后面会介绍。

  • tmux,一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再「浪费」多余的终端来连接这台远程主机。好吧,这句话有点绕,简单说就是用tmux打开的会话可以一直驻留在服务器上,下次去看时还是上次来的样子。就像你是某个酒店的VIP客户,住完之后不会人走茶凉,也不会断电,下次去时茶还热着,灯也亮着,就这样。

    安装方式sudo apt-get install tmux,对使用方式感兴趣的读者去查一下吧,中文介绍很多,记住,热键是ctrl+b。

  • vim,在Linux上少不了编辑文件,我推荐Vim和Emacs,一个是编辑器之神,一个是神的编辑器(或者是伪装成操作系统的编辑器),我是Vim党,目前在学习Emacs。我之前写过一个Vim系列,有兴趣的可以去看:

    http://www.cnblogs.com/chijianqiang/tag/vim/

    从原理到配置、使用都有非常详细的介绍,那也是个大坑,还没写完,但写了MacTalk就变成顾此坑失彼坑了。

差不多就这几个,其他的工具随用随装吧。


域名和DNS

服务器和环境构建都写完了,今天介绍一下域名和DNS的那点事儿,稍微复杂一点的软件部分放在最后说。

域名是什么东西呢?就是一个网站的标识和入口,由「.」分隔开的字符串构成,洋名叫Domain Name,比如苹果公司网站的域名就是apple.com,在浏览器地址栏输入这个域名,就可以访问苹果的网站了。为什么要有域名呢,有了公网IP,不就可以访问网站了么?

咳,这么说吧,如果有人说找个地方聚聚,你说,咱们经度116.46、纬度39.92,不见不散!地方倒是对,但是估计实名菜刀和无名臭鞋就飞过来了。IP地址就是你的服务器在互联网世界的经纬度,域名就是对应IP的门牌号码,就像人们能记住门牌号记不住经纬度一样,在网络世界里,大家都是记域名的。与现实世界不同的是,门牌号和实际地址正常情况都是一对一的,而域名和IP地址是多对一的,也就是说,只要你有一个公网IP,就可以申请多个域名,对应多个应用,非常方便。

现在你知道了吧,要建站,必须要有域名。能够提供域名的厂商很多,国内外都有。不过我强烈推荐大家购买国外厂商的域名,免去提交材料和备案之苦,国外动动鼠标和小手分分钟搞定的事情,国内要提交各种材料、备案、定期监管balabala……具体差异大家看看www.apple.com.cn和www.apple.com两个网站的底部知道了,苹果中国的底部有「京公安网安备 11010500896|京ICP备10214630」,再看看米帝的网站,毛都没有,都是自己的网站信息,我们只能说,米帝的监管制度太不健全了,真为他们捉鸡!

国外的域名厂商推荐www.godaddy.com和www.name.com,都不错。我使用的是Godaddy。

Godaddy是全球最大的域名注册服务商,全球市场占有率超过30%,一般情况下不会被我朝屏蔽。如果屏蔽了Godaddy,会导致在大陆无法访问全球近三分之一的网站,所以相对安全,相对,你懂的。另外Godaddy开始支持支付宝了,对我朝臣民来说付费变得方便无比。

在域名选择上,最好满足这几点要求:有意义、好记、简短,另外尽可能使用com(通用顶级域名)。申请步骤也很简单,访问www.godaddy.com,在搜索框输入你想要购买的域名,点击搜索,你会看到这个域名的具体信息,是否被使用,相关域名,价格等信息,域名后缀一般有com、net、me、us、info等,建议选com,不建议选info,据说info结尾的网站大部分是垃圾网站,会被搜索引擎屏蔽。

选好域名后,点Add,加入购物车,如果不需要其他服务,一路Continue即可,最后设置支付信息,支付宝在最后一列,然后「Place Your Order」,根据提示注册和支付即可。价格与域名信息相关,一般几美元到10几美元不等。

购买完成之后,进入Godaddy的域名管理控制台,找到你购买的域名,把域名和你的IP地址绑定起来,就可以通过域名访问你的网站了。这里就涉及到DNS了。

DNS的洋名一般说成Domain Name System,就是给域名提供服务的。光有域名没用,还得有相关的服务能够把域名解析成IP地址才行,DNS就干这事。DNS的扩展性非常好,不依靠单一的巨型主机索引,而是通过分布式系统提供服务,全球能够提供DNS服务的服务器多如牛毛数不胜数,但大哥级别的根服务只有13台,目前的分布是:主根服务器美国1个,设置在弗吉尼亚州的杜勒斯;辅根服务器美国9个,瑞典、荷兰、日本各1个,旗下是各个级别的域名服务器。

DNS的工作方式挺复杂,有兴趣的直接去Google吧,我简单描述一下,大致的场景是这样的,比如小明是个DNS服务器,有一天你想访问macshuo.com,就问,「小明啊,我想去听听MacTalk,怎么走呢?」,作为忠诚的DNS战士,小明的服务态度是值得赞赏的,如果他知道的话,就会立刻告诉你地址,比如从这个街区左转左转左转再左转balabala……如果丫不知道也没关系,他会反馈给上级主管,说「最近有人新建了个MacTalk网站,我这还没记录地址,你晓得不?」,上级部门如果知道就会把地址发给小明,说「你丫长点记性,把这地址记下来行不?别特么老问了,最近自媒体网站可真多啊,哎……」,这样小明就会把地址告诉你,并且用心的把这个地址记到自己的小本本上,下次有人再问,就直接告诉人家答案了。如果上级部门也不知道,那就继续问,直到反馈到根服务器为止,反正只要你注册了,总能找到。差不多就这样吧。

Godaddy默认提供了DNS服务,点击DNS Manager,在弹出的设置面板中设置你的网站IP即可,具体的图文教程网络上很多,我就不费那事了。但是我的使用结果是,Godaddy提供的DNS在国内访问不太稳定,时不时就不能访问了,具体为啥我也不清楚。因为购买了Linode服务,我最后采用了Linode的DNS,具体的做法是:

  1. 登录linode.com,点击DNS Manager标签,进入管理控制台
  2. 选择Add a domain zone
  3. 填写域名、邮件地址和IP
  4. 点击Add a Master Zone,就算完成了

最后一步就是在Godaddy的控制台里设置一下Linode的DNS服务器,很简单就不描述了。


应用程序和部署

经过前面三篇系列文章的介绍之后,我们现在房子也有了,做了简装修,还申请了地址和门牌号,最后一步就是入住,也就是部署你的应用程序。

针对网站提供的服务不同,需要不同的技术选型,我的需求就是做个风格简约的博客,用来存放MacTalk的文章,同时有个地方能够随意发表一些个人观点,就这么简单,所以针对这个需求进行选择即可。大家将来建站的时候也是一样,明确自己的需求,不要为未来买单,尽量搞的轻量级一些,最忌讳给的是龙套的钱,您自个却按照男猪脚进行角色扮演,不提倡。

搭建轻量级的博客不建议使用.Net或JavaEE的技术,这些技术都比较重,必要性不大。Php、Python、Ruby相关的框架都是可选的技术。因为我对Python相对熟悉一些,最初想找个开源的Python Blog框架,不过后来综合对比了一下,发现在个人博客领域,WordPress基本上无出其右,技术成熟、安装方便、性能稳定、插件众多,实在是居家建站、个人扯淡之必备良药,就是它了。

在确定了基本需求和工具之后,我们看看涉及到哪些技术:

1、Nginx Nginx是一款高性能的HTTP服务器软件,由俄罗斯的一位大牛Igor Sysoev开发的,源代码以类BSD许可证的形式发布。Nginx的设计非常轻量级,由内核和模块组成,内核微小简洁,模块功能强大,静态编译。Nginx做的事情简单来说就是,接收客户端(浏览器)的HTTP请求,然后通过映射机制把不同类型的请求交给不同的模块去处理,比如html、图片、css等可以交给静态资源模块处理,还可以做压缩、缓存等,php、python等类型的请求则交给FastCGI模块去处理,完成业务逻辑。

什么是FastCGI呢?这玩意就等于是HTTP服务器和动态脚本语言通信的接口,就像一个粘合剂一样把HTTP请求和动态脚本处理整合在一起,顾名思义,处理速度非常Fast!

Nginx可以说是HTTP服务器软件市场的新贵,目前国内很多大型网站都采用了Nginx作为默认的web服务器,比如阿里、腾讯、新浪等等,国外就更多了。当然,在Nginx未涉足江湖之前,这个领域的大哥叫做Apache,那时候几乎所有的HTTP Server都是清一色的Apache,一时之间风头无两。但是这哥们大哥做久了就不思进取,跟国内很多大佬一个德性,没竞争对手时就特么不知道改进,直到Nginx出来抢了丫半壁江山,现在知道努力了,当初干嘛去了?

那么Nginx比Apache优秀在哪呢?

  • Nginx的所有模块都是全静态编译的,启动Nginx后,Nginx的模块被自动加载,静态库执行效率更高。

  • Nginx支持epoll(Linux系列)和kqueue(BSD系列)I/O事件通知机制。完,又特么出现两个名词!这让人情何以堪、文何以完啊?简单说说epoll吧。epoll是Linux2.6正式引入的提高网络I/O的处理方法,它的几个优点是:单一进程打开的FD(文件描述符)数量仅受限于操作系统,1GB内存的机器上大约是10万左右,这一点大大提升了处理海量请求的能力;采用共享内存的模式避免内存拷贝;随着打开FD的数量增加,I/O效率不会线性下降。总之,大家知道epoll很牛逼就是了。

  • Nginx支持多进程的工作方式,Nginx启动后会有一个master进程,多个worker进程。worker进程一般对应服务器的CPU数量,你有个8核的CPU,最好把worker设置为8。master负责接收外界信号,并向worker发送信号,监控worker的运行状况,当worker挂掉的时候,启动新的worker。写到这我发现,这特么活脱脱就是一个地主老财打压长工的模式啊!
    尤其是Nginx的不中断重启机制,当系统配置变化需要重新启动Nginx时,我们就给地主(master)发个消息,说这批长工(worker)太老了,都得换掉,你看着办。地主收到消息后就开始偷偷雇佣新的长工(worker),然后假惺惺的告诉老长工,把手头的活干完就行了,别太累了,啊。这时候如果有新的请求,就会交给新长工干,等所有的老长工把活都干完了,就直接fire,绝不留情。这样,整个服务无中断重启过程就完成了,就特么一个字,黑!
    当然长工(worker)也不是省油的等,他们干活的过程非常复杂,会用到我们上文中提到的epoll机制,如果有人感兴趣,以后再讲吧,这么写下去这个系列就没完了。

Nginx功能非常强大,一本书也写不完,我简单就说这么几句。老话,有兴趣的,用Google百度一下!

大概了解了Nginx的工作机制,下面安装就比较简单了,Nginx可以编译安装,也可以在线安装,对于普通用户来说,使用apt-get在线安装即可,省得自己去找依赖关系。

#安装
sudo apt-get install nginx
#启动
sudo service nginx start

如果安装和启动都没有问题,我们再调整几个参数就可以了。

找到/etc/nginx/nginx.conf,做以下几个改动:

  • 把worker_processes设置为服务器的CPU核数
  • 在event里增加use epoll
  • 把worker_connections的值设置大一点,如果是1G内存,不要大于100000/worker_processes。

其他的采用默认值即可,然后重新加载参数:

sudo nginx -s reload

好,Nginx就算妥了,后续在安装PHP和WordPress时还要做一些配置。

我有时候觉得,当我们在计算机领域遇到问题的时候,总会出现一些技术神山上的神人,他们时不时会俯视一下凡人的IT世界,高兴了就顺手解决几个bug,发明几个新玩意,epoll和Nginx就是这些玩意,我们用好就已经心满意足袅。

2、MySQL

MySQL是应用最为广泛的开源数据库,这个没什么可说的,非常成熟的技术,直接安装即可:

sudo apt-get install mysql-server

安装过程中,MySQL会提示你设置root密码(root的作用参考之前介绍的,把操作系统换成数据库即可)。如果安装时没设置密码,等MySQL起来后用mysqladmin改也行,用sql改也行,简单不啰嗦。

3、PHP

WordPresss是基于PHP开发的,所以我们得为WordPress准备好环境,安装PHP。

sudo apt-get install php5
sudo apt-get install php5-fpm

php5-fpm是PHP FastCGI的实现之一,能够更好的管理PHP进程,控制内存使用,平滑重载等,现在我们都用它!

下面做一点简单配置,打开php.ini文件:

sudo vim /etc/php5/fpm/php.ini

找到cgi.fix_pathinfo=1这一行,把1改为0。 值为1时,php的解释器会尽可能的去解析客户端请求的文件各种类型,这会引发一些安全漏洞,设置为0时,解释器只会去解析特定的文件类型,设置为0是一种相对安全的处理策略。

修改www.conf:

sudo vim /etc/php5/fpm/pool.d/www.conf

listen = 127.0.0.1:9000 修改为 listen = /var/run/php5-fpm.sock,前者是走TCP socket,后者是Unix domain socket,如果服务都在同一台机器上,建议使用后者,效率更好一些。

重新启动PHP,这部分的配置就算完成了:

sudo service php5-fpm restart

4、WordPress

好的,我们从后场断球后左冲右突,盘过对方和我方的所有进攻和防守队员,来到球门前面,发现就差最后一关:WordPress。下面我们看看如何安装和配置WordPress。

首先下载WordPress的最新版本,我用了中文版,下载和解压缩:

wget http://cn.wordpress.org/wordpress-3.5.1-zh_CN.tar.gz
tar -xzvf wordpress-3.5.1-zh_CN.tar.gz 

在MySQL中为WordPress创建用户和数据库,这部分很简单就不描述了。我们设定数据库为wordpress,用户名为mactalk,并且把数据库编码改为UTF-8。

在解压好的wordpress文件夹下,执行:

cp wp-config-sample.php wp-config.php
vim ~/wordpress/wp-config.php

按照文件内容注释填写数据库名称、用户名、密码、数据库编码使用UTF-8,然后保存退出。

为wordpress创建www文件夹,并且把完整的wordpress目录复制到www文件夹下,并设置相关权限:

sudo mkdir -p /var/www

sudo cp -r ~/wordpress/* /var/www

cd /var/www/

sudo chown www-data:www-data * -R 

sudo usermod -a -G www-data username

安装php的MySQL驱动

sudo apt-get install php5-mysql

设置虚拟主机:

在/etc/nginx/sites-available下创建文件wordpress

sudo vim wordpress

内容如下:

server {
    listen   80;

    root /var/www;
    index index.php index.html index.htm;

    #根据 IP 或域名自定义
    server_name 3.3.3.3;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
          root /usr/share/nginx/www;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9$
    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000;
        # With php5-fpm:
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

}

这个文件的作用就是把Nginx和WordPress粘合在一起,接收客户端的请求并反馈响应结果。有几点要注意的是,root设置为/var/www/,index部分增加index.php,fastcgi_pass对应之前设置的unix socket:unix:/var/run/php5-fpm.sock。

为wordpress文件建立软连接:

sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress

最后重新启动nginx和php5-fpm,就算大功告成了:

sudo service nginx restartsudo 
service php5-fpm restart

如果一切正常的话,访问你的域名或者公网IP,就可以看到wordpress的提示页面,根据信息提示初始化数据库,创建管理员,基本框架就算建好了,之后就是完善和优化,比如性能优化、主题选择、配置信息、插件选择、扩展开发等等,大家慢慢体会吧。

这个系列就算完结了,我发现写这种文章想做到好玩好看、还能言之有物把事说清楚,挺难也挺累,好在结了。


第一个十年我才华横溢,「贼光闪现」,令周边黯然失色;第二个十年,我终于「宝光现形」,不再去抢风头,反而与身边的美丽相得益彰;进入第三个十年,繁华落尽见真醇,我进入了「醇光初现」的阶段,真正体味到了境界之美。——台湾作家林清玄


文章内容来自微信公众账号:MacTalk
· 微信号:sagacity-mac
· 回复 m 可以查阅所有历史文章和Mac Tips
· Web站点:macshuo.com

如果希望持续看到MacTalk,点击{阅读原文}对作者进行小额赞助

Mac评——交流、阅读和音乐类App在iOS7的体验

appsonios7

今天是端午节,祝大家节日快乐,多吃粽子多长肉,俗话说每逢佳节长三斤么!

本来今天想休息一天,后来想到前天MacTalk节日无休的承诺,还是随便说两句吧。今天简单说说几个常用的iOS App在iOS 7上的体验。

iBook:与iOS 6上的体验并无二致,非常稳定,但是由于iBook不是iOS的原生应用,目前依旧充满了拟物风情,或者叫愤青更合适一些。那张木纹大脸充满了上一代iOS的愤怒和悲情,还有那张大书架,哎,风萧萧兮易水寒,多看一眼是一眼。


Kindle:体验了大厂风范,在iOS7上表现优秀,图标和控制台风格既不拟物,也不扁平,保持了Amazon的风格,所以说,不跟风的后果,最终结果要么死掉,要么形成自己的风格。Amazon是个低调的巨人,虽然实际上一直在与苹果分庭抗礼,但常常隐藏在茫茫海洋中,仅露出冰山一角,似乎不那么时尚,但一直在高速成长。


微信:微信4.5在iOS7上变现不尽如人意,UI方面没什么可说的,主要是功能问题,还不少:

1、有一些长文本消息会丢信息,无论是点对点还是还是公众平台群发都存在这个问题。 2、朋友圈没法选中图片,也就是说如果你升级了iOS7,就只能通过照相方式在朋友圈分享图文消息。 3、朋友圈分享文字消息时,文字输入框错位。 4、微信的API似乎也有些问题,比如我想通过虾米分享音乐到朋友圈而不可得。

就写这么多吧,微信4.5在iOS7上勉强达到可用程度,让我们期待5.0早日到来。


多看:多看阅读目前在iOS7上基本没法用,控制中心和书城都是html和javascript,估计用了不少web技术,出现了兼容问题,不过多看阅读的开发经理立刻给我反馈「下个版本就会修正,已经在等待审核了」,这效率,估计其他阅读类厂商要狠狠感受一下。


豆瓣:我常用的豆瓣App是豆瓣阅读和豆瓣FM,这两个App的UI设计已经非常贴合iOS7了,所以没有任何突兀的感觉,尤其是新版的豆瓣FM3.0,基本上形成了豆瓣风格的小清新和扁平化设计,绿、蓝是基本色系,配合深浅不同的红色点缀,让人一看就是豆瓣的作品,操作简洁,风格典雅,如果能够增加分享到微信的功能就更好了。

经过读者提醒,发现豆瓣有分享到微信朋友圈的功能,但是比较隐蔽,需要单击专辑图片,出现歌词界面,右上角才会出现分享图标,有点过于难找了。

新版的豆瓣阅读(iPhone版)抛弃了原来的排版引擎,启动了全新的引擎和UI设计,可以直达商店购买书籍,整体操作也更为流畅,但是目前的新版没有书签功能,多手势基本上没发挥作用,我觉得完全可以通过多手势实现目录导航、商城和阅读切换等。希望这个版本尽快登录iPad。目前的多看阅读在iOS7上偶尔闪退。


字节社:起步很早的阅读App,最早叫做唐茶,我在字节社也买了一些书,阅读体验还不错,不过目前在iOS7上基本上没法用,书籍同步倒是没问题,但一打开就闪退,估计下个版本应该会解决这个问题。


云中书城:不知道什么时候在App Store下架了,似乎很久没更新,在iOS7上可用,偶尔闪退,也许是iOS7的问题?最近盛大起点出走的问题,给云中书城带来了很多不确定性,大家还是把书先看完再说吧。


在线音乐类:虾米和Jing。除了豆瓣FM,我常用的两个在线音乐App还有虾米和Jing,目前在iOS7上表现都不错,Jing的设计把拟物和扁平进行了完美的结合,因为它的封面是一个扁平的唱片(太帅了),有质感又非常扁(哈哈),根据你的情绪选择音乐。虾米的设计中规中矩,既不拟物也不扁平,走的是讨巧的路线,但是歌多质量好,结合在线网站,用户也不少。尤其是离线和分享,挺好。但问题就出在分享上,目前分享与iOS7不太兼容,不过估计改起来不困难,等下个版本吧。

不写了,没想到这玩意也写了这么多,最近已经堕落到写字比写代码快了,我要检讨一下。

我的iOS App不少,但主要的用途是交流、阅读和听音乐,所以就说这几个吧,期待它们的新版本。

祝大家晚安。


文章内容来自微信公众账号:MacTalk · 微信号:sagacity-mac · 回复 m 可以查阅所有历史文章和Mac Tips · Web站点:macshuo.com

如果文章对你有价值,点击{阅读原文}对作者进行小额赞助

不要,在乎,这些,细节——闲谈WWDC

ios7

昨天凌晨WWDC正式开幕,白天一天都是苹果的消息,北京下午还非常罕见的下了鸡蛋大的冰雹,然后我发现了一篇神文,在这样一个欢乐的日子里,咱就别苦逼的写建站文章了,随便扯几句,大家就洗洗睡吧。

今年的WWDC貌似是第一次视频直播,以前都是各大媒体和频道通过图文直播,为了这个第一次,我老人家决定像个神经病一样熬夜看直播,基本上给的是世界杯决赛的待遇。于是我等家里大小领导都沉沉睡去之后,在月黑风高的夜晚,准备好干粮和茶点,打开了苹果官网和新浪微博(微信是不能指望的,那个点连个犬吠都没有),结果发现了少许70后,大批80后,一些90后已经等在那里,开始叽歪「怎么1点了还没开始?」「不是说WWDC的App可以看直播么?骗纸」「我特么是来看iOS 7的,怎么先说OS X」,我很开心,随即加入了战团,一直happy到3点多,才满意的睡去了,我特么还很年轻哇!

今天则是铺天盖地的报道,关于OS X、Mac系列、iOS7等等,具体信息我就不重复了,好这口的估计也都读好几遍了,我说几点自己的感受吧,核心是「不要,在乎,这些,细节」。

1、OS X系列不再以大猫为名称命名,一代大猫传奇终结,让我非常伤心,俺是从豹-雪豹-狮-山狮一路用上来的,现在特么起了个Mavericks,至今不知道具体啥意思,有人说叫小牛,有的说是地名,以后会以地名命名了,你特么能想像用地名命名操作系统么?总之,我的大猫没了,伤感。

2、苹果的技术能力相当强悍,虽然大家开完转身就把开发者网站搞死了,但视频直播一直非常流畅,算是为这次直播做了精心准备的。

3、OS X的亮点是镜像全屏、iBook、Finder的tab、Tags、iCloud钥匙串(1Password)、地图,当然还包括后端技术的改进,大家届时体会一下。

4、关于iOS 7,大家看一下今天的配图,那是我升级后的截屏,大家感受一下。我个人接受新事物能力比较强,觉得还不错,很多人认为这是亮点,或者是槽点,我觉得「不要,在乎,这些,细节」,反正你们迟早会喜欢上它的:)

5、iOS 7这次基本上是颠覆了原来的整套UI,我非常钦佩苹果的勇气,大家想想,之前的UI已经用了很多年了,如果不是苹果公司这个大牌子撑着,估计早被骂出翔来了。虽然目前大部分人非常怀念和喜欢,但还能持续多久,再美好的东西都会疲劳(娶了女神的感受下),与其让用户抛弃,不如自己抛弃,不破不立,现在这套UI虽然毁誉参半,但相信会不断进步,一家有勇气的公司值得钦佩。

6、我说,「大家都平坦的时候,Apple拟物了,现在都拟物了,Apple又扁平了。锤子怎么办?」有人说,「锤子可能要锤子了。」

7、我说,「这二年苹果干的事就是缩小了iPad,拉长了iPhone,最后砸扁了iCon」有人说,「据说这次iOS7扁平化是为了iPhone6做准备的,iPhone6厚度将只有1毫米,如果iOS不扁平化,手机里的图标就装不下了」

8、再看一眼iOS6吧,让我们满怀惆怅的截屏保存原有的记忆,把那些充满了拟物情节和细节的精美图标留给历史,也许十年后会拟物风尚再起,那时让我们再对比这些十年前的设计,看孰优孰劣!

9、不建议非开发者升级iOS 7,目前这套操作系统还不够稳定,而且很多程序不兼容。大家还是好好用iOS 6,等待秋天降临。

最后,给大家推荐一篇神文,文章描述的是一部神奇的电影「富春山居图」,我给这篇文章的起了个名字就叫做「不要,在乎,这些,细节」,大家欢乐一下吧。

点击{不要,在乎,这些,细节}查看。

文章内容来自微信公众账号:MacTalk
· 微信号:sagacity-mac
· 回复 m 可以查阅所有历史文章和Mac Tips
· Web站点:macshuo.com

如果文章对你有价值,点击{Donate}对作者进行小额赞助

法律与娃

guardian

感谢所有赞助和持续订阅的读者,贴一个读者的反馈:

自从在图灵上看到你写的mac技巧文章,非常喜欢。后来订阅了微信公共平台,就一直用微信看,现在又有网站了,读起来也更方便了。看到你加了无负担小额捐助链接,我个人觉得非常好,好文就该捐助,一直只在国外网站上看到类似的donate链接,国内比较少见,我想从根本上来说还是思维习惯上的原因,我们不那么重视别人的知识产权。加这个链接也算是一个很好的开始,希望以后国内的这种意识能慢慢培养起来。

说的挺好,我希望在中国,持续创造有价值内容的作者也能得到应有的donation。关于赞助,大家记住「无负担」和「小额」这俩关键词,别看高兴了一哆嗦把10敲成100,不提倡!

另,想问一下我的读者里有没有UI设计师?能否帮MacTalk设计一个Logo,有朋友反映macshuo.com的顶部太空旷袅。有热心人可以联系我,联系邮箱:chijianqiang@outlook.com。

再另,有读者反馈想看建站相关的技术内容,这样的文章技术性较强,枯燥,写起来也没有扯淡那么愉快,也不知道有多少人喜欢看。So,想看的就说一声,反馈人多再动笔。


每周周末看几集美剧算我的娱乐活动之一,前一阵子追的几个美剧都结束了,比如生活大爆炸、福尔摩斯演绎法、斯巴达克斯、超感警探等,有的是当季结束,有的彻底完结,不知道大家在追什么美剧?

一个习惯养成之后突然中止是很痛苦的,所以这两天有事没事就网上扒拉扒拉,找个新美剧来填坑,结果发现了一部超感警探男猪脚西蒙·贝克在2001年主演『法外情真』,挺有意思。西蒙·贝克是我很喜欢的美剧演员,来自澳洲,表演风格独具魅力,风格迷人,有粉丝称「春风再美也比不过西蒙·贝克的笑容和蓝色眼睛」,戏谑、傲气、慵懒、温柔、阳光、忧伤,这些词汇都可以用在超感警探里的那个派翠克·简身上。超感警探的英文名称叫做The Mentalist,所以江湖人称西蒙·贝克为馒头叔,就取自这个谐音。

既然馒头叔在2001年就演美剧了,那一定要看下。结果发现这部2001年首播的美剧还是挺有意思的,首先馒头叔十多年前是个馒头兄弟,非常年轻非常「海瑟姆」,让人感慨时间就是杀猪刀。其次馒头叔在『法外情真』里扮演的是个天才律师,在他老爹创办的律师事务所任职,基本上属于高帅富之流(又一个励志拼爹案例,兄弟们,为了下一代,我们要努力成为好爹!),但是天有不测风云,由于有一次馒头叔搞party嗑药被抓了(米帝似乎是个人就嗑过药,怕怕),结果被判做社区服务,为一家儿童法律援助站担任问题儿童的辩护律师,同时还得负责律师事务所的案子,剧情就在高帅富和贫苦穷之间兜兜转转……

我看了几集有这么几点感触:

  1. 米帝的法律涉及方方面面,繁文缛节,细致到令人发指的程度,想了解米国的那些法,建议听一下《晓说》的第九期。
  2. 在米帝犯事了,有些可以选择通过提供社区服务服刑,就像『法外情真』的男主,他必须要免费为儿童提供法律服务,直到刑满为止。这多好,不用羁押不用住宿不用管饭,还能为社会创造财富。
  3. 孩子是属于国家的,而不是父母的。你生了娃,就要承担抚养的责任,换句话说你有孩子的监护权,一旦你不具备监护权资格了,孩子就会被毫不留情从你身边带走。各位看官如果有一天去了米帝生了娃,一定要对娃好一点。你要是下雨天打孩子被邻居发现了,你就完蛋了,没准孩子屁股还没红,警官就到了,那时候抱大腿也没用,哭闹上吊也没用,警察叔叔会坚定的把孩子带走交给有关组织,你必须在限期内证明木有虐待儿童,有各种资质各种资格,才能把娃要回来,否则就会被法官判定收容领养balabala……
  4. 想让孩子成为一个诚实的人,先做到自己不撒谎。教育孩子唯一理性的方式就是自己做个榜样!如果您是个正直的人,你的下一代也差不到哪去。如果您欺上瞒下鬼话连篇,那孩子也会学的惟妙惟肖。
  5. 不要过早的强调孩子之间的竞争,功利化的代价是让我们的孩子失去和谐的精神和赖以生存的文化。

总之,这是一个关于法律、教育、娃和馒头叔的故事,如果你是馒头叔的粉儿,可以去看看,如果想了解米帝的法律与娃,也可以看看。

文章内容来自微信公众账号:MacTalk
· 微信号:sagacity-mac
· 回复 m 可以查阅所有历史文章和Mac Tips
· Web站点:macshuo.com

如果文章对你有价值,点击{Donate}对作者进行小额赞助

MacTalk网站上线

今天MacTalk的Web站点正式上线,网址:https://macshuo.com ,大家久候。

原本想申请mactalk.com域名,查了一下发现这个域名已经被占用了,为了保证能够使用dotcom,短网址,好记,最后采用了现在的域名:macshuo.com,还是Mac君随便说说的意思哈。

目前发现联通默认的dns解析mactalk.com时好时坏,如果访问有问题,可以在网络设置中增加8.8.8.8的DNS Server.

整体网站采用了简洁的风格,顶部菜单有三个:首页、全部文章、关于我,都是顾名思义。左侧有全文检索、近期10篇文章、标签云等功能;支持移动设备的自适应,保证在手机上访问macshuo.com毫无压力(注意流量)。愿意通过Web方式留言的,可以去macshuo评论和交流,我同样会定期回复。目前网站内容完成了90%左右,后续会增加更多功能和细节完善,大家先去感受下罢。

另外,MacTalk从今天开始接收无负担小额赞助,支付宝账户是:jackychi@gmail.com。如果大家觉得MacTalk自有价值,并希望持续获得高质量内容,可以访问macshuo.com首页点击{无负担小额赞助}对作者进行小额赞助,也可以直接点击文章底部的{阅读原文}对作者进行小额赞助。

之前写付费还是免费的文章的时候,很多读者给我建议说,可以通过捐助的方式实现文章自愿付费。关于这种方式,我其实很早就给自己设定了两个要求,第一个是文章过百,第二个是建立Web站点,尤其是第二个,除了时间还需要费用投入。当着两个要求满足了,就可以接受赞助了。

So,就是今天!


本来今天想和大家谈一谈苹果公司的另一位联合创始人,史蒂夫·沃兹的有趣故事,但有事写不了了,做为明天的预告吧。

最近想到了一系列有趣的话题,后续给大家写出来看看。

这是一个忙碌的周末,很累,大家晚安吧……

你必须重新开始

enter image description here
上一期文章发了以后,很多读者反馈说,为毛不用艾维的头像做封面啊,让我们看看这家伙是怎么虎头虎脑又充满艺术感的。好吧,今天我就截了一张艾维演讲的图给你们瞅瞅,其中他正在碎碎念视网膜屏macbook pro的那点事,刚好说了一句:你必须重新开始。中心思想就是:「哥完全抛弃了老mbp的工艺设计,外部铝合金壳和内部芯片和电路结构全部重新来过,老牛逼了,你看着办,不买是你的损失。」大概就这意思。

我觉得这句话挺好的,正好拿来作为今天的主题,回答之前积累的两个问题。

问题一:

毕业三年,java开发。在青岛拿着4500的月薪,因为兴趣自学了Objective-C,写些iPhone的小demo,没做过实际的项目。很迷茫,有时候想再回北京奋斗两年赚个首付回青岛,但害怕自己中途又受不了北京那压抑孤独的环境再次半途而废,但是在青岛这样下去实在无法安定下来,因为攒不下钱。很迷茫,不知道下一步该怎么走了,求指点。

问题二:

毕业一年,在盛大工作。工作中使用Windows为主,开发,运维,服务器都使用Windows,可我觉得自己还是喜欢玩命令行,喜欢linux,业余时间自己也在看书,学习,但是也没啥成就。请问,我这样坚持下去对本职工作也没啥用(之前目前是),请给点建议吧?

我觉得这俩问题的共性是,对现状不满意,业余时间学了点其他技术,但无法做出改变。之前我提到过《城中大盗》里的一句台词,「你知道吗,人们每天起床,做着同样的事情,他们告诉自己,有一天要改变生活,但他们从来不付诸行动。我想改变自己的生活」。想要改变生活,就要付诸行动,没有更直接的建议了。 我想这两位读者都是「80非常后」,20郎当岁,有想法有激情有大把时间,而且Nothing to lose,所以我的建议就是「尽快重新开始」。想去北京挣首付的,赶紧准备简历和火车票。不喜欢再玩windows的,一边学习Linux,一边找工作是正道。

有时候你必须重新开始,就是这样。

明天周五,打球休息!我不是自媒体人,也不靠这玩意养活自己,就别死乞白赖的写了,你们也都好好歇歇,陪陪家人朋友,别老玩手机了啊。


今天我们接着之前OC的内容,讲讲新的Objective-C在语法层面做了哪些简化。

4、语法简化

很多刚从其他编程语言转到Objective-C的同学看到长长的函数名会感到崩溃,不过我之前也提到过,这种语法让消息的传递像一个英语句子,大大增强了可读性。比如你想初始化一个浮点数,需要这么写:

NSNumber value = [NSNumber numberWithFloat:123.45f];

从这句中我们能够明确的知道代码的含义,但是,是否连简单的赋值语句也要这么处理呢?苹果在本次新特性中采用了折中的处理方式,针对很多基础类型采用了简写的方式,实现语法简化。简化以后,我们会发现从语法层面,这些简化的Objective-C更像Python和Ruby等动态语言的语法了。下面我们逐一介绍:


NSNumber

简化前的写法:

NSNumber *value;
value = [NSNumber numberWithInt:12345];
value = [NSNumber numberWithFloat:123.45f];
value = [NSNumber numberWithBool:YES];

简化后的写法:

NSNumber *value;
value = @12345;
value = @123.45f;
value = @YES;

装箱表达式也可以采用类似的写法:

NSNumber *piOverSixteen = [NSNumber numberWithDouble: ( M_PI / 16 )];
NSString *path = [NSString stringWithUTF8String: getenv("PATH")];

可以分别简写为:

NSNumber *piOverSixteen = @( M_PI / 16 );
NSString *path = @( getenv("PATH") );

对于字符串表达式来说,需要注意的是表达式的值一定不能是NULL,否则会抛出异常。

NSArray

对于NSArray的初始化来说,有非常多的写法,这里就不再一一罗列,我们直接看新的写法

NSArray *array;
array = @[];             //空数组
array = @[ a ];          //一个对象的数组
array = @[ a, b, c ];    //多个对象的数组

非常简单,再也不用记住初始化多个对象的数组时,后面还要跟一个倒霉的nil。

现在我们看一下当声明多对象的数组时,编译器是如何处理的:

array = @[ a, b, c ];

编译器生成的代码:

id objects[] = { a, b, c };
NSUInteger count = sizeof(objects)/ sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];

好吧,编译器已经为我们把这些简单重复的工作都做了,我们就可以安心解决真正的问题了:)不过有一点要注意,如果a,b,c对象有nil的话,运行时会抛出异常,这点和原来的处理方式不同,编码的时候要多加小心。

NSDictionary

同样,对于字典这个数据结构来说,有很多种初始化的方式,我们来看新的写法:

NSDictionary *dict;
dict = @{};     //空字典
dict = @{ k1 : o1 };     //包含一个键值对的字典
dict = @{ k1 : o1, k2 : o2, k3 : o3 }; //包含多个键值对的字典

    最后我们总接一下容器类数据结构简化的限制:

1、采用上述写法构建的容器都是不可变的,如果需要生成可变容器,可以传递-mutableCopy消息。例如

NSMutableArray *mutablePlanets = [@[
@"Mercury", @"Venus", @"Earth",
@"Mars", @"Jupiter", @"Saturn",
@"Uranus", @"Neptune"
] mutableCopy];

2、不能对常量数组直接赋值,解决办法是在类方法(void)initialize进行赋值,如下:

@implementation MyClass

static NSArray *thePlanets;
+ (void)initialize {
    if (self == [MyClass class]) {
        thePlanets = @[
        @"Mercury", @"Venus", @"Earth",
        @"Mars", @"Jupiter", @"Saturn",
        @"Uranus", @"Neptune"
        ];
    }
}

3、没有常量字典