前提:已经安装好了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);
一定要确保tmp_upload根目录和子目录有权限,upload目录也要有权限。
如果文件名为中文,需要在nginx配置中加入如下配置来支持中文:
charset utf-8,gbk;
最后,在nginx的文件跳转location中,配置如下项即可在页面查询上传的结果。
autoindex on; # 开启文件索引
autoindex_localtime on; # 显示的文件时间
最终页面显示结果如下:
注意咯:这只是一个演示demo,实际业务中目录遍历有安全风险,文件上传也有安全风险,一定不要把自己的业务就这样赤裸裸的暴露在公网。
关于域名配置
如果嫌每次输入ip比较麻烦,可以为nginx配置域名。一般到域名服务商那里申请域名时,就可以绑定vpc的公网IP,以后也可以修改。申请成功后,检查nslookup 你的域名,能够正确解析得到你的vpc地址后,就可以在nginx的server_name中配置使用了,而且可以配置多个域名。