未加星标

Ubuntu 14.04 TLS Nginx搭建静态文件服务器

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏
Nginx搭建静态文件服务器 [官方教程] https://www.nginx.com/resources/admin-guide/serving-static-content/

打开Nginx的配置文件: /etc/nginx/sites-available/default ,找到 server ,添加以下配置:

server {
# 监听来自所有网络上的80端口的请求
listen 0.0.0.0:8080;
# 这个server的根目录
root /usr/share/nginx/files;
# 下面的东西是需要自行添加的配置
location ~ \.(png|gif|jpg)$ {
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运行环境安装一个 php5-fpm 包即可:

sudo apt-get install php5-fpm

去掉Nginx配置文件里关于php5-fpm的三行(A/B/C,当然也要包含X/Y两行)注释:

# 同样是在server的区块里
location ~ .*\.php$ { # X
# 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; # A
fastcgi_index index.php; # B
include fastcgi_params; # C
} # Y

关于A行可以先执行命令:

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

查找到:

listen = /var/run/php5-fpm.sock

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

使用PHP上传文件 配置"php.ini"文件

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

设置:

file_uploads = On

在 /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的开发者工具里看到以下信息:


Ubuntu 14.04 TLS Nginx搭建静态文件服务器

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


Ubuntu 14.04 TLS Nginx搭建静态文件服务器

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


Ubuntu 14.04 TLS Nginx搭建静态文件服务器
[CentOS 6上用Nginx搭建静态文件站的方法 http://www.linuxidc.com/Linux/2017-01/139196.htm ]

本文地址 : http://www.codesec.net/Linux/2017-01/139197.htm

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: Nginx服务器UbuntuPHPLinuxChromeHTML浏览器
分页:12
转载请注明
本文标题:Ubuntu 14.04 TLS Nginx搭建静态文件服务器
本站链接:http://www.codesec.net/view/520230.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(39)