在这个博客最终被搭建成功时,我是有许多感慨的。感慨之一,作为一个学机械出身的电子工程师来学linux和搭建简单的网络应用,遇到的麻烦也是超级多的,但也是着实有趣。感慨之二,我终于又开始写博客了,这点以后再说。

第一篇文章,是 [How To] 系列的,感觉也是怪怪的,也许是因为我一直想写一篇类似“我从哪里来”的短文?

--- 废话不多说 ---

在3月1号,树莓派3发布的第二天,我就拿到了PI3,之后便一直沉浸在linux里面;这是我第一次深入地去接触和了解linux。
在配置的过程中,总是遇到各种各样的困难,等到最终了解了,解决了,回过头来看,其实都是一些很简洁明了的坑。

--- 废话不多说(1) ---

Front References:
使用树莓派搭建LNMP服务器,成功运行typecho。
http://www.chinagtd.com/archives/lnmptypecho.html

利用raspberry pi搭建typecho笔记(一) nginx PHP server quick start
http://www.cnblogs.com/kururu/p/3536416.html

如果感兴趣,可以先看看这两篇我主要参考的笔记,整个过程都很清晰明了了。
有人可能会问,大神们的笔记都已经介绍过整个部署过程了,为什么我要写这篇文章把这个安装过程再说一遍呢..
“因为用不了!”

我猜测的原因,因为nginx版本更新了,配置文件有变化,所以不能直接按照他们的操作。网上找到的教程都是2014年以前的。

我的系统是: Raspbian Jessie
Linux raspberrypi 4.1.20-v7+ #867 SMP Wed Mar 23 20:12:32 GMT 2016 armv7l GNU/Linux

0 空

当然,绝大部分“教程”,在做任何安装软件之前,sudo apt-get update 和 速冻凹凸个体奥普鬼 (sudo apt-get upgrade)都是必不可少的。

1 安装 Nginx,MySQL 和 php 和一些乱七八糟的

sudo apt-get install nginx php5-fpm php5-cgi php5-cli php5-curl php5-gd php5-mcrypt php5-mysql php5-memcache php5-gd php5-sqlite php5-cgi php5-xmlrpc mysql-server mysql-client

一路确定,一路yes。就装完了这三和他们依赖的东东了。具体哪个是干嘛的,看名字就懂,不懂也没事儿,反正我看不懂。
如果你是第一次装,千万别急着去优化配置文件什么的,被那些优化把安装的节奏乱掉了,人就烦躁了,装好了想要优化直接看文章最后的几个安装笔记。

这时候最应该做的,是在浏览器输入 http://你的树莓派IP地址 ,看看nginx的初始页面的样子,打一下鸡血。
白底黑字的真心跟typecho一样简洁呢。

注意:
我的nginx 版本为 1.6.2
查看可以使用这个命令
nginx -v
如果你的版本是1.2x 那么直接使用默认配置文件,不会有php白屏问题。不需要按我强调的修改

2 安装PhpMyAdmin

这货是用来管理数据库的,安装完成后,用这货操作数据库,给typecho 建立一个用户名和密码,这样typecho就能自己操作数据库了。安装过程中,会让输入数据库的密码,什么的,注意看内容选择就好。但是很奇怪这货在安装的时候没有nginx的选项,我选的是Apache2,一样用。

sudo apt-get install phpmyadmin

安装完成后,把它,link一个到 /var/www/html, 也就是新的nginx的默认网页文件夹,这样你就可以通过网页,访问它了。

sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

并且把这个文件夹的权限改成谁都可以读写执行,为了后面安装typecho做准备

sudo chmod -R 777 /var/www/html

然后重启一下

sudo php5enmod mcrypt
sudo service php5-fpm restart

*注意:
新的nginx(我的版本 1.6.2) 已经将默认网页目录放在 /var/www/html 了,如果你是按着老的教程进行的安装,请忽略他们的关于修改网页目录的部分*

再打一下鸡血? 在浏览器输入 http://你的树莓派IP地址/phpmyadmin
应该就能看到phpadmin的登录界面了,用户名是root 密码是你在刚刚安装的时候输入的密码
如果看到的是一个白白白blank page,没关系,我们需要继续设置一下nginx的网站配置

3. 配置nginx 网站属性。

为嘛我说配置网站属性,而不是配置nginx呢?
因为一个nginx是可以跑多个网站的! 而按教程直接去配置 /etc/nginx/nginx.conf 这个全局配置,就是在挖坑给以后的你。千万在不了解的时候别去动这个文件

nginx 有针对每一个网站的配置文件,在这个文件下面的配置,跟在全局配置是一样的。这些文件存放在 /etc/nginx/sites-available/ 如果想启用他们,就在隔壁文件夹/etc/nginx/sites-enable/建立一个链接文件,然后就可以启用了。/etc/nginx/sites-enable下默认已经有了一个链接到default的文件。所以我们可以直接修改或者重写/etc/nginx/sites-available/default 来配置我们的网页。

这个default也很珍贵,可以先备份一下

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup

为了偷懒,备份完之后我们把它删除,然后再新建名称一样的配置文件,作为我们网站的配置

sudo rm -rf /etc/nginx/sites-available/default
sudo nano /etc/nginx/sites-available/default

