CentOS 6(64-bit) + Nginx搭建静态文件服务器

   2017-01-06 0
核心提示:Nginx搭建静态文件服务器使用命令打开Nginx配置文件:sudo vim /etc/nginx/conf.d/default.conf将配置改为:server {............# 下面的东西是需要自行添加的配置location ~ \.(png|gif|jpg|jpeg)$ {root /usr/share/nginx/images; #这个将替换`server-root

Nginx搭建静态文件服务器

使用命令打开Nginx配置文件:

sudo vim /etc/nginx/conf.d/default.conf

将配置改为:

server {
    ......
    ......
    
    # 下面的东西是需要自行添加的配置    
    location ~ \.(png|gif|jpg|jpeg)$ {
        root /usr/share/nginx/images; #这个将替换`server->root`配置
        # expires 1d;
        index default.jpg;
    }
    # 上面就是需要添加的东西了
    # 对于满足以 .png/.gif/.jpg 结尾的url请求,
    # 将其根目录定义为 /usr/share/nginx/images
    # 文件的有效期为一天(如果需要可以取消注释)
    
    ......
    ......
}

设置完之后通过命令:

sudo service nginx restart

重启Nginx后生效。

如果遇到启动失败,使用命令:

nginx -t

查看错误信息

Nginx搭建PHP运行环境

PHP运行环境安装一个 php-fpm 包即可:

sudo yum install php-fpm

执行命令打开对应的配置文件:

sudo vim /etc/nginx/conf.d/default.conf

将server_name改为:

server_name localhost;

将第一个默认的 localtion 改为:

location / {
    try_files $uri $uri=404;
}

将 404 改为:

error_page 404 /404.html;

执行命令:

vim /etc/php-fpm.d/www.conf

查找并记住 listen 内容(以下127.0.0.1:9000是我本机的设置):

listen = 127.0.0.1:9000

去掉Nginx配置文件里的PHP的配置改为如下:

# 同样是在server的区块里
location ~ \.php$ {
    try_files $uri = 404;
    fastcgi_pass 127.0.0.1:9000; # 就是上面查找到的127.0.0.1:9000这个内容
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

可以得知我们的配置是正确的。

使用PHP上传文件

配置"php.ini"文件

sudo vim /etc/php.ini

如果不知道php.ini文件在哪里,请执行命令:

php -i | grep "Loaded Configuration File"

设置:

file_uploads = On

重启PHP服务:

sudo service php-fpm restart

/usr/share/nginx 中创建HTML表单 upload.php

<?php
// 这两行是用来调试错误的,详见后文中的备注
// ini_set('display_errors', 1);
// echo exec('whoami');

// 该方法会将所有收到的文件以GUID的文件名存储起来
functionGUID(){
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }

    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}

$d = date('Y-m-d'); // 日期格式 yyyy-MM-dd,用来将图片文件按日期分组
$target_dir = "images/".$d.'/'; // 存储目录
$uploadOk = 1; // 判断是否通过检测的标记
$errorMsg = array(); // 如果遇到上传错误,错误信息列表
$imageFileType = pathinfo(basename($_FILES["fileToUpload"]["name"]),PATHINFO_EXTENSION); // 文件的扩展名
$file_name_raw = GUID() . '.' . $imageFileType; // 存储到服务器端的唯一文件名
$target_file_unique = ''; // 存储之后的文件名相对路径
$tokens_valid = array('ABC','78C0C020-6DCA-4B97-82CD-D83FEF80331A'); // token列表,用来控制权限, 可以定期手动更新

// 由于是独立的站点,因此简单的用写死的token作为上传图片权限的基本验证
if(!in_array($_POST['token'], $tokens_valid)){
    array_push($errorMsg, "You are not authorized to upload images.");
    $uploadOk = 0;
}
else{
    $target_file_unique = $target_dir . $file_name_raw;

    // Check if image file is a actual image or fake image
    if(isset($_POST["submit"])) {
        $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
        if($check === false){
            array_push($errorMsg, "File is not an image.");
            $uploadOk = 0;
        }
    }

    if(is_dir($target_dir)==false){
        mkdir($target_dir, 0755);
    }

    // 文件大小不能超过50M
    if ($_FILES["fileToUpload"]["size"] > 50000000) {
        array_push($errorMsg, "Sorry, your file is too large. It must be smaller than 50M.");
        $uploadOk = 0;
    }
    
    // 判断是否是支持的格式
    if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) {
        array_push($errorMsg, "Sorry, only JPG, JPEG, PNG & GIF files are allowed.");
        $uploadOk = 0;
    }
    
    // 是否上传成功,有没有遇到内部错误
    if (!move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file_unique)) {
        array_push($errorMsg, "Sorry, there was an error uploading your file.");
        $uploadOk = 0;
    }
}

// 如果有错误,则将错误信息全部返回到客户端
$errorMsgOutput = '';
foreach($errorMsg as $msg){
    $errorMsgOutput = $errorMsgOutput.$msg;
}

// 返回的是Json格式的内容,便于客户端解析
echo '{"success":"'.($uploadOk == 1 ? 'true': 'false').'","url":"'.$target_file_unique.'","errorMsg":"'.$errorMsgOutput.'"}';

?>

备注:

遇到php报 500 Server internal error 错误怎么办?

在对应的php文件中增加:

ini_set('display_errors', 1);

