Nginx Upload Module 上传模块

传统站点在处理文件上传请求时,普遍使用后端编程语言处理,如:Java、PHP、Python、Ruby等。今天给大家介绍Nginx的一个模块,Upload Module上传模块,此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面

GitHub: https://github.com/vkholodkov/nginx-upload-module/tree/2.2

Site: Upload | NGINX

一、安装模块

#### nginx依赖
yum -y install pcre-devel openssl-devel zlib-devel

### 获取所需的模块源码,并自行解压
wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
wget http://www.openssl.org/source/openssl-1.0.2k.tar.gz

###源码编译nginx,添加uoload模块
wget http://nginx.org/download/nginx-1.8.1.tar.gz
tar -zxvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --with-http_ssl_module --with-http_stub_status_module --with-openssl=/home/opt/openssl-1.0.2k --add-module=/home/opt/nginx-upload-module-2.2
make && make install
###安装nginx服务命令
ln -s /usr/sbin/nginx /usr/bin/nginx

二、启动服务

配置nginx.conf文件

cat  /etc/nginx/nginx.conf
user  root;
#user www-data www-data;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
#    include /etc/nginx/conf.d/*.conf;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;
    gzip_http_version 1.0;
    gzip_comp_level 3;
    gzip_min_length 1100;
    gzip_buffers     4 8k;
    gzip_proxied any;
    gzip_types
      text/css
      text/javascript
      text/xml
      text/plain
      text/x-component
      application/javascript
      application/json
      application/xml
      application/rss+xml
      font/truetype
      font/opentype
      application/vnd.ms-fontobject
      image/svg+xml;

    gzip_proxied        expired no-cache no-store private auth;
    gzip_disable        "MSIE [1-6]\.";
    gzip_vary           on;

    include /etc/nginx/conf.d/*.conf;

    add_header Access-Control-Allow-Headers X-Requested-With;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;

    #gzip  on;

    server {
        listen       8080;
        server_name  localhost;
        error_page 405 =200 $uri;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location /upload {
            upload_pass   /info.php;       ##本文中使用静态文件实现上传文件功能验证
#           upload_pass @handle_upload;    ##如果这里使用的service而非静态文件实现的上传文件步骤,则使用@,在后续配置出@handle_upload服务的http://ip:port
            upload_store /data/uptmp;
            upload_limit_rate 1024k;
            upload_set_form_field "${upload_field_name}_name" $upload_file_name;
            upload_set_form_field "${upload_field_name}_content_type" $upload_content_type;
            upload_set_form_field "${upload_field_name}_path" $upload_tmp_path;
            upload_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5;#md5
            upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;
            upload_pass_form_field "^submit$|^description$";
        }

        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }

#        location @handle_upload {
#            proxy_pass http://127.0.0.1:8080;
#        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

}

因为在测试中,使用的php文件,所以nginx需要配置启动php服务。php配置的服务见上nginx.conf中的location ~ \.php${}配置,nginx默认集成php服务,现在需要在环境启动php-fpm服务,构建php文件运行环境。

php-fpm默认运行是socket,但这里给php服务配置的9000端口,配置过程如下:

###php-fpm服务安装与启动
yum install  php-fpm
systemctl start php-fpm

###修改php-fpm服务的配置文件
####查找php.ini文件位置,这里找到在/etc/php.ini,根据该文件位置找其他配置文件
php --ini |grep Loaded
vim /etc/php-fpm.d/www.conf
####在大概64行修改如下:
 62 ; accepted from any ip address.
 63 ; Default Value: any
 64 listen = 127.0.0.1:9000
 65 listen.allowed_clients = 127.0.0.1

###重启服务
systemctl restart php-fpm

 启动nginx

###bginx服务启动
nginx -c /etc/nginx/nginx.conf

###nginx的配置文件做了修改,重新加载命令
nginx -s reload

三、测试

在本地安装的nginx目录:/usr/local/nginx/html,放入访问html文件和服务脚本info.php文件

[root@test ~]# cat /usr/local/nginx/html/up.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test upload</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<form name="upload" method="POST" enctype="multipart/form-data" action="/upload">
<input type="file"  id="file"  name="file">

<input type="submit" name="submit" value="Upload">
</form>
</body>
</html>
[root@ambari03 ~]# cat /usr/local/nginx/html/info.php
<?php
    header("Content-Type:text/html; charset=utf-8");
    print_r($_POST);
?>

访问说,在网页输入:http://nginx_ip:8080/up.html,提交文件后,输出文件的名称即表示成功。

上一篇:php实现大文件上传


下一篇:Upload 上传文件只能上传一次,第二次无响应