Nginx配置PHP处理nginx-upload-module的文件上传

前提:已经安装好了nginx+nginx-upload-module,详情可以查看靖哥哥的上一篇博文,点击传送门

第一步:安装PHP

先安装libxml2:sudo apt-get install libxml2 libxml2-dev

PHP下载主页:PHP: Downloads

解压:tar -zxvf php-7.3.3.tar.gz

进入PHP解压后的目录:cd php-7.3.3

配置:

./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysqli --with-pdo-mysql --with-iconv-dir --with-freetype-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-mbstring --with-mcrypt --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --without-pear --with-gettext --disable-fileinfo --enable-maintainer-zts

提一下MySQL数据库的两个配置项:

--with-mysqli 是MySQL增强扩展。

--with-pdo-mysql PHP数据对象PHP Data Objects(PDO),是对数据库的一个抽象。

有了这俩兄弟,后续就可以通过php操作mysql。关于mysql的安装配置,请点击传送门

注意:编译比较耗内存,低配机一定要加上 --disable-fileinfo 参数(靖哥哥买不起高配CVM呀),否则会报错virtual memory exhausted: Cannot allocate memory,最后,系统提示缺什么库就安装对应库咯。

编译安装:make

make完成后,会提示:Don't forget to run 'make test'.

按照提示:make test吧,靖哥哥的机器上会有14137个测试项,等待全部完成,就可以make install了。

Nginx与PHP前后端协作最重要的桥梁是FastCGI接口,PHP5.4以后的版本已经集成了php-fpm(FastCGI Process Manager)。

usr/local/php/ect目录,复制php-fpm的默认配置:

cp php-fpm.conf.default php-fpm.conf

再切换到下一级的/usr/local/php/etc/php-fpm.d目录

cp www.conf.default www.conf

检查其中的user和group :sudo vi etc/php-fpm.d/www.conf 

确保:user = www          group = www

如果www用户不存在,那么先添加www用户:

groupadd www
useradd -g www www

最后启动php-fpm服务 :

sudo ./sbin/php-fpm

查看php进程:

php-fpm服务默认监听9000端口,使用

netstat -tln | grep 9000

查看端口使用情况

对于没有php.ini的问题(我这里没有用到),编译配置中,php.ini的路径设定:/usr/local/php/etc

但是,默认不会生成php.ini,需要手动从php源代码中copy一份,源码中有php.ini-development和php.ini-production两个文件,随便copy一份。

cp php.ini-development /usr/local/php/etc/php.ini

第二步:配置nginx,新增对php的支持

# nginx的配置文件中新增对php的支持
location ~* \.php$ {
fastcgi_index   index.php;
fastcgi_pass    127.0.0.1:9000;        # php默认监听9000端口
include         fastcgi_params;
fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
}

此时可以通过niginx,访问.php的内容。

第三步:Nginx和php配置文件上传(nginx使用nginx-upload-module模块)

nginx-upload-module模块上传的文件内容会以散列序的方式,默认存放在指定的目录下,如图:

此时需要后端处理脚本,将上传的内容还原为原文件,后端处理方法有很多,如Django、Tornado、php。

这里讲一下php的配置。其实很简单,以example.php为例,只需要在文件上传模块的后端处理的location中配置重定向:

rewrite ^(.*)$ /example.php;

文件上传完成后,就会将参数传递到example.php中,此时就可以在php脚本中执行文件操作了。

我这里是将文件移动到upload目录下并重命名为原文件名。

$new_name = $tmp_name."/../../../upload/".$name;
rename($tmp_name,$new_name); 

Nginx配置PHP处理nginx-upload-module的文件上传_第1张图片

一定要确保tmp_upload根目录和子目录有权限,upload目录也要有权限。

如果文件名为中文,需要在nginx配置中加入如下配置来支持中文:

charset utf-8,gbk;

最后,在nginx的文件跳转location中,配置如下项即可在页面查询上传的结果。

autoindex on;	# 开启文件索引
autoindex_localtime on;  # 显示的文件时间

最终页面显示结果如下:

Nginx配置PHP处理nginx-upload-module的文件上传_第2张图片

注意咯:这只是一个演示demo,实际业务中目录遍历有安全风险,文件上传也有安全风险,一定不要把自己的业务就这样赤裸裸的暴露在公网。

关于域名配置

如果嫌每次输入ip比较麻烦,可以为nginx配置域名。一般到域名服务商那里申请域名时,就可以绑定vpc的公网IP,以后也可以修改。申请成功后,检查nslookup 你的域名,能够正确解析得到你的vpc地址后,就可以在nginx的server_name中配置使用了,而且可以配置多个域名。

你可能感兴趣的:(nginx)