Tôi đã thực hiện điều này một số lần bằng cách sử dụng nginx, lighttpd và apache. Khái niệm về cơ bản là giống nhau trong tất cả chúng: [Nhanh] CGI xử lý chạy như người dùng.
Nếu bạn muốn tự cứu mình thật nhiều rắc rối, hãy thử làm rối với các quyền như những người khác đã đề xuất. Đặc biệt, nếu các trang web người dùng của bạn được sở hữu bởi người dùng và trang web chính của bạn được sở hữu bởi root hoặc tương tự, bạn sẽ có hình dạng khá. Nhưng người dùng vẫn sẽ không được tách riêng và có thể đọc các tệp của nhau, v.v (mật khẩu cơ sở dữ liệu?). Chạy các máy chủ ảo riêng biệt cho mỗi người dùng / trang web sẽ cung cấp cho bạn sự bảo mật cao nhất và chắc chắn sẽ đơn giản hơn so với việc cố gắng tách biệt người dùng bằng apache.
Cách thức được chấp nhận tiêu chuẩn để phân tách người dùng PHP trong apache là thông qua SuExec (cũng có mpm-itk). Nếu bạn Google apache fastcgi suexec
hoặc tương tự, bạn sẽ nhận được nhiều kết quả. Tôi nghĩ rằng sẽ không thực tế nếu bao gồm các hướng dẫn đầy đủ ở đây. Nó có thể thay đổi dựa trên các quyết định thiết kế khác nhau và phân phối sử dụng. Thay vào đó, tôi sẽ cố gắng cung cấp một số điểm tôi cho là quan trọng và mô tả ngắn gọn về cấu hình của mình. Thiết lập của tôi trở nên khá phức tạp (và trên hết, tôi chạy một mô-đun SELinux tùy chỉnh). Dưới đây là một tổng quan ngắn gọn [hy vọng]:
- Tên máy chủ ảo dựa trên bằng cách trỏ * .somedomain đến máy chủ: user.somedomain là tên của máy chủ ảo (Tôi giả sử bạn có thể làm điều tương tự với thư mục người dùng?).
- Một
/etc/httpd/vhosts.d/user.conf
cho mỗi người dùng.
- Một thư
/var/www/vhosts_config
mục cho mỗi người dùng.
/var/www/vhosts_config/$USER/wrapper-bin
chứa trình bao bọc để thực thi PHP (sẽ nói thêm về điều này sau)
/var/www/vhosts_config/$USER/php/php.ini
: Tôi muốn có một php.ini
người dùng riêng biệt .
/var/www/vhosts_config/$USER/php/ext/*.ini
: Một tệp ini cho mỗi phần mở rộng có sẵn
/var/www/vhosts_config/$USER/php/ext-active/*.ini
: các liên kết tượng trưng quay lại ../ext
cho mỗi tiện ích mở rộng được bật (vì vậy tôi cũng có thể bật / tắt tiện ích mở rộng cho mỗi người dùng)
/var/www/vhosts/user
chứa nội dung thực tế cho vhost. Tôi khuyên bạn nên luôn luôn sử dụng public_html
thư mục con làm gốc tài liệu để người dùng có một thư mục nằm ngoài thư mục gốc để lưu trữ các tệp cấu hình, v.v.
- Người dùng không thể đọc các tệp của nhau. Bạn cần cho phép máy chủ web
+x
trên người dùng. Có nhiều cách bạn có thể làm điều này. Tôi sử dụng POSIX ACL.
Cấu hình httpd cho mỗi người dùng trông giống như thế này (được thay đổi cho ngắn gọn):
<VirtualHost *:80>
ServerName someuser.somedomain
DocumentRoot /var/www/vhosts/someuser/public_html
SuexecUserGroup someuser someuser
FcgidWrapper /var/www/vhosts_config/someuser/wrapper-bin/php .php
#max of 5 cgis per vhost
FcgidMaxProcessesPerClass 5
FcgidMinProcessesPerClass 0
AddHandler php-fcgi .php
Action php-fcgi /wrapper-bin/php
Alias /wrapper-bin/ /var/www/vhosts_config/someuser/wrapper-bin/
<Location /wrapper-bin/>
Options +ExecCGI
SetHandler fcgid-script
</Location>
</VirtualHost>
suexec
là một setuid
chương trình gốc mà apache gọi để bắt đầu các tiến trình như một người dùng nhất định. Nó là khá cầu kỳ. Nó yêu cầu chương trình mà nó thực thi thuộc sở hữu của người dùng và được chứa trong thư mục con của /var/www
(điều này thay đổi trên các bản phân phối Linux khác nhau và được đặt ở thư mục thời gian biên dịch) do người dùng sở hữu. Đây là lý do tại sao mỗi người dùng cần tập lệnh bao bọc PHP của riêng mình.
/var/www/vhosts_config/someuser/wrapper-bin/php
trông giống như:
export PHPRC=/var/www/vhosts_config/someuser/php
export PHP_INI_SCAN_DIR=$PHPRC/ext-active/
export PHP_FCGI_CHILDREN=0
umask 0077
exec /usr/bin/php-cgi
PHP_INI_SCAN_DIR
thiết lập một thư mục để tìm kiếm php.ini
các tệp bổ sung mà tôi sử dụng để tải cấu hình dành riêng cho tiện ích mở rộng.
PHPRC
liệt kê các thư mục để tìm php.ini
tập tin
Bạn không phải sử dụng một cấu hình PHP riêng cho mỗi người dùng và làm như vậy chắc chắn sẽ làm phức tạp mọi thứ. Tôi muốn cung cấp cho người dùng cấu hình rút gọn và chỉ bật những gì cần thiết (và một vài tiện ích mở rộng phổ biến theo mặc định). Tôi cũng tải suhoding với các cấu hình khác nhau cho mỗi người dùng (các khóa mã hóa khác nhau).