查看: 91|回复: 0

Nginx 实现文件的上传与下载

[复制链接]

3

主题

11

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2023-6-30 07:23:22 | 显示全部楼层 |阅读模式
前言

Nginx是一款高性能、可靠的Web服务器软件,同时用作文件上传和下载
配置

系统版本

[root@127 ~]# cat /etc/redhat-release
CentOS Linux release 8.5.2111
创建用户

[root@127 ~]# useradd -s /sbin/nologin -M nginx  #创建一个nginx用户,且不生成用户目录,和不能登录

创建目录

[root@127 ~]# mkdir -p /export/share/upload/
[root@127 ~]# mkdir -p /export/tmp/upload/
[root@127 ~]# cd /export/tmp/upload/
[root@127 upload]# mkdir 0  1  2  3  4  5  6  7  8  9  state
[root@127 upload]# chown -R nginx:nginx /export/  #文件夹权限管理

[root@127 export]# tree
.
├── share
│   └── upload
└── tmp
    └── upload
        ├── 0
        ├── 1
        ├── 2
        ├── 3
        ├── 4
        ├── 5
        ├── 6
        ├── 7
        ├── 8
        ├── 9
        └── state

15 directories, 0 files
安装nginx

[root@127 ~]# yum remove nginx #卸载旧版本

[root@127 ~]# yum -y install gcc gcc-c++ autoconf automake gd gd-devel zlib zlib-devel openssl openssl-devel pcre-devel

[root@127 ~]# mkdir /root/thb

[root@127 ~]# cd /root/thb

[root@127 thb]# wget http://nginx.org/download/nginx-1.17.7.tar.gz

[root@127 thb]# git clone https://github.com/hongzhidao/nginx-upload-module.git

[root@127 thb]# git clone https://github.com/masterzen/nginx-upload-progress-module.git

[root@127 thb]# tar -zxvf nginx-1.17.7.tar.gz

[root@127 thb]# cd nginx-1.17.7/

[root@127 nginx-1.17.7]# ./configure  --with-debug --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --add-module=/root/thb/nginx-upload-module --add-module=/root/thb/nginx-upload-progress-module --with-stream --with-http_image_filter_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-file-aio --with-cc-opt='-Wno-format-security -Wno-unused-but-set-variable -Wno-unused-result -D NGX_HAVE_OPENSSL_MD5_H=1 -D NGX_OPENSSL_MD5=1 -D NGX_HAVE_OPENSSL_SHA1_H=1 -O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2  -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

[root@127 nginx-1.17.7]# make && make install

[root@127 nginx-1.17.7]# cd /etc/nginx/

[root@127 nginx]# vi nginx.conf
worker_processes  4;  
#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;  
    #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;  
    upload_progress proxied 8m;  
    #gzip  on;  
    server {
        listen       80;
        auth_basic "Please input password"; #这里是验证时的提示信息
        auth_basic_user_file /etc/nginx/passwd/testpwd;
        # upload
        client_max_body_size 100g; # 这个配置表示最大上传大小,但是我没有验证过是否能传 100g 的文件
        # Upload form should be submitted to this location
        location /upload {
                # Pass altered request body to this location
                upload_pass /upload.php;
                # 开启resumable
                upload_resumable on;
                # Store files to this directory
                # The directory is hashed, subdirectories 0 1 2 3 4 5 6 7 8 9 should exist
                # 记得修改目录的读写权限
                upload_store /export/tmp/upload 1;
                upload_state_store /export/tmp/upload/state;
                # Allow uploaded files to be read by all
                upload_store_access all:r;
                # Set specified fields in request body
                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;
                # Inform backend about hash and size of a file
                upload_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5;
                upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;
                upload_pass_form_field "^submit$|^description$";
        }
        location ~ \.php$ {
           # fastcgi_pass   unix:/run/php-fpm/php-fpm.sock;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           # fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
           fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
           include        fastcgi_params;
        }
        location /myfiles {
            alias /export/share/upload/;        # 文件存放目录,注意要以 '/' 结尾;
            index index.html;               # 如果文件存放目录有 index.html,会跳转到 index.html;
            autoindex on;               # 自动列出目录下的文件;
            autoindex_exact_size off;   # 文件大小按 G、M 的格式显示,而不是 Bytes;
        }
    }
}


编辑上传文件

