====== Apache 2.4 and PHP 7/8 ====== ===== Apache 2.4 Installation ===== - Install apache 2.4$ sudo apt update $ sudo apt install apache2 - Add one of the two commands to add the user to apache's user group:$ sudo adduser www-data $ sudo usermod -a -G www-data - Setup your virtual hosts - Create sub folders in ''/var/log/apache2'' if you setup log files for the virtual hosts in sub folders - Install and configure [[deb11:certbot|Let's Encrypt Certbot]] - If you are migrating from an old server, follow the [[deb11:migrate#apache_2.4|How to migrate a (web) server]] guide ===== Apache Settings ===== ==== Harden apache ==== * change //ServerTokens// and //ServerSignature// in /etc/apache2/conf.d/security.conf * add //Require all granted// to your web space, possibly exclude black listed ip addresses, and restrict access to phpmyadmin etc. Put a respective conf file into /etc/apache2/conf.d. ==== MaxRequestedWorkers ==== Modify /etc/apache2/mods-available/mpm-prefork.conf and restart apache2$ sudo apache2ctl -V | grep MPM vim /etc/apache2/mods-available/mpm-prefork.conf MaxRequestedWorkers 400 ServerLimit 400 $ sudo service apache2 restart ==== Check configuration ==== * $ sudo apachectl configtest ===== PHP Installation ===== - Install packages$ sudo apt update $ sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https software-properties-common - Add the SURY repository to your system$ echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list - Import the repository key$ wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add - - Install the desired PHP version, where V is the major and v is the minor version number, for example 7.4 or 8.1$ sudo apt update $ sudo apt install phpV.v - Enable modules:$ sudo a2enmod ssl $ sudo a2enmod proxy $ sudo a2enmod proxy_http $ sudo a2enmod rewrite * [[https://computingforgeeks.com/how-to-install-php-on-debian-linux/|How To Install PHP 8.0 on Debian 11/10/9]] * [[https://computingforgeeks.com/how-to-install-latest-php-on-debian/|How To Install PHP 7.4 on Debian 10 / Debian 9]] * [[https://tecadmin.net/how-to-install-php-on-debian-11/|How To Install PHP (8.1, 7.4 & 5.6) on Debian 11]] * [[https://www.php.net/supported-versions.php|Supported Versions]] * [[https://github.com/oerdnj/deb.sury.org/issues/1575|Expired Debian key issue]] ===== PHP Extensions ===== * PHP extensions for Joomla:$ sudo apt install phpV.v-{bz2 curl gd mbstring mysql xml zip} phpV.v-{bcmath} * PHP extensions for Wiki:$ sudo apt install phpV.v-{bz2 curl gd mbstring mysql xml zip} phpV.v-{sqlite3} * PHP extensions for phpMyAdmin:$ sudo apt install phpV.v-mbstring * PHP extensions for vps:$ sudo apt install phpV.v-{curl xml zip} * Required for PHP7:$ sudo apt install phpV.v-json * Restart the service with one of the 2 commands below:$ sudo systemctl restart apache2 $ sudo service apache2 restart ===== Set or change PHP version ===== - Set the desired PHP version for Apache2 and restart the service with one of the 2 commands below:sudo a2dismod phpV.v sudo a2enmod phpV.v sudo systemctl restart apache2 sudo service apache2 restart - Set the desired PHP version for CLI: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 - Check PHP cli Versionphp -v - Check PHP apache2 Version: call phpinfo(); in a script - Once you have installed a required extension, use the below command to verify itphp -m | grep -i mysql * [[https://tecadmin.net/switch-between-multiple-php-version-on-debian/|How to Switch between Multiple PHP Version on Debian 9]] ===== PHP Settings ===== ==== Check ini files ==== * apache2: load a php file with the following content * cli:php --ini ==== php.ini ==== * 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 ===== Xdebug ===== - Open terminal and write following command:php -i > /var/www/html/php_info.txt - Copy the output from /var/www/html/php_info.txt - Go to the [[https://xdebug.org/wizard|Xdebug: Installation Wizard]], and paste the output inside the text box on the page. It will analyze the output and will recommend the most suited package of Xdebug. - Download that package, for example xdebug-3.1.5.tgz - Install the pre-requisites for compiling PHP extensionssudo apt install phpV.v-dev autoconf automake - Unpack the downloaded file with ''tar -xvzf xdebug-3.1.5.tgz'' within a temp folder, then change to that folder, run //phpize// and check it's output:cd xdebug-3.1.5 phpize Configuring for: ... Zend Module Api No: 20200930 (8.0), 20210902 (8.1) Zend Extension Api No: 420200930 (8.0), 420210902 (8.1) - If it does not, you are using the wrong phpize. Please follow [[https://xdebug.org/docs/faq#custom-phpize|this FAQ entry]] and skip the next step. - Run:./configure make - Copy the module to:sudo cp modules/xdebug.so /usr/lib/php/{20200930, 20210902} - Create ''/etc/php/{8.0, 8.1}/apache2/conf.d/99-xdebug.ini'' for Xdebug 3 and add lines:zend_extension = xdebug xdebug.remote_port = 9000 (default: 9003) xdebug.mode = debug - Restart your webserver. - Create a PHP page that has 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! - On the command line, you can also ''php -m''. This lists all loaded modules. Xdebug should appear twice there (once under 'PHP Modules' and once under 'Zend Modules'). ===== Windows Subsystem for Linux ===== * For Windows Subsystem for Linux, create a **Virtual Host** file with document root in ///mnt//htdocs// or similar, if you need to access it through the Windows file system. * You should set the apache user to the one who owns the files in the document root, which helps avoiding problems with permissions on the Windows NTFS file system:export APACHE_RUN_USER= export APACHE_RUN_GROUP= * Restart apache and remove session variables if any:/etc/init.d/apache2 restart rm /var/lib/php/sessions/* * You can check the current apache user with:ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}' * Replace the apache default user and group permissions of //www-data// with the one of . run:sudo chown root: /var/lib/phpmyadmin/blowfish_secret.inc.php sudo chown -R : /var/lib/tmp sudo chown root: /etc/phpmyadmin/config-db.php * Check permissions of the folder containing the http files according to [[https://thegeekpage.com/solved-failed-to-enumerate-objects-in-the-container-windows-10-error/|“Failed to Enumerate Objects in the Container” Windows 10 Error]]. Most importantly, make sure all files are owned by the same user. Run a (windows) command shell on the windows path of that folder as administrator and run: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 ==== Links ==== * [[https://community.letsencrypt.org/t/correct-steps-to-add-another-domain-to-existing-certificate/64654/2|Correct steps to add another domain to existing certificate]] * [[https://websiteforstudents.com/revoking-lets-encrypt-certificates-on-ubuntu-18-04-16-04/|Revoking Let’s Encrypt Certificates]] * [[https://medium.com/@mhagemann/correct-way-to-delete-a-certbot-ssl-certificate-e8ee123e6e01|Correct Way to Delete a Certbot SSL Certificate]] * [[https://webmasters.stackexchange.com/questions/126557/what-is-the-difference-of-certbot-and-certbot-auto|What is the difference of certbot and certbot-auto?]] * [[https://www.jesusamieiro.com/remove-revoke-a-domain-in-lets-encrypt/|Remove a domain in Let’s Encrypt]] ===== SSL for localhost ===== ==== Ignore invalid certificates ==== * You can just use the default ssl conf file in /etc/apache2/sites-available which makes use of the snakeoil certificate. Modify DocumentRoot and add Directory permissions. * Paste this in chrome, enable, and chrome will ignore invalid certificates for localhost:chrome://flags/#allow-insecure-localhost ==== Create certificate for localhost ==== - Make a folder to keep your certificate files and change to that folder, for example ~/certs/ssl. - Generate RootCA.pem, RootCA.key & RootCA.crt: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 - Create a file domains.ext that lists all your local domains: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 - Generate localhost.key, localhost.csr, and localhost.crt: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 - Configure Apache:SSLEngine on SSLCertificateFile "/home/user/certs/ssl/localhost.crt" SSLCertificateKeyFile "/home/user/certs/ssl/localhost.key" - Restart Apache - At this point, the site would load with a warning about self-signed certificates. In order to get a green lock, your new local CA has to be added to the trusted Root Certificate Authorities in your OS or browser. * For Windows 10 Chrome & Edge: Windows 10 recognizes .crt files, so you can right-click and open //RootCA.crt//. * Select //Install Certificate...//, select //Local Machine//, then select //Trusted Root Certification Authorities// and confirm. * You might need to clear cookies and cache for the browser to pick up the certificate from the server - If you want to utilitze the certificate for an Endian Firewall, do the following: * Rename the files //server.crt//, //server.csr//, and //server.key// in folder /etc/httpd and etc/httpd/cert * Copy the newly generate certificate files //localhost.crt//, //localhost.csr//, and //localhost.key// to //server.crt//, //server.csr//, and //server.key// in folder /etc/httpd * Copy the newly generate certificate file //localhost.crt// to //server.crt// in folder /etc/httpd/certs and append the parameters from the renamed original //server.crt// file * Restart httpd * You can check the domain names included in the original certificate:openssl x509 -text < $CERT_FILE === Links === * [[https://gist.github.com/cecilemuller/9492b848eb8fe46d462abeb26656c4f8|How to create an HTTPS certificate for localhost domains]] (reference) * [[https://letsencrypt.org/docs/certificates-for-localhost/|Let's Encrypt: Certificates for localhost]] * [[https://www.section.io/engineering-education/how-to-get-ssl-https-for-localhost/|How to Get SSL HTTPS for localhost]] * [[https://www.digicert.com/kb/ssl-support/apache-fix-common-ssl-errors.htm|Troubleshooting Apache SSL Certificate Errors]] ===== Proxy ===== Follow the guide [[deb11:apache-proxy|Apache Server with Proxy]] to setup access to proxied servers. ===== Links ===== * [[https://www.itzgeek.com/how-tos/linux/debian/how-to-install-php-7-3-7-2-7-1-on-debian-10-debian-9-debian-8.html|How To Install PHP 7.4 / 7.3 / 7.2 / 7.1 on Debian 10 / Debian 9]] * [[https://deb.sury.org/|DEB.SURY.ORG]] * [[https://tecadmin.net/install-php-debian-9-stretch/|How To Install PHP (7.2, 7.1 & 5.6) on Debian 9 Stretch]] * [[https://linuxize.com/post/how-to-install-php-on-debian-9/|How to Install PHP on Debian 9]] * [[https://tecadmin.net/switch-between-multiple-php-version-on-debian/|How to Switch between Multiple PHP Version on Debian 9]] * [[https://tecadmin.net/install-multiple-php-version-with-apache-on-debian/|How to Install Multiple PHP Version with Apache on Debian 9]] * [[https://www.php.net/manual/en/simplexml.installation.php|php.net - SimpleXML Installation]] * [[https://www.php.net/manual/en/configuration.file.php|php.net - The configuration file]] * [[https://www.howtoforge.com/how-to-specify-a-custom-php.ini-for-a-website-apache2-with-mod_php|How To Specify A Custom php.ini For A Web Site]] * [[https://www.sslshopper.com/ssl-checker.html|SSL Checker]] * [[https://www.onepagezen.com/letsencrypt-auto-renew-certbot-apache/|How to Setup Auto-Renew for Let’s Encrypt SSL Certificates (Apache)]] * [[https://medium.com/@mhagemann/correct-way-to-delete-a-certbot-ssl-certificate-e8ee123e6e01|Correct Way to Delete a Certbot SSL Certificate]] * [[https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-debian-9|How To Secure Apache with Let's Encrypt on Debian 9]] * [[https://certbot.eff.org/docs/install.html#certbot-auto|Certbot-auto]] * [[https://stackoverflow.com/questions/38302401/letsencrypt-add-domain-to-existing-certificate|Letsencrypt add domain to existing certificate]] * [[https://community.letsencrypt.org/t/certbot-auto-deployment-best-practices/91979|Certbot-auto deployment best practices]] * [[https://community.letsencrypt.org/t/multiple-servers-one-ip-address-home-setup-issue/64210|Multiple servers one IP address]] * [[https://stackoverflow.com/questions/2364840/what-is-the-size-limit-of-a-post-request|What is the size limit of a post request?]] * [[https://xdebug.org/docs/install|Xdebug: Installation]] * [[https://gist.github.com/RazaChohan/51bffc660d52eae8a75dd0f9503740bf|GitHub: Xdebug Installation]] * [[https://xdebug.org/docs/all_settings|Xdebug: all settings]] * [[https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-phpmyadmin-on-debian-9|How To Install and Secure phpMyAdmin on Debian 9]] * [[https://www.digitalocean.com/community/tutorials/how-to-install-phpmyadmin-from-source-debian-10|How To Install phpMyAdmin From Source on Debian 10]] * [[https://computingforgeeks.com/install-phpmyadmin-with-apache-on-debian-10-buster/|How To Install phpMyAdmin with Apache on Debian 10]] * [[https://devanswers.co/problem-php-7-2-phpmyadmin-warning-in-librariessql-count/|Problem with phpMyAdmin and PHP 7.2]] * [[https://devanswers.co/manually-upgrade-phpmyadmin/|How to Manually Upgrade phpMyAdmin]] * [[https://www.phpmyadmin.net/downloads/|Download phpMyAdmin]] * [[https://www.itaewonpool.org/phpmyadmin/doc/html/faq.html#faq1-16|phpMyAdmin trouble shooting]] * [[https://stackoverflow.com/questions/7580508/getting-chrome-to-accept-self-signed-localhost-certificate|Getting Chrome to accept self-signed localhost certificate]] * [[https://stackoverflow.com/questions/10175812/how-to-create-a-self-signed-certificate-with-openssl|How to create a self-signed certificate with OpenSSL]] * [[https://www.ssls.com/knowledgebase/how-to-install-an-ssl-certificate-on-apache/|How to install an SSL Certificate on Apache]] * [[https://confluence.jaytaala.com/display/TKB/Securing+Apache+and+blocking+a+list+of+ip+addresses|Securing Apache and blocking a list of ip addresses]] * [[https://support.plesk.com/hc/en-us/articles/214529205--Apache-keeps-going-down-on-a-Plesk-server-server-reached-MaxRequestWorkers-setting|Apache keeps going down on a Plesk server: server reached MaxRequestWorkers setting]]