php-fpm多用户运行的两种方式

php-fpm各个站要是以同样的用户运行的话,一个网站要是被攻击了的话,可能会威胁到其他网站。当然解决方法不仅仅是以多用户的方式去运行php-fpm,还可以配置open_basedir,但是测试了一下,貌似只有在php5.3以上才有效。

下面以php5.3.28为例,配置多用户运行php-fpm:

第一种:一个php-fpm主进程

这种方式比较简单,也只需要一个php-fpm自启动文件

首先我们查看一下原php-fpm.conf的这个配置文件,分为两个部分,一个是global块,另外一个是自定义的块,配置文件里面称为pool池,默认叫“www”。在global池的上方,有一行注释了的“include=etc/fpm.d/*.conf”配置项,再通过www池的配置,我们可知可以通过不同的池来配置不同的用户,来达到多个用户运行php-fpm的目的,步骤如下:

1、在etc目录下创建fpm.d目录


mkdir fpm.d

2、复制php-fpm.conf 到fpm.d目录下并重命名,比如 blog.conf


cp php-fpm.conf ./fpm.d/blog.conf

3、进入fpm.d目录,修改blog.conf


cd fpm.d
vim blog.conf

4、删除前面的global块,或者注释掉

5、修改[www]为其他,比如你[blog]

6、配置[blog]池,主要修改两个地方:

6.1:第一处为运行的用户和用户组

即将


user = www
group = www

修改为


user=nobody #具体用哪个用户视自己情况而定,我只做个示例
group=nobody

6.2:修改监听的端口或者socket:

即将:


listen = 127.0.0.1:9000

修改为:


listen = /var/socket/php-fpm/blog.socket #php-fpm需要自己创建,当然也可以直接放在php-fpm目录下

修改成其他端口也是可以的,比如:listen = 127.0.0.1:9001

7、到主配置文件 php-fpm.conf将“include=…”前面的注释去掉,让它去读取fpm.d目录下的配置文件;

8、到此第一种方案就修改完毕了,重新启动测试一下:


service php-fpm reload

第二种:两个php-fpm主进程

这种方法需要独立的配置文件和独立的自启动文件:

1、复制一份php-fpm.conf主配置文件


cp php-fpm.conf php-fpm-blog.conf

2、修改主配置文件


vim php-fpm-blog.conf

2.1:修改[global]下pid和error_log文件的路径

修改 pid=run/php-fpm.pid 为 pid=run/php-fpm-blog.pid 

修改 error_log = /log/php-fpm.log 为 error_log = /log/php-fpm-blog.log

2.2:修改池的名称[www]为[blog],不过这个可以不用修改了,因为这里和原来的进程是独立的

2.3:修改用户和用户组;

2.4:监听端口或socket文件;

以上两部可以按照第一种方案进行修改,这里就不再重复

3、进入/etc/init.d目录,复制一份自启动文件


cp php-fpm php-fpm2

4、修改自启动文件php-fpm2:

4.1:修改配置文件路径


php_fpm-CONF=${prefix}/etc/php-fpm.conf


php_fpm-CONF=${prefix}/etc/php-fpm-blog.conf

这个路径就是刚才的主配置文件

4.2:修改PID文件路径:


php_fpm_PID=${prefix}/var/run/php-fpm.pid

为:


php_fpm_PID=${prefix}/var/run/php-fpm-blog.pid

这个路径要和主配置文件中的pid路径一致

5、修改完毕后添加自动启动


chkconfig --add php-fpm2
chkconfig --level 2345 php-fpm2 on

6、启动服务


service php-fpm2 start

如何去除地址栏的index.php

目前很多php程序都是通过单入口实现的,尤其是一些基于MVC框架的程序。
所以访问的时候地址栏就经常见到/index.php/action/param/…html或者/index.php?s=/action/param/…html这样的形式
它是通过pathinfo或者请求字符串的形式向index.php这个入口文件请求数据,入口文件通过后面的参数来实例化一些控制器。
那么如果去掉index.php呢?假如仅仅在生成地址的时候去掉index.php这样是不一定可行的,因为我们没有配置服务器的rewrite功能。

ThinkPHP批量验证的设计问题

ThinkPHP批量验证存在设计问题,比如对一个字段多次验证,第一个条件验证失败之后不应该再去验证第二个,严格的条件应该放在$_validate的数组的下面,而返回错误信息却是最严格的验证结果。比如下面这个例子,总不能用户原密码都没有填,就告诉用户原密码输入是错的吧,为了完成目的,我只能写成如下这样,但是这样一来就把原密码和数据库进行比对,无论用户是否输入是否为空,这一个缺陷我觉得可以自己修改一下Model类的autoValidation()方法。 继续阅读ThinkPHP批量验证的设计问题

Nginx 实现单入口和 PATHINFO 总结

查找了不少资料,自己研究不少,为了尽可能地减少错误和最大程度地兼容,规则暂时如下,后续发现问题继续修正!


server {

listen 80;
server_name renyiwei.com www.renyiwei.com;
root html;
index index.html index.php index.htm;

location /{
if (!-e $request_filename){
rewrite ^/(.*)\.php/(.*)$ /$1.php/$2 last; #例如:test.php/111这种不应该当作文件不存在,不交给index.php
rewrite ^/(.*)$ /index.php/$1;
}
}

location ~ \.php(/.*)?$ { #这里只匹匹配*.php和*.php/*这种
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}

###########fastcgi_params############

set $path_info "";
set $real_script_name $fastcgi_script_name;
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$"){
set $real_script_name $1;
set $path_info $2;

}
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
#fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;