然后把我的配置放进去

server {
      listen 80 default_server;
      root /var/www/html;
      index index.html index.htm index.php;

      server_name aircheese.me;

      location / {
        if (-f $request_filename/index.html){
            rewrite (.*) $1/index.html break;
        }
        if (-f $request_filename/index.php){
            rewrite (.*) $1/index.php;
        }
        if (!-f $request_filename){
            rewrite (.*) /index.php;
        }
    }

    location ~ .*\.php(\/.*)*$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
  }
}

*简单说一下代码,第一个location之前,描述的是一些网站的全局配置。
第一个 location 是 typecho 打开永久地址转换需要的重写规则。在你后面设置的时候typecho会自动检测是否可以打开,可能会检测失败,你选择强制打开即可。
第二个 location 是 pathinfo 的支持,对于 typecho 这个是必须有的*

根据你的网页,有几个地方是需要修改的
server_name 后面修改成你的域名
root 需要确认是否是你的网站目录(如果你按我的教程,这个地方应该不用改的)
listen 80 如果你的80端口被封了,你需要按其他教程的改成81或者8080

保存后,重启nginx服务,就可以使用新的配置了

sudo service nginx restart

由于一些列历史原因,如果你按照之前的配置笔记去配置nginx,那你有很大的几率会出现上面提到的php页面是白屏。
而这个原因,是因为上面配置的最后一个语句:include fastcgi.conf; 在几乎所有的教程里面都使用include fastcgi_params; 。fastcgi_params相比include fastcgi.conf;少了一条路径的定义。
这部分具体请看: http://stackoverflow.com/questions/15423500/nginx-showing-blank-php-pages

到这里,你可以按其他教程,写一个info.php 来测试你的网页是否工作了。

在/var/www/html/ 目录下创建info.php,复制下面的进去,然后保存。

<?php
phpinfo();
?>

然后浏览器访问 http://你的树莓派ip地址/info.php 如果出来的不是白网页,你就可以乐呵呵啦。如果还是白,请参照上面链接,栈溢出(stackoverflow)里面的其他解法

4 安装 typecho

还记得我们在 安装PhpMyAdmin 的时候把 phpmyadmin 链接到 /var/www/html里面么? 安装typecho其实也是一样的,我们要做的,就是把typecho 下载下来 (http://typecho.org/download),然后解压缩到html里面。然后通过到地址: http://你的树莓派IP地址/install.php 就能看到typecho的安装界面了。

比如,我的typecho下载在 /home/pi/build.tar.gz 我要把它解压到/var/www/html里面

cd /var/www/html
tar -xzvf /home/pi/build.tar.gz

然后他们就都到 /var/www/html/build 里面了。那怎么把文件都移动出来呢?进到build里面用 mv ../就可以了。 代表全部文件和文件夹 ../代表上一级目录

cd build
mv * ../

然后重启一下nginx (我不清楚是不是需要重启)

sudo service nginx restart

然后通过到地址: http://你的树莓派IP地址/install.php 应该就能看到typecho的安装界面了。
等你看到安装页面,这篇文档也应该结束它滴使命啦


PS:
博客的安装,和链接到数据库,这篇教程很清楚了。
站长百科:Typecho 安装教程
http://www.zzbaike.com/wiki/Typecho_%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B

PS(1):
说到数据库,你也可以建立一个用户给typecho用,我也推荐这样。最好不要直接root账户。

PS(2):
什么,你没装成功?你不干了?想卸载么?别找我,我也不懂怎么卸载那一堆东西,谁叫你开始之前没有全盘镜像备份。。

PS(3):
除了在开始之前推荐的两篇教程以外,其他我觉得很有用的文章
我的树莓派玩机攻略—搭建nginx+mysql+php(优化参考,开启gzip,切不可直接复制他的配置文件,不然等着白)
http://blog.chensibo.com/i-work-for-nginx-mysql-php-raiders-build-raspberry-pi/

Raspberry PI树莓派搭建LNMP环境跑Typecho(年代久远,仅供参考)
http://raspiweb.ch/post-13.htm/comment-page-2

利用raspberry pi搭建typecho笔记(三) typecho nginx sqlite FAQ(如果遇到错误,请参照这篇,不可直接复制他的配置,同样等白)
http://www.cnblogs.com/kururu/p/3536626.html

Typecho官方文档有关于nginx的配置,可供参考
http://docs.typecho.org/servers?s[]=nginx

PS(4) :
我的default配置,加入了gzip网页压缩,修改自 https://loftor.com/archives/typecho_nginx_conf.html 仅供参考。原文的 include fastcgi_params;需要修改为include fastcgi.conf; 即可解决php白问题。

server {
  listen 80 default_server;
  root /var/www/html;
  index index.html index.htm index.php;

  gzip on;
    gzip_min_length 1k;
    gzip_buffers 16 64k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

  server_name aircheese.me;

  location / {
        if (-f $request_filename/index.html){
            rewrite (.*) $1/index.html break;
        }
        if (-f $request_filename/index.php){
            rewrite (.*) $1/index.php;
        }
        if (!-f $request_filename){
            rewrite (.*) /index.php;
        }
    }


  location ~ .*\.php(\/.*)*$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
  }
}