$ sudo apt update $ sudo apt install apache2
$ sudo adduser <user> www-data $ sudo usermod -a -G www-data <user>
/var/log/apache2
if you setup log files for the virtual hosts in sub foldersMaxRequestedWorkers
: modify /etc/apache2/mods-available/mdm-prefork.conf and restart apache2$ sudo apache2ctl -V | grep MPM vim /etc/apache2/mods-available/mdm-prefork.conf MaxRequestedWorkers 400 ServerLimit 400 $ sudo service apache2 restart
$ sudo apt update $ sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https software-properties-common
$ echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
$ wget -qO- https://packages.sury.org/php/apt.gpg | sudo tee /etc/apt/trusted.gpg.d/sury.gpg
$ sudo apt update $ sudo apt install phpV.v
$ sudo a2enmod ssl $ sudo a2enmod proxy $ sudo a2enmod proxy_http $ sudo a2enmod rewrite
php.ini
for production:max_execution_time = 120 max_input_vars = 2000 memory_limit = 512M post_max_size = 32M sys_temp_dir = "/tmp" upload_tmp_dir = "/tmp" upload_max_filesize = 16M date.timezone = Asia/Bangkok
php.ini
for development:output_buffering=off short_open_tag = On max_execution_time=120 max_input_time=150 max_input_vars = 2000 memory_limit = 512M error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT display_errors=On post_max_size = 32M sys_temp_dir = "/tmp" upload_tmp_dir = "/tmp" upload_max_filesize=128M date.timezone=Asia/Bangkok
<?php phpinfo();?>
php --ini
$ sudo apt install phpV.v-{bz2 curl gd mbstring mysql xml zip bcmath} phpV.v-{json}
$ sudo apt install phpV.v-{bz2 curl gd mbstring mysql xml zip sqlite3} phpV.v-{json}
$ sudo service apache2 restart
sudo a2dismod phpV.v sudo a2enmod phpV.v sudo systemctl restart apache2 sudo service apache2 restart
sudo update-alternatives --set php /usr/bin/phpV.v sudo update-alternatives --set phar /usr/bin/pharV.v sudo update-alternatives --set phar.phar /usr/bin/phar.pharV.v
php -v
php -m | grep -i mysql
php -i > /var/www/html/php_info.txt
sudo apt install phpV.v-dev autoconf automake
tar -xvzf xdebug-3.3.2.tgz
within a temp folder, then change to that folder, run phpize
and check it's output:cd xdebug-3.3.2 phpize Configuring for: PHP Api Version: 20230831 (8.3) Zend Module Api No: 20230831 Zend Extension Api No: 420230831
./configure make
sudo cp modules/xdebug.so /usr/lib/php/20230831
/etc/php/<V.v>/[apache2|cli]/conf.d/80-xdebug.ini
(V.v is the php version, e.g. 8.3
):zend_extension = /usr/lib/php/20230831/xdebug.so xdebug.remote_enable=1 xdebug.profiler_enable=0 xdebug.profiler_enable_trigger=1 xdebug.trace_output_dir=PATH_TO_OUTPUT xdebug.profiler_output_dir=PATH_TO_OUTPUT xdebug.gc_stats_output_dir=PATH_TO_OUTPUT xdebug.remote_log=PATH_TO_LOG/xdebug.log xdebug.remote_port=9000 xdebug.remote_host=127.0.0.1
zend_extension = /usr/lib/php/20230831/xdebug.so xdebug.mode=debug,develop xdebug.start_with_request=trigger xdebug.start_upon_error=no xdebug.output_dir=PATH_TO_OUTPUT xdebug.log=/PATH/TO/LOG/xdebug.log xdebug.log_level=10 xdebug.var_display_max_children=-1 xdebug.var_display_max_data=-1 xdebug.var_display_max_depth=-1 xdebug.client_port=9003 xdebug.client_host=127.0.0.1
PATH_TO_OUTPUT
and PATH_TO_LOG
must be writable for the php process (apache or cli)zend_extension
directive must be below the line for OPcache)<?php phpinfo(); ?>
. Load it in a browser and look for the info on the Xdebug module. If you see it next to the Zend logo, you have been successful!<?php xdebug_info(); ?>
. Load it in a browser to verify the Xdebug configurationphp -m
. This lists all loaded modules. Xdebug should appear twice there (once under 'PHP Modules' and once under 'Zend Modules')$ sudo apt install mariadb-server
$ sudo service mariadb start
$ sudo mariadb-secure-installation
$ sudo mysqldump --all-databases > sql_file.sql
sql_file.sql
to the new server and remove databases mysql
and phpmyadmin
from the dump file, then import with$ sudo mysql < sql_file.sql
export APACHE_RUN_USER=<user> export APACHE_RUN_GROUP=<user>
/etc/init.d/apache2 restart rm /var/lib/php/sessions/*
ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'
sudo chown root:<user> /var/lib/phpmyadmin/blowfish_secret.inc.php sudo chown -R <user>:<user> /var/lib/tmp sudo chown root:<user> /etc/phpmyadmin/config-db.php
takeown /F X:\FULL_PATH_TO_FOLDER takeown /F X:\FULL_PATH_TO_FOLDER /r /d y icacls X:\FULL_PATH_TO_FOLDER /grant Administrators:F icacls X:\FULL_PATH_TO_FOLDER /grant Administrators:F /t
bridged
modexdebug.client_host
(Xdebug2: xdebug.remote_host
)NAT
networking mode (default)/etc/resolv.conf
xdebug.client
_host must be configured to use this IP address. Separate the directive from the xdebug settings by copying it into a separate file to be loaded after the xdebug settings, then run a script to update this IP address before starting or restarting the LAMP server:#!/bin/bash IP=$(ip route show | grep -i default | awk '{ print $3}') INI="/home/bco/conf/xdebug.host.ini" echo -e "[Xdebug]" > $INI echo -e "xdebug.client_host=$IP" >> $INI
tail -f /path/to/log/xdebug.log
until this is working properlyNew-NetFirewallRule -DisplayName "xdebug" -InterfaceAlias "vEthernet (WSL (Hyper-V firewall))" -Direction Inbound -Protocol TCP -LocalPort 9003 -Action Allow
Get-NetFirewallRule -DisplayName "xdebug" Remove-NetFirewallRule -DisplayName "xdebug"
mirrored
networking modemirrored
mode, save the following content as file .wslconfig
into folder C:\Users\<user>
on your Windows host[wsl2] networkingMode=mirrored
127.0.0.1
, no firewall rule is necessaryxdebug.client
_host must be configured to use this IP addresstail -f /path/to/log/xdebug.log
until this is working properlymirrored
mode is less secure and can be directly accessed from your LANchrome://flags/#allow-insecure-localhost
openssl req -x509 -nodes -new -sha256 -days 1024 -newkey rsa:2048 -keyout RootCA.key -out RootCA.pem -subj "/C=US/CN=Example-Root-CA" openssl x509 -outform pem -in RootCA.pem -out RootCA.crt
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = localhost DNS.2 = localhost.yourdomain.tld DNS.3 = machine1.yourdomain.tld DNS.4 = machine2.yourdomain.tld
openssl req -new -nodes -newkey rsa:2048 -keyout localhost.key -out localhost.csr -subj "/C=US/ST=YourState/L=YourCity/O=Example-Certificates/CN=localhost.local" openssl x509 -req -sha256 -days 1024 -in localhost.csr -CA RootCA.pem -CAkey RootCA.key -CAcreateserial -extfile domains.ext -out localhost.crt
SSLEngine on SSLCertificateFile "/home/user/certs/ssl/localhost.crt" SSLCertificateKeyFile "/home/user/certs/ssl/localhost.key"
openssl x509 -text < $CERT_FILE
* Setup a VirtualHost on your main apache server, which for this example is now called “proxy”. * There needs to be another (regular) VirtualHost file on the backuppc server, which for this example is now called “host”. * The SSL certificates are served from the “proxy” through access to https://sub.domain.tld * The “host” serves an unencrypted site through port 80. This assumes your local network is secure.
* sub.domain.tld: external domain name with which you access the “host” behind the “proxy” * host.yourdomain.tld: internal domain name of your “host”. You may also choose to have both names the same.
<VirtualHost *:80> ServerName sub.domain.tld Redirect 301 / https://sub.domain.tld <VirtualHost> <VirtualHost *:443> ServerName sub.domain.tld ServerAdmin you@domain.tld DocumentRoot /var/www/html/yoursite SSLEngine on RedirectMatch ^/$ /yourapp/ # use this if backuppc is not the default app, or if you need to access another app on the same server <Location "/yourapp/"> ProxyPass "http://host.yourdomain.tld/yourapp/" ProxyPassReverse "http://host.yourdomain.tld/yourapp/" Require all granted </Location> # add other options such as Files and Directory permissions Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/sub.domain.tld/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/sub.domain.tld/privkey.pem </VirtualHost>