传统站点在处理文件上传请求时,普遍使用后端编程语言处理,如: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,提交文件后,输出文件的名称即表示成功。