在.htaccess文件中(如果没有该文件则手动创建一个空文件)添加:

php_flag display_errors 1

遇到php报 move_uploaded_file:failed to open stream: Permission denied in /usr/share/nginx/images 怎么办?

在对应的php文件中增加:

echo exec('whoami');

比如输出的是:

www-data

执行以下语句赋予权限(语句中的www-data应该对应whoami的输出值):

sudo chown www-data /usr/share/nginx/images

sudo chmod 0755 /usr/share/nginx/images

解决跨域的问题

由于是独立的静态文件服务器,所以必定会遇到跨域上传的问题,可以这样解决:

第一步:

sudo vim /etc/nginx/conf.d/default.conf

添加以下配置:

location ~ \.(png|gif|jpg|jpeg)$ {
    ...
    ...
    add_header Access-Control-Allow-Origin *; // 添加这一行配置
    ...
    ...
}

第二步:

做Nginx根目录下添加文件:crossdomain.xml

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">

<cross-domain-policy>
  <allow-access-from domain="*"/>
</cross-domain-policy>

在浏览器里直接访问: http://url/crossdomain.xml 访问该文件,可以正常访问即可。

以Uplodify为例:

没有增加跨域配置之前:

如果使用uploadify上传文件,可以做Chrome的开发者工具里看到以下信息:

CentOS 6(64-bit) + Nginx搭建静态文件服务器

Uploadify页面上会显示如下错误:

CentOS 6(64-bit) + Nginx搭建静态文件服务器

修改配置之后,从Fiddle可以看到上传已经成功,返回了正确的Json:

CentOS 6(64-bit) + Nginx搭建静态文件服务器

本文永久更新链接地址 http://www.linuxidc.com/Linux/2017-01/139196.htm

 
标签: Nginx Linux命令
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Debian 环境安装新版 nginx
    Debian 环境安装新版 nginx
    在 Debian 系统中,我们可以通过 apt-get 安装系统自带的 nginx,这样安装的 nginx 版本略旧。Nginx 官网提供了一些编辑绎好的 deb 安装包,我们只需更新安装源,就可以通过 apt-get 来安装最新的稳定版 Nginx 了。 加载安装源并导入key$ echo deb http://ng
    03-08
  • nginx实战(1):宝塔设置反向代理 宝塔反向代理为什么访问不了
    nginx实战(1):宝塔设置反向代理 宝塔反向代
    以下操作适用于默认80端口转其他地址非80端口情况。添加网站注意:因我只是拿来当反向代理来使用,所PHP为纯静态模式。开启反向代理注:目标URL为最终目的地,发送域名为默认,如设置后无效则修改为上图中所示。修改反向代理配置文件说明: 修改反向代理的配置
    03-08
  • nginx1.18.0
    nginx1.18.0
    目录简介安装yum方式安装nginx编译方式安装systemd管理动态添加第三方模块作用提供静态内容简单的代理服务器设置FastCGI代理配置为注释内容使用nginx的命令以及工作机制nginx配置文件nginx_manual查看nginx安装的模块nginx是一个高性能的HTTP和反向代理web服
    03-08
  • Nginx 通过 certbot 为网站自动配置 SSL 证书并续期
    Nginx 通过 certbot 为网站自动配置 SSL 证书并
    1.1、http 和 https 是什么?简单来说,http 是一个传输网页内容的协议,比如你看到的 http 开头的网站 http://www.163.com ,其网页上的文字、图片、 CSS 、 JS 等文件都是通过 http 协议传输到我们的浏览器,然后被我们看到。而 https 可以理解为“ HTTP ov
    03-08
  • 使用漏洞检查器验证 NGINX 安全设置
    使用漏洞检查器验证 NGINX 安全设置
    介绍需要强大的安全设置来保护 Web 服务器免受网络攻击。我们使用漏洞诊断工具验证了 NGINX 安全设置所需的项目。相关术语回顾什么是 NGINX?摘自维基百科 免费和开源的网络服务器开发时专注于处理性能、高并发和小内存使用具有 HTTP、HTTPS、SMTP、POP3 和 I
    03-08
  • Nginx端口占用问题
    错误信息:nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use)主要是端口被占用,通过如下命令,可以查看该端口被那个应用占用:sudo netstat -ntpl 然后kill -9 PID将其杀死关闭即可解决
    02-13
  • 基于Nginx的网关实现
    基于Nginx的网关实现
    Nginx介绍正向/反向代理 (1)正向代理正向代理,"它代理的是客户端,代客户端发出请求",是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交
    02-13
  • nginx实现unigui群集
    nginx实现unigui群集
    nginx实现unigui群集在笔者写此文的时候,UNIGUI1.50.x的版本已经发布,其提供的HyperServer已经支持群集。有网友还专门为此做了群集方面的测试:从上图可以看出:群集总共开了51个UNIGUI服务程式,总共有13357个客户端(sessions)连接,并且如此多的连接还操
    02-13
  • Linux使用nginx反向代理。可实现域名指向特定端
    在配置80指向域名的时候出现端口占用,使用kill -9无法杀死端口,应使用下面的命令来杀死进程killall -9 nginx(使用完本命令需要再把配置过的配置文件重新启动。命令写在了PS下面)后在root权限下的nginx的sbin下使用./nginx -t(命令重启nginx并检查是否有语
    02-13
点击排行