Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  Мелочи
  Файловая система
  WWW
  hosting
  mod_gzip
  mod_log_sql
  mod_geoip
  mod_bandwidth
  mod_accounting
  mod_bunzip2
  mod_mp3
  mod_shapvh
  mod_limitipconn
  mod_sqlinclude
  mod_auth_imap
  webalizer
  Apache + SSL
  auth_ldap
  Настройка AWStats
  apache 2.0
  mod_auth_external
  CMS - TYPO3
  phpBB-2/3
  mod_ntlm
  mod_ntlm2
  Nginx+php+fcgi
  OTRS на Apache1
  OTRS на Apache20
  ApacheStats
  mod_evasive
  Lighttpd
  nginx+php-fpm+mysql
  php + mssql
  MySQL + кодировки
  svn+apache+trac
  php5-oci8
  Lighttpd + Apache
  CMS Drupal 6.9
  Apache22+MySQL
  Оптимизация хоста для CMS
  блокировка spam на www
  PostgreSQL 8
  Apache 22 + PHP5 + suPHP
  lighttpd + mod_uploadprogress
  VirtualBox + phpVirtualBox
  DNS API
  Security
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


www.lissyara.su —> статьи —> FreeBSD —> WWW —> Apache 22 + PHP5 + suPHP

Apache 22 + PHP5 + suPHP

Автор: Le1.


На работе крутился бесплатный хостинг, были времена когда исполнения РНР скрипта для всего хостинга от одного юзера не было проблемой, но как говорится времена меняются, так что для избежания Shell-ов и всяких Кул Хацкеров, котрые на свой FTP заливают примитивные PHP Shell-ы надо было переходить на более защищенный вариант.

Для этого решил использовать модуль для apache под названием suPHP.
suPHP это модуль который крутит РНР для конкретного виртуалхоста конкретным юзером.

Начнем с установки апача:

# cd /usr/ports/www/apache22
# make config

Вот конкретные настройки в моем случае:

x ================================================================== x
x                   Options for apache 2.2.14_5                      x
x ================================================================== x
x [ ] APR_FROM_PORTS        Use devel/apr as APR (preferred)         x
x [ ] THREADS               Enable threads support in APR            x
x [X] MYSQL                 Enable MySQL support for apr-dbd         x
x [ ] PGSQL                 Enable PostgreSQL support for apr-dbd    x
x [ ] SQLITE                Enable SQLite support for apr-dbd        x
x [ ] IPV6                  Enable IPv6 support                      x
x [ ] BDB                   Enable BerkeleyDB dbm                    x
x [X] AUTH_BASIC            Enable mod_auth_basic                    x
x [X] AUTH_DIGEST           Enable mod_auth_digest                   x
x [X] AUTHN_FILE            Enable mod_authn_file                    x
x [ ] AUTHN_DBD             Enable mod_authn_dbd                     x
x [X] AUTHN_DBM             Enable mod_authn_dbm                     x
x [X] AUTHN_ANON            Enable mod_authn_anon                    x
x [X] AUTHN_DEFAULT         Enable mod_authn_default                 x
x [X] AUTHN_ALIAS           Enable mod_authn_alias                   x
x ================================================================== x
x                       [  OK  ]       Cancel                        x
x ================================================================== x

Устанавливаем apache:

# make install clean

Далее установим РНР:

# cd /usr/ports/lang/php5
# make config


x ================================================================== x
x                     Options for php5 5.2.12                        x
x ================================================================== x
x [X] CLI        Build CLI version                                   x
x [X] CGI        Build CGI version                                   x
x [X] APACHE     Build Apache module                                 x
x [ ] DEBUG      Enable debug                                        x
x [X] SUHOSIN    Enable Suhosin protection system (not for jails)    x
x [ ] MULTIBYTE  Enable zend multibyte support                       x
x [ ] IPV6       Enable ipv6 support                                 x
x [X] MAILHEAD   Enable mail header patch                            x
x [X] REDIRECT   Enable force-cgi-redirect support (CGI only)        x
x [X] DISCARD    Enable discard-path support (CGI only)              x
x [ ] FASTCGI    Enable fastcgi support (CGI only)                   x
x [X] PATHINFO   Enable path-info-check support (CGI only)           x
x                                                                    x
x                                                                    x
x                                                                    x
x ================================================================== x
x                       [  OK  ]       Cancel                        x
x ================================================================== x

