Voor de mensen die graag een eigen website willen hosten via een thuisserver of een VPS is hier een handleiding. Het voordeel hiervan tegenover shared-webhosting is dat je veel meer vrijheid hebt en alles kan installeren wat je maar wilt. Bovendien heb je op een eigen server of VPS meestal flink wat extra snelheid.
Ik host zelf al een tijdje wat websites voor wat mensen en ik doe dat op een machine met daarop:
- Debian Linux Distributie.
- PHP-FPM/FastCGI - een processmanager voor PHP. Deze draait los op het systeem (maar kan ook extern draaien) en alle PHP-scrips worden hierdoor afgehandeld. De rest wordt door de webserver (nginx) afgehandeld.
- MariaDB - Oorspronkelijk een fork van MySQL. MySQL is een tijdje geleden door Oracle overgenomen. Sindsdien gaat het zoals verwacht slechter met MySQL en wordt er ook niet veel informatie over updates en vulnerabilities weggegeven. MariaDB kan gebruikt worden als vervanger van MySQL en is wel gewoon helemaal open.
- nginx - De webserver. Je zult misschien eerder Apache verwachten, maar ik ben hier persoonlijk niet zo'n fan van. Nginx wordt steeds populairder en zal hopelijk en waarschijnlijk Apache op termijn gaan inhalen.
- SFTP/Chroot - Standaard zullen hosters vaak FTP gebruiken om bestanden over te zetten. Dit is echter erg onveilig omdat het wachtwoord dan plain-text over het netwerk gaat. Iedereen zou het dus kunnen uitlezen. Gelukkig heb je bij een eigen server toegang tot SSH en kun je dus via een versleutelde verbinding inloggen. SFTP maakt gebruikt van SSH om bestanden over te zetten. Daarnaast kan deze zo ingericht worden dat de gebruiker alleen toegang heeft tot zijn eigen mappen. Denk hierbij aan de logs/public_html mappen voor de website. Oftewel, een chrooted omgeving.
Allereerst, ik ga er van uit dat je al een Linux installatie hebt. Deze handleiding is voor Debian 7 geschreven.
Stap 1: SSH/SFTP Chroot
- Log in via SSH op je server als root user. Als je een VPS hebt zal SSH standaard aanstaan, anders zul je SSH eerst even moeten installeren via de console. Dit kan met het commando "apt-get install ssh". Onder windows kun je het programma Putty gebruiken om via SSH in te loggen. Onder OSX/Linux is het SSH commando ( ssh root@ip) standaard aanwezig.
- Vervolgens gaan we een groep aanmaken. Alle gebruikers in deze groep zullen in een SSH Chroot gezet worden. Zet de root gebruiker dus nooit in deze groep. Alleen andere gebruikers. Voer het commando addgroup filetransfer uit.
- Vervolgens de SSH config. Voer het commando nano /etc/ssh/sshd_config uit. De configuratie wordt in een editor geopend. Verwijder alles wat hier staat (CTRL+K ingedrukt houden).
Voer vervolgens het volgende in:Code: Selecteer alles
Port 22 Protocol 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key UsePrivilegeSeparation yes KeyRegenerationInterval 3600 ServerKeyBits 768 SyslogFacility AUTH LogLevel INFO LoginGraceTime 120 PermitRootLogin yes StrictModes yes RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys IgnoreRhosts yes RhostsRSAAuthentication no HostbasedAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no PasswordAuthentication no X11Forwarding no X11DisplayOffset 10 PrintMotd no PrintLastLog yes TCPKeepAlive yes UseDNS no AcceptEnv LANG LC_* Subsystem sftp internal-sftp UsePAM no Match group filetransfer ChrootDirectory %h X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp Match user root PasswordAuthentication yes
- Je kunt opslaan met CTRL + O , vervolgens op ENTER.
- Vervolgens moet ssh een restart krijgen. Dit kan met het commando service ssh try-restart
- Het is nu mogelijk om gebruikers te chrooten als ze via SSH inloggen. We moeten nog wel een gebruiker aanmaken. We springen even vooruit, want een gebruiker moet ook een homedirectory hebben waar hij uitkomt tijdens het inloggen.
We gaan daarom eerst deze omgeving aanmaken. Voer de volgende commando's uit:
mkdir -p /srv/www/domein/public_html
mkdir -p /srv/www/domein/tmp
mkdir -p /srv/www/domein/logs
Vervang hierbij "domein" met de domeinnaam die je wilt gaan gebruiken voor je site.
Vervolgens gaan we de gebruiker aanmaken:
groupadd gebruikersnaam
useradd -g gebruikersnaam -G filetransfer -d /srv/www/domein/ -s /usr/sbin/nologin gebruikersnaam
Vervang hierbij "gebruikersnaam" met de naam die deze gebruiker moet krijgen.
Vervolgens nog een wachtwoord instellen.
passwd gebruikersnaam - Nice - de gebruiker bestaat. Nu moeten we deze gebruiker nog toe staan om in te loggen met een wachtwoord via de SSH config. Hiervoor kun je het volgende doen:
echo "Match user gebruikersnaam" >> /etc/ssh/sshd_config
echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
service ssh try-restart - De SSH/SFTP Chroot is hiermee volledig opgezet. De eerste gebruiker is al aangemaakt! We gaan nu MariaDB installeren.
- Voer de volgende commando's uit:
apt-get install python-software-properties
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
echo "deb http://mirrors.supportex.net/mariadb/repo/10.0/debian" onclick="window.open(this.href);return false; wheezy main" >> /etc/apt/sources.list
echo "deb-src http://mirrors.supportex.net/mariadb/repo/10.0/debian" onclick="window.open(this.href);return false; wheezy main" >> /etc/apt/sources.list
apt-get update
apt-get install mariadb-server - Tijdens de installatie vraagt MariaDB om een wachtwoord. Dit gaat het wachtwoord worden voor de root user van MySQL. Kies dus een sterk wachtwoord.
- Na de installatie gaan we een paar dingen aanpassen aan de configuratie. De "beste" instellingen verschillen per server, maar dit is wat ik zelf gebruik voor mijn 1GB/RAM servers:
echo "" > /etc/mysql/my.cnf
nano /etc/mysql/my.cnf
Plaats hier het volgende:Vervolgens herstarten we MariaDB:Code: Selecteer alles
[client] port = 3306 socket = /var/run/mysqld/mysqld.sock [mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp default-storage-engine = innodb skip-external-locking bind-address = 127.0.0.1 key_buffer = 128M join_buffer_size = 1M read_buffer_size = 1M sort_buffer_size = 1M myisam_sort_buffer_size = 32M thread_cache_size = 286 max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 10 myisam-recover = BACKUP table_cache = 3000 query_cache_limit = 1M query_cache_size = 64M expire_logs_days = 10 max_binlog_size = 100M table_open_cache = 500 innodb_file_per_table = ON long_query_time = 10 #wait_timeout = 10 #connect_timeout = 10 #interactive_timeout = 10 tmp_table_size = 64M max_heap_table_size = 64M [mysqldump] quick quote-names max_allowed_packet = 16M [mysql] [isamchk] key_buffer = 64M sort_buffer = 64M read_buffer = 16M write_buffer = 16M !includedir /etc/mysql/conf.d/ # you can't just change log file size, requires special procedure innodb_buffer_pool_size = 256M innodb_log_buffer_size = 8M innodb_file_per_table = 1 innodb_open_files = 400 innodb_io_capacity = 1000 innodb_flush_method = O_DIRECT
service mysql restart
MySQL is nu opgezet. Nice! Voor het aanmaken van databases gaan we straks als PHP/nginx ook draaien phpmyadmin opzetten. Je kunt hiermee makkelijk MySQL users en databases aanmaken.
We gaan nu PHP Installeren.
- De Debian Repository gebruikt wat oudere versies, maar wel veilig en stabiel. Ik zelf wil graag de laatste versie, dus ik gebruik hiervoor een aparte Repository. De Dotdeb repository. Deze gaan we nu toevoegen:
echo "deb http://packages.dotdeb.org" onclick="window.open(this.href);return false; wheezy all" >> /etc/apt/sources.list
echo "deb-src http://packages.dotdeb.org" onclick="window.open(this.href);return false; wheezy all" >> /etc/apt/sources.list
echo "deb http://packages.dotdeb.org" onclick="window.open(this.href);return false; wheezy-php55 all" >> /etc/apt/sources.list
echo "deb-src http://packages.dotdeb.org" onclick="window.open(this.href);return false; wheezy-php55 all" >> /etc/apt/sources.list
wget http://www.dotdeb.org/dotdeb.gpg" onclick="window.open(this.href);return false;
cat dotdeb.gpg | apt-key add -
rm dotdeb.gpg
apt-get update
apt-get install php5-fpm
PHP5-FPM is nu geïnstalleerd. Vervolgens nog wat instellingen wijzigen:
echo "" > /etc/php5/fpm/php.ini
nano /etc/php5/fpm/php.ini
Plaats hierin het volgende:echo "" > /etc/php5/fpm/php-fpm.confCode: Selecteer alles
[PHP] engine = On short_open_tag = Off asp_tags = Off precision = 14 output_buffering = 4096 zlib.output_compression = Off implicit_flush = Off unserialize_callback_func = serialize_precision = 17 disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, disable_classes = zend.enable_gc = On expose_php = On max_execution_time = 30 max_input_time = 60 memory_limit = 128M error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT display_errors = Off display_startup_errors = Off log_errors = On log_errors_max_len = 1024 ignore_repeated_errors = Off ignore_repeated_source = Off report_memleaks = On track_errors = Off html_errors = On variables_order = "GPCS" request_order = "GP" register_argc_argv = Off auto_globals_jit = On post_max_size = 20M auto_prepend_file = auto_append_file = default_mimetype = "text/html" doc_root = user_dir = enable_dl = Off cgi.fix_pathinfo=0 file_uploads = On upload_max_filesize = 20M max_file_uploads = 20 allow_url_fopen = On allow_url_include = Off default_socket_timeout = 60 [CLI Server] cli_server.color = On [Date] [filter] [iconv] [intl] [sqlite] [sqlite3] [Pcre] [Pdo] [Pdo_mysql] pdo_mysql.cache_size = 2000 pdo_mysql.default_socket= [Phar] [mail function] SMTP = localhost smtp_port = 25 mail.add_x_header = On [SQL] sql.safe_mode = Off [ODBC] odbc.allow_persistent = On odbc.check_persistent = On odbc.max_persistent = -1 odbc.max_links = -1 odbc.defaultlrl = 4096 odbc.defaultbinmode = 1 [Interbase] ibase.allow_persistent = 1 ibase.max_persistent = -1 ibase.max_links = -1 ibase.timestampformat = "%Y-%m-%d %H:%M:%S" ibase.dateformat = "%Y-%m-%d" ibase.timeformat = "%H:%M:%S" [MySQL] mysql.allow_local_infile = On mysql.allow_persistent = On mysql.cache_size = 2000 mysql.max_persistent = -1 mysql.max_links = -1 mysql.default_port = mysql.default_socket = mysql.default_host = mysql.default_user = mysql.default_password = mysql.connect_timeout = 60 mysql.trace_mode = Off [MySQLi] mysqli.max_persistent = -1 mysqli.allow_persistent = On mysqli.max_links = -1 mysqli.cache_size = 2000 mysqli.default_port = 3306 mysqli.default_socket = mysqli.default_host = mysqli.default_user = mysqli.default_pw = mysqli.reconnect = Off [mysqlnd] mysqlnd.collect_statistics = On mysqlnd.collect_memory_statistics = Off [OCI8] [PostgreSQL] pgsql.allow_persistent = On pgsql.auto_reset_persistent = Off pgsql.max_persistent = -1 pgsql.max_links = -1 pgsql.ignore_notice = 0 pgsql.log_notice = 0 [Sybase-CT] sybct.allow_persistent = On sybct.max_persistent = -1 sybct.max_links = -1 sybct.min_server_severity = 10 sybct.min_client_severity = 10 [bcmath] bcmath.scale = 0 [browscap] [Session] session.save_handler = files session.use_cookies = 1 session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 0 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.bug_compat_42 = Off session.bug_compat_warn = Off session.referer_check = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.hash_function = 0 session.hash_bits_per_character = 5 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" [MSSQL] mssql.allow_persistent = On mssql.max_persistent = -1 mssql.max_links = -1 mssql.min_error_severity = 10 mssql.min_message_severity = 10 mssql.compatability_mode = Off mssql.secure_connection = Off [Assertion] [COM] [mbstring] [gd] [exif] [Tidy] tidy.clean_output = Off [soap] soap.wsdl_cache_enabled=1 soap.wsdl_cache_dir="/tmp" soap.wsdl_cache_ttl=86400 soap.wsdl_cache_limit = 5 [sysvshm] [ldap] ldap.max_links = -1 [mcrypt] [dba] [opcache]
nano /etc/php5/fpm/php-fpm.conf
Plaats hierin het volgende:Vervolgens verwijderen we de standaard configuratie pool:Code: Selecteer alles
[global] pid = /var/run/php5-fpm.pid error_log = /var/log/php5-fpm.log emergency_restart_threshold = 10 emergency_restart_interval = 1m process_control_timeout = 10s process.max = 64 include=/etc/php5/fpm/pool.d/*.conf
rm /etc/php5/fpm/pool.d/*conf
We gaan nu een nieuwe pool maken. Let hierbij goed op dat je de zelfde waardes gebruikt die je eerder al voor de domeinnaam en de gebruikersnaam gebruikt hebt (in stap 1).
nano /etc/php5/fpm/pool.d/domein.conf
Vervang overal domein en gebruikersnaam met de waardes die je eerder al gebruikt hebt. Voer het volgende in bij de editor:Code: Selecteer alles
[gebruikersnaam] user = gebruikersnaam group = gebruikersnaam listen = /srv/www/domein/tmp/php-fpm-gebruikersnaam.sock listen.owner = gebruikersnaam listen.group = gebruikersnaam listen.mode = 0666 pm = dynamic pm.max_children = 9 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 3 pm.max_requests = 500 chdir = / php_admin_value[open_basedir] = /srv/www/domein/public_html:/srv/www/domein/tmp:/usr/share/php5:/usr/share/php php_admin_value[disable_functions] = apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, mysql_pconnect, openlog, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode, symlink php_flag[expose_php] = off php_value[memory_limit] = 128M php_admin_value[upload_tmp_dir] = "/srv/www/domein/tmp/"
- Vervolgens PHP herstarten:
service php5-fpm restart
Mooi! Nu draaien MariaDB en PHP. Daarnaast is er een gebruiker waarvandaan de content getoont kan worden. Nu alleen nog de webserver zelf.
- apt-get install nginx
echo "" > /etc/nginx/nginx.conf
nano /etc/nginx/nginx.conf
Plaats hierin het volgende. Let op dat ik in de configfiles voor nginx soms [::] gebruik. Dit slaat op IPv6. Indien jouw server geen IPv6 adressen heeft dan zul je deze regels moeten verwijderen.Vervolgens de standaard vhost verwijderen en nieuwe aanmaken:Code: Selecteer alles
user www-data; worker_processes 4; pid /var/run/nginx.pid; events { worker_connections 1024; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 5 5; types_hash_max_size 2048; server_tokens off; etag off; # Allow 20M POST client_max_body_size 20m; client_body_buffer_size 128k; client_header_buffer_size 128k; large_client_header_buffers 8 128k; include /etc/nginx/mime.types; default_type application/octet-stream; gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server { listen 80; listen [::]:80 default ipv6only=on; location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { expires 360d; } location ~ /\. { access_log off; log_not_found off; deny all; } location / { index index.html index.htm index.php; } } include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
rm /etc/nginx/sites-enabled/*
rm /etc/nginx/sites-available/*
nano /etc/nginx/sites-available/domein
Let op dat je hierbij weer dezelfde waardes aanhoudt met de domeinnaam en gebruikersnaam. Anders gaat het niet werken:Vervolgens de vhost enablen en nginx herstarten:Code: Selecteer alles
server { listen 80; listen [::]:80; server_name domein www.domein; client_max_body_size 20m; client_body_buffer_size 128k; access_log /srv/www/domein/logs/access.log; error_log /srv/www/domein/logs/error.log; root /srv/www/domein/public_html; add_header X-Frame-Options SAMEORIGIN; index index.html index.htm index.php; location ~ /\. { access_log off; log_not_found off; deny all; } ## Only allow these request methods ## if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } ## Do not accept DELETE, SEARCH and other methods ## # Pass all .php files onto a php-fpm/php-fcgi server. location ~ \.php$ { # Important, don't remove for security reasons try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/srv/www/domein/tmp/php-fpm-gebruikersnaam.sock; } }
ln -s /etc/nginx/sites-available/domein /etc/nginx/sites-enabled/domein
service nginx restart
We gaan ook nog even wat permissies wijzigen op de vhost. Eerder kon dit niet omdat nginx nog niet geïnstalleerd was.
chown -R gebruikersnaam:www-data /srv/www/domein/logs/
chown -R gebruikersnaam:www-data /srv/www/domein/public_html/
chown -R gebruikersnaam:www-data /srv/www/domein/tmp
chmod 0710 /srv/www/domein/logs/
chmod 0710 /srv/www/domein/public_html/
chmod 0710 /srv/www/domein/tmp/
Als je geen echte domein hebt dan zul je in de hostsfile dit moeten aanpassen. Onder Linux/OSX is dit /etc/hosts en bij Windows "C:\Windows\System32\drivers\etc\hosts".
Instellen gaat als volgt:
x.x.x.x domein http://www.domein" onclick="window.open(this.href);return false;
dus bijvoorbeeld:
1.2.3.4 nu.nl http://www.nu.nl" onclick="window.open(this.href);return false;
Om bestanden te uploaden & te testen of alles werkt kun je via SFTP inloggen.
Dit kan met de meeste FTP clients, zoals Filezilla:
Hostname: sftp://gebruikersnaam@ip" onclick="window.open(this.href);return false; en het bijbehorende wachtwoord
Alle bestanden die je in de public_html zet zullen worden weergegeven. Je kunt testen of PHP werkt door bv. het volgende bestand aan te maken in de public_html:
info.php
Code: Selecteer alles
<?php
phpinfo();
?>
Alleen nog een paar extensies installeren die handig kunnen zijn:
apt-get install php5-mcrypt php5-mysqlnd php5-gd
We kunnen nu ook nog PHPMyAdmin installeren. Hiermee kun je de database makkelijk beheren. Dit is ook gelijk een leuke oefening. Maak volgens de stappen die hierboven beschreven staan een nieuwe gebruiker aan, een nieuwe PHP-FPM pool en een nieuwe nginx vhost.
Vergeet niet om deze gebruiker ook toegang te geven om via SSH met een wachtwoord in te loggen en om nginx/PHP-FPM te reloaden nadat je de pool en vhost hebt aangemaakt.
Als domein kun je bijvoorbeeld phpmyadmin.domein gebruiken (dus phpmyadmin.voorbeeld.nl). Vergeet niet om een DNS wijziging te maken of om dit door te voeren in je HOSTS bestand.
Plaats vervolgens in de public_html de PHPMyAdmin bestanden. Deze kun je hier downloaden.
Vervolgens moet je alleen nog even een config.inc.php aanmaken in de public_html. Hierin zet je de volgende instellingen:
Code: Selecteer alles
<?php
$cfg['blowfish_secret'] = 'WACHTWOORD'; // use here a value of your choice
$i=0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['PmaNoRelation_DisableWarning'] = true;
?>
Je kunt nu de phpmyadmin pagina benaderen en inloggen met de gegevens die je tijdens de MariaDB installatie hebt gebruikt inloggen. Dus voor de MySQL Root gebruiker.
------
Ik zelf gebruik hier een scriptje voor dat ik geschreven heb om nieuwe gebruikers aan te maken. Als je de tutorial volledig gevolgd hebt kun je deze ook gebruiken. Let er wel op dat deze specifiek voor mijn wensen is ingesteld, dus als je dingen anders wilt zul je het handmatig moeten doen (of zelf een scriptje maken)
Bij deze het scriptje:
Code: Selecteer alles
#!/bin/bash
##
# KamiNuvini - kami@nuvini.com
# This script does the following:
# 1. Create directory for new user. This directory will have a public_html, logs and tmp folder by default.
# 2. Add user, SFTP Chroot them, disallow normal SSH access. Allow PasswordAuthentication for user.
# 3. Add separate PHP-FPM Pool for user.
# 4. Add nginx-vhost and enable it.
# 5. Setting up directory permissions.
# 6. Restarting Services
# Note that SFTP chrooting must be set up prior to running this script. The SFTP Chroot condition is the group
# filetransfer.
##
## Fetching Variables
echo -n "Give domain name: "
read DOMAIN
echo -n "Give username: "
read USER
# Homedir location, please set at least 2 levels deep for proper chrooting.
HOMEDIR=/srv/www/$DOMAIN
## 1. Creating directories
mkdir -p $HOMEDIR/public_html
mkdir -p $HOMEDIR/tmp
mkdir -p $HOMEDIR/logs
## 2. Creating User
groupadd $USER
useradd -g $USER -G filetransfer -d $HOMEDIR/ -s /usr/sbin/nologin $USER
passwd $USER
### 2.1 Allow PasswordAuthentication through SSH
cat >> /etc/ssh/sshd_config << EOL
Match User $USER
PasswordAuthentication yes
EOL
## 3. Adding PHP-FPM Pool
cat > /etc/php5/fpm/pool.d/$DOMAIN.conf << EOL
[$USER]
user = $USER
group = $USER
listen = $HOMEDIR/tmp/php-fpm-$USER.sock
listen.owner = $USER
listen.group = $USER
listen.mode = 0666
pm = dynamic
pm.max_children = 9
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 3
pm.max_requests = 500
chdir = /
php_admin_value[open_basedir] = $HOMEDIR/public_html:$HOMEDIR/tmp:/usr/share/php5:/usr/share/php
php_admin_value[disable_functions] = apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, mysql_pconnect, openlog, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode, symlink
php_flag[expose_php] = off
php_value[memory_limit] = 128M
php_admin_value[upload_tmp_dir] = "$HOMEDIR/tmp/"
EOL
## 4. Setting up nginx vhost
cat > /etc/nginx/sites-available/$DOMAIN << EOL
server
{
listen 80;
listen [::]:80;
server_name $DOMAIN www.$DOMAIN;
client_max_body_size 20m;
client_body_buffer_size 128k;
access_log $HOMEDIR/logs/access.log;
error_log $HOMEDIR/logs/error.log;
root $HOMEDIR/public_html;
add_header X-Frame-Options SAMEORIGIN;
index index.html index.htm index.php;
location ~ /\.
{
access_log off;
log_not_found off;
deny all;
}
## Only allow these request methods ##
if (\$request_method !~ ^(GET|HEAD|POST)$ )
{
return 444;
}
## Do not accept DELETE, SEARCH and other methods ##
# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$
{
# Important, don't remove for security reasons
try_files \$uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
fastcgi_pass unix:$HOMEDIR/tmp/php-fpm-$USER.sock;
}
}
EOL
### 4.1 Enable the vhost
ln -s /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/$DOMAIN
## 5. Setting permissions
chown -R $USER:www-data $HOMEDIR/logs/
chown -R $USER:www-data $HOMEDIR/public_html/
chown -R $USER:www-data $HOMEDIR/tmp
chmod 0710 $HOMEDIR/logs
chmod 0710 $HOMEDIR/public_html/
chmod 0710 $HOMEDIR/tmp/
## Restarting Services
/etc/init.d/php5-fpm restart
/etc/init.d/nginx reload
/etc/init.d/ssh try-restart
- Niels