PHP¶
For operating PHP based applications we chose to use FPM.
We assume the service user is called s-phpsite
, and that the docroot is /srv/s-phpsite/docroot
. But of course you can use different service user names, and different docroots.
Installation¶
Note that on the NixOS platform it is not necessary to activate a role to install PHP. You can install PHP into the service user:
ssh your-vm
sudo -iu s-phpsite
nix-env -iA nixos.php70
There are different PHP versions to choose from:
nixos.php55
nixos.php56
nixos.php70
Note
You can install different PHP versions at the same time on the same machine in different service users.
Configuration¶
Add configuration for FPM (/srv/s-phpsite/phpfpm.conf
):
[global]
error_log = syslog
daemonize = yes
log_level = notice
[app_pool]
listen = 127.0.0.1:9002
pm = dynamic
pm.max_children = 10
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 4
pm.max_requests = 500
Of course the specific values depend on the expected load and the VM dimensions.
You can add a php.ini
which suits your needs to /srv/s-phpsite/php.ini
.
Register the FPM with systemd, to get a running process. Since there are some variables, like PATH to fill out, feel free to copy-paste the following shell-snippet (as service user, s-phpsite
in our case):
(
cat <<EOF
[Unit]
Description=FPM phpsite1
[Service]
Environment="PATH=$PATH"
User=$USER
Group=service
ExecStart=$HOME/.nix-profile/bin/php-fpm -n -y $HOME/phpfpm.conf -g $HOME/phpfpm.ini
Type=forking
EOF
) > /etc/local/systemd/phpsite.service
sudo fc-manage --build
Here is a snippet for configuring the phpfpm support into your nginx virtual host (see also the nginx role documentation):
root /srv/s-phpsite/docroot;
location / {
index index.php;
if (!-f $request_filename) {
rewrite ^(.*)$ /index.php last;
break;
}
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include /etc/local/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
Local PEAR configuration¶
PEAR is shipped with PHP, and you will need a local configuration to use it:
pear config-create $HOME $HOME/.pearrc
For PEAR to work, PHP needs to include PEAR in php.ini
(see above):
include_path = "/srv/s-phpsite/pear/php"