Устанавливаем PHP5:

# make install clean

Дальше маленькое отклонение, перед тем как компилить suPHP с портов, в новой версии сделана проверка овнершипов верхней дирректории, что в моем случае не очень то хорошо работало, точнее не работало, ковыряясь в инете нашел много таких же жалоб, в принципе эта проверка ни к чему, поэтому я покопался в сорсах и немного изменил.
И так для начала идем в /usr/ports/www/suphp и делаем make:


# cd /usr/ports/www/suphp
# make

После того как сам архив сорса tar.gz скачан можно прервать процедуру ctrl+c и далее идем править сам сорс:

# cd /usr/ports/distfiles/
# tar xzvf suphp-0.7.1.tar.gz
# cd suphp-0.7.1/src/
# ee Application.cpp

Правим файл Application.cpp, находим в нем блок:

if (directoryOwner != owner && !directoryOwner.isSuperUser()) {
            std::string error = "Directory " + directory.getPath()
                + " is not owned by " + owner.getUsername();
            logger.logWarning(error);
            throw SoftException(error, __FILE__, __LINE__);
}

И коментируем:

/*if (directoryOwner != owner && !directoryOwner.isSuperUser()) {
            std::string error = "Directory " + directory.getPath()
                + " is not owned by " + owner.getUsername();
            logger.logWarning(error);
            throw SoftException(error, __FILE__, __LINE__);
}*/

Стираем оригинал и запаковываем все назад:

# rm -rf suphp-0.7.1.tar.gz
# tar czvf suphp-0.7.1.tar.gz suphp-0.7.1

Далее чтобы при компиляции Фряха не выругалась на наш измененный сорс, надо подправить значения в distinfo:

# md5 /usr/ports/distfiles/suphp-0.7.1.tar.gz
MD5 (/usr/ports/distfiles/suphp-0.7.1.tar.gz)
= a1e9766010336a46ca3f8e6cd546f348
# sha256 /usr/ports/distfiles/suphp-0.7.1.tar.gz
SHA256 (/usr/ports/distfiles/suphp-0.7.1.tar.gz)
= eec98cb4ef106fa94f7243d9d10d532970978886b017a14d53cff195d152d87f
# ls -l /usr/ports/distfiles/suphp-0.7.1.tar.gz
-rw-r--r--  1 root  wheel  385975 Jan 13 00:58 
/usr/ports/distfiles/suphp-0.7.1.tar.gz

И вписать новые значения:

# cat distinfo
MD5 (suphp-0.7.1.tar.gz) 
= a1e9766010336a46ca3f8e6cd546f348
SHA256 (suphp-0.7.1.tar.gz) 
= eec98cb4ef106fa94f7243d9d10d532970978886b017a14d53cff195d152d87f
SIZE (suphp-0.7.1.tar.gz) = 385975

Или чтоб не мучатся как написано выше, просто набрать:

# make makesum

Далее маленькое пояснение, suPHP может работать в нескольких режимах, owner, force и paranoid.
Для подробной информации можно почитать документацию, а вкратце поясню.
В режиме owner, процесс PHP исполняется от владельца каталога, куда смотрит виртуалхост.
В режиме paranoid - все также, за исключением того, что  можно добавить директиву suPHP_UserGroup, и указать конкретного юзера для конкретного виртуалхоста.

Например:

<VirtualHost xxxxxxx>
	...
      suPHP_UserGroup username groupname
</VirtualHost>

Для того чтобы откомпилить с поддержкой режима paranoid, меняем строку WITH_SETID_MODE?=owner на WITH_SETID_MODE?=paranoid в /usr/ports/www/suphp/Makefile

# WITH_SETID_MODE should be a value of "owner", "force", or "paranoid".
# It's important that you understand the differences between each mode.
# See /usr/local/share/doc/suphp/INSTALL for details.
#
WITH_SETID_MODE?=       [color=red][B]paranoid[/B][/color]
CONFIGURE_ARGS+=        --with-setid-mode=${WITH_SETID_MODE}

