nginx虚拟主机防webshell完美版

2022-10-15,

nginx虚拟主机防webshell完美版,使用nginx的朋友可以参考下。

我们先来看下nginx.conf


  server
  {
    listen       80;
    server_name  www.a.com;
    index index.html index.htm index.php;
    root  /data/htdocs/www.a.com/;


    #limit_conn   crawler  20;   

    location ~ .*\.(php|php5)?$
    {     
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }


}


  server
  {
    listen       80;
    server_name  www.b.com;
    index index.html index.htm index.php;
    root  /data/htdocs/www.b.com/;


    #limit_conn   crawler  20;   

    location ~ .*\.(php|php5)?$
    {     
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }


}


nginx在80端口接受到访问请求后,会把请求转发给9000端口的php-cgi进行处理


而如果修改php.ini中open_basedir= ../../../../../ ,针对两个不同的网站,www.a.com , www.b.com都会把请求发送给9000处理,而如果先访问www.a.com那么../../../../../就会变成A网站的根目录地址,然后这时候如果你访问www.b.com,那么open_basedir仍然是A网站的根目录,但是对于B来说,又是不允许访问的,所以就造成了,第二个站点打开以后会出现no input files,那么有什么解决办法呢?


我们可以把不同的虚拟主机发送到不同的php-cgi端口进行处理,当然响应的php-fpm配置文件中的open_basedir也不同。。我们来看看怎么配置。。


首先,nginx.conf配置如下


 server
  {
    listen       80;
    server_name  www.a.com;
    index index.html index.htm index.php;
    root  /data/htdocs/www.a.com/;


    #limit_conn   crawler  20;   

    location ~ .*\.(php|php5)?$
    {     
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }


}


  server
  {
    listen       80;
    server_name  www.b.com;
    index index.html index.htm index.php;
    root  /data/htdocs/www.b.com/;


    #limit_conn   crawler  20;   

    location ~ .*\.(php|php5)?$
    {     
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9001;
      fastcgi_index index.php;
      include fcgi.conf;
    }


}


注意:www.a.com 的请求发送到9000端口 , www.b.com的请求发送到9001端口,依次类推


nginx配置修改了,相对的,php-fpm.conf也要修改


每个站点建一个conf


 


A站点


#cp /usr/local/webserver/php/etc/php-fpm.conf /usr/local/webserver/php/etc/www.a.com.conf


#vi /usr/local/webserver/php/etc/www.a.com.conf


找到php_defines,添加


<value name="open_basedir">/data/htdocs/www.a.com:/tmp:/var/tmp</value>


 


 


 


B站点


#cp /usr/local/webserver/php/etc/php-fpm.conf /usr/local/webserver/php/etc/www.b.com.conf


#vi /usr/local/webserver/php/etc/www.b.com.conf


找到php_defines,添加


<value name="open_basedir">/data/htdocs/www.b.com:/tmp:/var/tmp</value>


 



找到listen_address,修改为


<value name="listen_address">127.0.0.1:9001</value>   注意这里的端口号


 



最后要修改php-fpm启动脚本


#vi /usr/local/webserver/php/sbin/php-fpm



注释掉原来的 #$php_fpm_BIN --fpm $php_opts,添加


$php_fpm_BIN --fpm --fpm-config /usr/local/webserver/php/etc/www.a.com.conf


$php_fpm_BIN --fpm --fpm-config /usr/local/webserver/php/etc/www.b.com.conf


启动服务


#/usr/local/webserver/php/sbin/php-fpm restart


查看端口


#netstat -tln


 


开了9000 9001分别处理两个站点请求


两个php-cgi主进程加载不同的conf文件,这样就完美解决了虚拟主机webshell能跨目录的问题


当然,启动之前记得conf里面的max_children,开启php-cgi子进程数,相应要减少一些,以免造成内存不足

文章来源:DoDo's Blog
原文地址:http://www.sectop.com/post/35.html

《nginx虚拟主机防webshell完美版.doc》

下载本文的Word格式文档,以方便收藏与打印。