我已经关注了很多nginx指南,但没有人满足我。
我的目标是创建两个具有不同文件权限的网站,因此我确信它们是隔离的。
实施例。拥有者 / var / www / site1 : site1 和群组: site1 和 / var / www / site2 所有者: site2 和群组: site2 ,两个目录都拥有770权限。
我的nginx.conf:
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/sites-enabled/*;
}
我的/ etc / nginx / sites-available / site1:
server {
listen 80;
root /var/www/site1;
index index.php index.html index.htm;
server_name www.site1.org site1.org;
access_log /var/log/nginx/access2.log;
error_log /var/log/nginx/error2.log;
location / {
try_files $uri $uri/ /index.php?$args;
#try_files $uri $uri/ =404;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/site1;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm-site1.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
......对于site2也一样。
最后是我的/etc/php5/fpm/pool.d/site1.conf:
[site1]
user = site1
group = site1
listen = /var/run/php5-fpm-site1.sock
listen.owner = www-data
listen.group = www-data
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
......对于site2也一样。
只要 www-data 用户对/ var / www / site1和/ var / www / site2具有文件权限,一切都按预期工作。当我将site1:site1设置为owner:group with 770然后我得到" 13:Permission denied"在日志中。
这个想法是只有php-fpm必须拥有网站文件,因为nginx只是通过套接字与php-fpm进行通信,而php-fpm是操作文件的进程。甚至Nginx为什么要拥有它们呢?
答案 0 :(得分:0)
Nginx可以与您想要的任何(受信任)用户一起运行,包括这些文件的所有者......但是只要nginx用户对这两个网站都拥有权限,您就无法完全隔离2个网站。
如果必须为两者运行nginx,则必须具有虚拟化(vps)才能完全隔离它们(尽管单词完全是相对的)。
如果你可以为另一个站点安装另一台服务器,除了为每个用户运行php作为该用户之外,你可以将2个不同的web服务器放在不同的端口,例如litespeed或lighttpd。
因此,对于用户1,您将拥有nginx + fpm(并且使用用户1运行),对于用户2,您将拥有lighttpd + fpm(使用usr 2运行)。 文件应位于每个其他用户主目录中,并具有阻止来自其他用户的任何访问的适当权限。
然后你可以将nginx + lighttpd放在haproxy后面,并根据主机名将请求路由到nginx或lighttpd,这反过来会为每个用户提供fpm,只提供来自该用户的文件。
https://seanmcgary.com/posts/haproxy---route-by-domain-name
但无论如何,我认为最好的路线是虚拟化。