Сохраняем изменения сделанные в Makefile и компилим сам suPHP:

# make install clean

Далее правим конфиг apache:

cat /usr/local/etc/apache22/httpd.conf

...
#LoadModule php5_module libexec/apache22/libphp5.so
LoadModule suphp_module libexec/apache22/mod_suphp.so
...
suPHP_Engine on
AddType application/x-httpd-php .php
suPHP_AddHandler application/x-httpd-php
DirectoryIndex index.php index.html index.htm
...

Теперь правим suphp.conf, вот пример моего конфига:

# cat /usr/local/etc/suphp.conf
[global]
;Path to logfile
logfile=/var/log/suphp.log

;Loglevel
loglevel=info

;User Apache is running as
webserver_user=www

;Path all scripts have to be in
docroot=/usr/local/www/*:${HOME}

;Path to chroot() to before executing script
;chroot=/mychroot

; Security options
allow_file_group_writeable=false
allow_file_others_writeable=false
allow_directory_group_writeable=false
allow_directory_others_writeable=false

;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=false

;Send minor error messages to browser
errors_to_browser=true

;PATH environment variable
env_path=/bin:/usr/bin

;Umask to set, specify in octal notation
umask=0077

; Minimum UID
min_uid=80

; Minimum GID
min_gid=80


[handlers]
;Handler for php-scripts
application/x-httpd-php="php:/usr/local/bin/php-cgi"

;Handler for CGI-scripts
x-suphp-cgi="execute:!self"

Вроде все запускаем apache и радуемся :)

# /usr/local/etc/rc.d/apache22 start

P.S. Для проверки можно написать РНР скрипт:

<?
	$ourFileName = "TestFile";
	$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
	fclose($ourFileHandle);
?>

И посмотреть овнера у файла TestFile

В принципе все, надеюсь хоть комуто эта статья поможет...



размещено: 2010-01-13,
последнее обновление: 2010-01-14,
автор: Le1

оценить статью:

abigor, 2010-01-14 в 7:01:25

можно:

cd /usr/ports/www/suphp
make fetch
make extract
cd /usr/ports/www/suphp/work/suphp-0.7.1/
#-—  правим чего надо
cd ../..
make install clean

#---
а на самом деле лучше сделать патч и положить его в порты чтоб потом не думать почему при обновлении чего отвалилось

antarx, 2010-01-17 в 15:38:26

Насколько я понял, php тут запускается через обычный CGI из SUPHP. А оно получается быстрее, чем обычный fast-cgi + php-fpm, или даёт какую-нибудь дополнительную защиту (помимо чуть большего удобства настройки)?

salimk, 2010-02-18 в 15:34:50

Блин статья проста супер хорошо и понятно написано,
нечего лишнего, автору спс

RockerMan, 2010-03-13 в 16:54:16

Автору респект за статью, помогла запустить апач вместе с suphp

Roman, 2010-08-31 в 22:35:27

А у меня них..ена не работает!!! Ошибка сервера 500 и хоть ты разбейся об стену!!! ((((((((((((((

byteplayer, 2010-11-22 в 15:10:07

apache22-mpm-itk есть для этого
не занимайтесь ерундой

Alex, 2012-05-10 в 17:36:52

В настройках suPHP есть директива:
docroot=/usr/local/www/*:${HOME}
В данном случае переменная HOME берётся из VirtualHost или из User Home dir? Как быть если в системе нет реальных пользователей, которым принадлежат файлы? Все пользователи находятся в базе данных.

Извиняюсь за вопросы в форме комментариев, но на форуме не нашёл соответствующей темы.

salimk, 2012-06-21 в 11:16:09

вместо того чтобы править Makefile
можно сделать так
/etc/make.conf:
PORTSDIR?=      /usr/ports
.if ${.CURDIR} == ${PORTSDIR}/www/suphp
WITH_SETID_MODE=paranoid
.endif


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 21 чел.
За последние 30 мин было: 88 человек
За сегодня было
9049 показов,
1057 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1965 секунд
Из них PHP: 63%; SQL: 37%; Число SQL-запросов: 77 шт.
Исходный размер: 100801; Сжатая: 18011