[root@127 nginx]# cd /etc/nginx/html/
[root@127 html]# ls
50x.html  index.html
[root@127 html]# vi upload.php
[root@127 html]# cat upload.php
<?php
$header_prefix = 'file';
$slots = 6;
?>
<html>
<head>
<title>Test upload</title>
</head>
<body>
<?php
if ($_POST){
    echo "<h3>Uploaded files:</h3>";
    echo "<table border=\"2\" cellpadding=\"2\">";
    echo "<tr><td>Name</td><td>Location</td><td>Content type</td><td>MD5</td><td>Size</td><td>Scp Command</td><td>Wget Command</tr>";
    for ($i=1;$i<=$slots;$i++){
        $key = $header_prefix.$i;
        if (array_key_exists($key."_name", $_POST) && array_key_exists($key."_path",$_POST)) {
            $tmp_name = $_POST[$key."_path"];
            $name = $_POST[$key."_name"];
            $content_type = $_POST[$key."_content_type"];
            $md5 = $_POST[$key."_md5"];
            $size = $_POST[$key."_size"];
            $final_path = "/export/share/upload";
            if (copy($tmp_name, "$final_path/$name")) {
                    echo "SUCCESS!";
            } else {
                    echo "FAIL!";
            }
            $scp_cmd = "scp team@***:/export/share/upload/$name .";
            $wget_cmd = "wget http://***/files/upload/$name";
            echo "<tr><td>$name</td><td>$final_path</td><td>$content_type</td><td>$md5</td><td>$size</td><td>$scp_cmd</td><td>$wget_cmd</td>";
        }
    }
    echo "</table>";
}else{?>
<h3>Select files to upload</h3>
<form name="upload" method="POST" enctype="multipart/form-data" action="/upload">
<input type="file" name="file1"><br>
<input type="file" name="file2"><br>
<input type="file" name="file3"><br>
<input type="file" name="file4"><br>
<input type="file" name="file5"><br>
<input type="file" name="file6"><br>
<input type="submit" name="submit" value="Upload">
<input type="hidden" name="test" value="value">
</form>
<?php
}
?>
</body>
</html>

增加nginx网页登录验证

[root@127 ~]# yum  -y install httpd-tools
[root@127 ~]# mkdir -p /etc/nginx/passwd/
[root@127 ~]# htpasswd -c /etc/nginx/passwd/testpwd user1
New password:
Re-type new password:
Adding password for user user1

增加nginx启动文件

[root@127 ~]# vi /lib/systemd/system/nginx.service
[root@127 ~]# cat /lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target

PHP安装
[root@127 thb]# yum -y install gcc automake autoconf libtool make
[root@127 thb]# yum -y install gcc gcc-c++ glibc
[root@127 thb]# yum -y install libmcrypt libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel
[root@127 thb]# cd ~
[root@127 ~]# wget https://museum.php.net/php5/php-5.4.7.tar.gz
[root@127 ~]# tar -zxvf php-5.4.7.tar.gz
[root@127 ~]# cd php-5.4.7/
[root@127 php-5.4.7]# ./configure --prefix=/usr/local/php  --enable-fpm --with-mcrypt --enable-mbstring --disable-pdo --with-curl --disable-debug  --disable-rpath --enable-inline-optimization --with-bz2  --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-Mysqli --with-gd --with-jpeg-dir
[root@127 php-5.4.7]# make all install
[root@127 ~]# php -m  #如果没有php-fpm,需要进行安装
[PHP Modules]
Core
ctype
date
dom
ereg
fileinfo
filter
hash
iconv
json
libxml
pcre
PDO
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter

[Zend Modules]

[root@127 ~]# yum install php-fpm
[root@127 ~]# cd /usr/local/php
[root@127 php]# ls
man
[root@127 ~]# find / -name php-fpm.conf.default
/usr/share/doc/php-fpm/php-fpm.conf.default
[root@127 ~]# cd /usr/share/doc/php-fpm/
[root@127 php-fpm]# ls
php-fpm.conf.default  www.conf.default
[root@127 php-fpm]# cp php-fpm.conf.default  php-fpm.conf
[root@127 php-fpm]# vi php-fpm.conf
[root@127 php-fpm]# cat php-fpm.conf
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamically changed by using the
; '-p' argument from the command line.

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
;pid = run/php-fpm.pid
user = nginx
group = nginx
...


启动php-fpm服务

[root@127 php-fpm]# systemctl restart php-fpm.service #重启php-fpm进程
启动nginx服务

[root@127 ~]# systemctl enable nginx

[root@127 ~]# systemctl start nginx
测试



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表