Tag: Web server

  • How to install a web server on Arch Linux

    You have installed Arch Linux, great. Now what about installing a web server to display your personal website, for example?

    In this post, I explain step-by-step how to install and configure WordPress. For this, you need four components, commonly called “the LAMP stack”. It is a “stack” because each level derives off its base layer. The letters in LAMP refer to four layers:

    • L for Linux, the operating system. This should be done already – if not, read this post and come back here.
    • A for Apache. This is the web server, the software that receives the HTTP requests and sends back the responses to the clients that want to see your website on their browser.
    • M for MySQL. This is the database that contains your blog posts, users, comments, and anything else that WordPress needs in a database format.
    • P for PHP. This is the part that dynamically interacts with ???

    Apache

    The Apache HTTP Server is a free and open-source cross-platform web server software.

    Apache supports a variety of features, many implemented as compiled modules which extend the core functionality. These can range from server-side programming language support to authentication schemes. Some common language interfaces support Perl, Python, Tcl, and PHP. Popular authentication modules include mod access, mod auth, mod digest, and mod auth digest, the successor to mod_digest. A sample of other features include SSL and TLS support (mod ssl), a proxy module (mod proxy), a URL rewriter (implemented under mod rewrite), custom log files (mod log config), and filtering support (mod include and mod ext filter).

    Installing Apache on Arch Linux is straightforward, just run:

    sudo pacman -S apache

    Configuration

    /etc/httpd/conf is the folder that contain the configuration files

    /etc/httpd/conf/httpd.conf is the main configuration file, which includes various other configuration files

    # Uncomment to enable virtual hosts:
    Include conf/extra/httpd-vhosts.conf

    /etc/httpd/conf/extra/httpd-default.conf contains default settings

    # To hide server information like Apache and PHP versions:
    ServerTokens Prod
    # To turn off your server's signature:
    ServerSignature Off

    PHP

    sudo pacman -S php php-apache install PHP

    # Comment this line:
    #LoadModule mpm_event_module modules/mod_mpm_event.so
    # Uncomment this line:
    LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
    
    # Place this at the end of the LoadModule list:
    LoadModule php_module modules/libphp.so
    AddHandler php-script .php
    
    # Place this at the end of the Include list:
    Include conf/extra/php_module.conf
    

    To test whether PHP was correctly configured:

    Virtual hosts

    <VirtualHost *:80>
        ServerName *example.com*
        ServerAlias *www.example.com*
        ServerAdmin *example*@*example.com*
        DocumentRoot /srv/http/*example*
    
        ErrorLog /var/log/httpd/*example*-error.log
        CustomLog /var/log/httpd/*example*-access.log combined
    </VirtualHost>
    

    User directories

    User directories are available by default through http://localhost/~*username* and show the contents of ~/public_html (this can be changed in /etc/httpd/conf/extra/httpd-userdir.conf).

    mkdir $HOME/public_html

    touch $HOME/public_html/index.html

    chown user:http $HOME $HOME/public_html $HOME/public_html/index.html

    chmod 750 $HOME $HOME/public_html $HOME/public_html/index.html give only read (descend into) permission to the web server user for the home directory and the user directory

    TLS

    ServerName www.example.com
    
    # Uncomment:
    LoadModule ssl_module modules/mod_ssl.so
    LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
    # Secure (SSL/TLS) connections
    Include conf/extra/httpd-ssl.conf

    Set up an HTTP-to-HTTPS redirection to force HTTPS:

    <VirtualHost *:80 [::]:80>
        # Redirect all traffic to HTTPS
        Redirect permanent / <https://example.com/>

    Certbot

    The plugin certbot-apache provides an automatic configuration for the Apache HTTP Server. This plugin will try to detect the configuration setup for each domain. The plugin adds extra configuration recommended for security, settings for certificate use, and paths to Certbot certificates.

    certbot comes with a systemd certbot-renew.service, which attempts to renew certificates that expire in less than 30 days. If all certificates are not due for renewal, this service does nothing.

    sudo cp -r /etc/httpd/conf /etc/httpd/conf.bak backup configuration files

    # Uncomment:
    LoadModule rewrite_module modules/mod_rewrite.so

    sudo pacman -S certbot-apache install plugin

    sudo certbot --apache get a certificate and configure Apache automatically

    sudo chmod 700 /etc/letsencrypt/archive

    sudo chmod 755 /etc/letsencrypt/live

    sudo chmod 600 /etc/letsencrypt/live/example.com/privkey.pem

    sudo systemctl restart httpd

    Usage

    sudo systemctl start httpd.service run Apache

    httpd

    • -M dump a list of loaded static and shared modules
    • -t run syntax tests for configuration files only
    • -S show the settings as parsed from the config file (currently only shows the virtualhost settings)

    sudo apachectl configtest run a configuration file syntax test. It parses the configuration files and either reports Syntax Ok or detailed information about the particular syntax error. This is equivalent to apachectl -t.

    WordPress installation

    We are now ready to proceed with the last layer of the LAMP stack: WordPress itself.

    But we first need to tweak some configuration files for Apache and PHP.

    Apache

    Enable the Apache module unique_id_module that provides a magic token for each request guaranteed to be unique across all requests.

    # Uncomment:
    LoadModule unique_id_module modules/mod_unique_id.so
    LoadModule rewrite_module modules/mod_rewrite.so
    Alias /wordpress "/srv/http/wordpress"
    <Directory "/srv/http/wordpress">
            AllowOverride All
            Options FollowSymlinks
            Require all granted
    </Directory>

    PHP

    sudo pacman -S php-gd WordPress needs php-gd to modify images

    # Uncomment:
    extension=gd
    extension=mysqli
    
    # Change the maximum upload file size of the media library
    ; Maximum allowed size for uploaded files.
    upload_max_filesize = 64M
    ; Maximum size of POST data that PHP will accept.
    post_max_size = 64M

    MariaDB

    sudo pacman -S mariadb

    sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

    sudo systemctl start mariadb.service

    sudo mariadb-secure-installation MariaDB installation with a number of recommended security measures, such as removing anonymous accounts and removing the test database

    sudo mariadb -u root -p login as root, and enter the commands:

    CREATE DATABASE wordpress;
    GRANT ALL PRIVILEGES ON wordpress.* TO "example-user"@"localhost" IDENTIFIED BY "example_password";
    FLUSH PRIVILEGES;
    EXIT
    

    WordPress

    OK, now everything is ready to install WordPress. The process is relatively easy and just involves downloading a compressed file that contains WordPress, uncompressing the file, change form configuration in a file, and completing the installation in a browser.

    cd /srv/http

    sudo wget <https://wordpress.org/latest.tar.gz

    sudo tar xvzf latest.tar.gz

    sudo rm latest.tar.gz

    sudo chown -R http:http /srv/http/wordpress

    cd wordpress

    sudo cp wp-config-sample.php wp-config.php

    sudo nano /srv/http/wordpress/wp-config.php set the database details in the configuration file:

    define( 'DB_NAME', 'wordpress' );
    define( 'DB_USER', 'example-user' );
    define( 'DB_PASSWORD', 'example-password' );
    
    /* Add any custom values between this line and the "stop editing" line. */
    
    /* to be added if <http://192.168.178.2/wordpress/wp-admin> redirects to <http://localhost/wordpress/wp-login.php?redirect_to=http%3A%2F%2F192.168.178.2%2Fwordpress%2Fwp-admin%2F&reauth=1> */
    if (isset($_SERVER['HTTP_HOST'])) {
        $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
        define('WP_HOME', $protocol . $_SERVER['HTTP_HOST']);
        define('WP_SITEURL', $protocol . $_SERVER['HTTP_HOST']);
    }

    Go to http://localhost/wordpress to finish the installation.

    http://localhost/wordpress/wp-admin admin page