使用Nginx搭建静态文件服务及配置PHP运行环境

缘起

最近一直在忙毕业设计。其中有一环需要搭建一个静态服务器,用于提供文件上传、下载和以及图片访问。由于一直以来用的都是Nginx,所以也就想到了用Nginx来搭一个静态文件服务器和一个PHP运行环境。这里简要记录下搭建步骤。

注:原文链接,转载请注明出处

关于Nginx的配置文件里的参数的意义,恰好搜到这篇文章《Nginx配置文件nginx.conf中文详解》,总结的相当不错。推荐一看。

Nginx搭建静态文件服务器

在网上搜罗了一圈,相关的文章一大把,讲得既多又杂,但其实只涉及简单的几行配置而已。

打开Nginx的配置文件,默认的是/etc/nginx/sites-available/default这个文件。找到server这一块内容,在里面添加以下的配置,相关注释已标注出来,各位看管根据需要自行修改一下就好哈。

server {
    # 监听来自在所有网络上的80端口的请求
    listen 0.0.0.0:8080;

    # 这个server的根目录
    root /home/sr1/test;

    # ....这里省略其他无关项目

    # 下面的东西是需要自行添加的配置
    location ~ ^/upload/.*\.(png|css|jpg|apk)$ {
        root /home/sr1/files;
        expires 1d;
    }
    # 上面就是需要添加的东西了
    # 对于满足正则表达式 ^/upload/.*\.(png|css|jpg|apk)$ 的url请求,
    # 将其根目录定义为 /home/sr1/files
    # 文件的有效期为一天

    # 这里的效果是,对于满足任意满足”以/upload/“开头,
    # 以png、css、jpg、apk结尾的url请求
    # 将到/home/sr1/files文件夹下去根据这个模式寻找文件,并提供给请求方
}

设置完上面的之后,重启下Nginx服务器,就生效了。重启的命令是:sudo service nginx restart

Nginx搭建PHP运行环境

我的Linux系统是LinuxMint,一个基于Ubuntu的衍生版,包管理工具当然是apt-get咯。

因为仅仅是需要PHP的运行环境,因此只需要简单的下载一个php5-fpm包就搞定了,安装命令为:sudo apt-get install php5-fpm

之后需要简单的去掉Nginx配置文件里关于php的那几行就好。如下:

# 同样是在server的区块里
location ~ .*\.php$ {
#     fastcgi_split_path_info ^(.+\.php)(/.+)$;
#   # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

#   # With php5-cgi alone:
    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服务器就好。但看注释,理论上安装的是php-fpm,应该取消注释的是:fastcgi_pass unix:/var/run/php5-fpm.sock这一行才对,但我试了很多次都不成功,最后查看了下php的配置文件/etc/php5/fpm/pool.d/www.conf,发现listen = 127.0.0.1:9000这行,才发现php-fpm模块监听的地址是127.0.0.1:9000,改成了上面那样就能成功运行php程序了。

使用PHP发起http请求

php发起网络请求比较麻烦,因为php本身并不具备这样的库,一般是借助curl这个工具来实现的。因此需要先安装curl,以及php-curl开启了这个扩展才能使用。如果不确定自己的php环境是否能够使用curl,可以写一个php页面,内容为:<?php echo phpinfo(); ?>看一下输出的信息里有没有curl字段来判断。

如果没有curl或php-curl,就需要安装下他们,命令同样是sudo apt-get install 包名,这里我遇到一个很奇葩的事:无法安装php-curl!错误信息是下载失败,奇了怪了。我配置的源是网易的镜像mirrors.163.com,怀疑是网易的源的问题,改用了北京化工学院的源mirror.bit.edu.cn,执行sudo apt-get update之后再安装还是下载失败。主动去源那里找,发现目录里是有这个包,但下载的时候就不行了。最后只能祭出了法宝:百度网盘。使用网盘的离线下载功能,把php-curl的deb包下载下来,输入命令sudo dpk -i 本地文件安装,搞定。

在这一步折腾了很久,不知道这个问题到底是什么引起的。只能默默感概,在天朝当程序员实在是太苦逼了。

配置完之后,就能使用curl来发起http请求了。下面是网上找到的一个函数,实测挺好用的。

function http($url, $method, $postfields = NULL) {
    $ci = curl_init();
    curl_setopt($ci, CURLOPT_URL, $url);
    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30); // 连接超时  
    curl_setopt($ci, CURLOPT_TIMEOUT, 30); // 执行超时  
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, true); // 文件流的形式返回,而不是>直接输出  
    curl_setopt($ci, CURLOPT_ENCODING, "gzip");
    curl_setopt($ci, CURLOPT_HEADER, FALSE);
    if ('POST' == $method) {
        curl_setopt($ci, CURLOPT_POST, true); // post  
    }
    if (!empty($postfields)) {
        curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); // post数据 可为数组>、连接字串  
    }
    $response = curl_exec($ci);
    if (false) {
        echo "=====post data======rn";
        var_dump($postfields);

        echo '=====info=====' . "rn";
        print_r(curl_getinfo($ci));

        echo '=====$response=====' . "rn";
        print_r($response);
    }
    curl_close($ci);
    return $response;
}

支持post和get,根据需要传入相应的参数即可。

使用php支持文件上传

使用php支持文件上传其实很简单,不知道为什么之前一直觉得难,导致每次想到要做文件上传就心虚。下面是核心的代码:

function saveUploadFile($saveToPath) {
    if ($_FILES["file"]["error"] > 0) {
        echo $_FILES["file"]["error"];
    } else {

        echo '文件名:' . $_FILES["file"]["name"];
        echo '文件类型:' . $_FILES["file"]["type"];
        echo '文件大小:' . ($_FILES["file"]["size"] / 1024) . 'kB';
        echo '文件临时保存路径:' . ($_FILES["file"]["tmp_name"];

        // 将文件保存到新的目录下,如果不保存的话,临时保存的文件会在执行结束后被自动删除
        if (move_uploaded_file($_FILES["file"]["tmp_name"], $saveToPath.$_FILES["file"]["name"])) {
            echo '保存至:' . $saveToPath.$_FILES["file"]["name"];
        } else {
            echo '保存过程中出现错误,保存失败';
        }
    }
}

这里可能会因为文件太大而上传失败,爆出来的错误是413 Request Entity Too Large,这里需要改下Nginx和php的相关配置,参考这个的指南《Nginx: 413 Request Entity Too Large Error and Solution》改下就好了。

That's all, but not ALL.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容