• Hello everybody. I’m having a heck of a time installing multisite WordPress. I have been working on it for about 2 weeks and have hit a number of errors. I’ve perused forums, blogs and help articles, trying any suggestion available. Progress has been made, but it’s not working in its entirety, yet.

    URL Info
    https://www.draggoo.com
    https://www.draggoo.com/~kevin
    https://www.draggoo.com/wordpress
    https://www.draggoo.com/wordpress/kevin
    Each family member will have their own blog, which is why we have multisite set up. In theory, we could have the following:
    https://www.draggoo.com/wordpress/sarah
    etc.

    Environment
    Gentoo nginx MariaDB WordPress
    nginx configuration file is in:
    /etc/nginx/nginx.cong
    root example.com folder is in:
    /var/www/localhost/htdocs
    WordPress is installed in:
    /var/www/localhost/htdocs/wordpress

    Current Problem
    https://www.draggoo.com/wordpress/kevin doesn’t have any formatting
    https://www.draggoo.com/wordpress/kevin/wp-admin/ shows to many redirects

    Other Current Behaviors
    https://www.draggoo.com works
    https://www.draggoo.com/~kevin works
    https://www.draggoo.com/wordpress works
    https://www.draggoo.com/wordpress/wp-admin works

    Notes
    I don’t care about Draggoo.com. It currently has a link to the wordpress site, and that’s it.
    I also don’t care about Draggoo.com/~kevin . I built it over 10 years ago using iWeb. It’s there for archiving purposes.

    Files
    (Sensitive information has been stripped)
    (I hope the formatting turns out okay.)

    nginx.conf

    user nginx nginx;
    worker_processes 1;
    
    error_log /var/log/nginx/error_log info;
    
    events {
            worker_connections 1024;
            use epoll;
    }
    
    http {
            include /etc/nginx/mime.types;
            default_type application/octet-stream;
    
            log_format main
                    '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '"$gzip_ratio"';
    
            client_header_timeout 10m;
            client_body_timeout 10m;
            send_timeout 10m;
    
            connection_pool_size 256;
            client_header_buffer_size 1k;
            large_client_header_buffers 4 2k;
            request_pool_size 4k;
    
            gzip off;
    
            output_buffers 1 32k;
            postpone_output 1460;
    
            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
    
            keepalive_timeout 75 20;
    
            ignore_invalid_headers on;
    
            map $uri $blogname{
                    ~^(?P<blogpath>/[^/]+/)files/(.*)       $blogpath ;
            }
    
            map $blogname $blogid{
                    default -999;
                    kevin 2;
    
                    #Ref: http://wordpress.org/extend/plugins/nginx-helper/
                    #include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
            }
    
            # Redirects all http requests to https
            server {
                    listen 80;
                    listen [::]:80;
                    server_name draggoo.com www.draggoo.com;
                    return 301 https://www.draggoo.com$request_uri;
            }
    
            # WED-
            # Adding this to redirect all non-www.-having URLs to www.
            server {
                    listen               443 ssl;
                    server_name          draggoo.com;
                    ssl_certificate      xxx.crt;
                    ssl_certificate_key  xxx.key;
    
                    return 301 https://www.draggoo.com$request_uri;
            }
    
            # Server settings for all https requests
            server {
    
                    # http ports and URLs these server details will apply to
                    # listen 127.0.0.1;
                    # listen 443 ssl http2;
                    listen 443;
    
                    # List of server names 
                    server_name www.draggoo.com;
    
                    # SSL config - See https://www.bjornjohansen.com/securing-nginx-ssl for reference
                    ssl_certificate xxx.crt;
                    ssl_certificate_key xxx.key;
                    ssl_session_cache shared:SSL:20m;
                    ssl_session_timeout 180m;
                    ssl_protocols TLSv1.2 TLSv1.3; #TLS v1.0 and v1.1 were deprecated in 2020
                    ssl_prefer_server_ciphers on;
                    ssl_ciphers xxx;
                    ssl_dhparam xxx.pem;
                    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
                    # Location of log files
                    access_log /var/log/nginx/localhost.access_log main;
                    error_log /var/log/nginx/localhost.error_log debug;
                    rewrite_log on;
    
                    # Location of files for draggoo.com site 
                    root /var/www/localhost/htdocs;
    
                    include global/restrictions.conf;
    
                    location ~ ^/~(.+?)(/.*)?$ {
    
                            # Location of files for any URI that starts with a tilde (~) (ex: draggoo.com/~kevin will use files from /home/kevin/public_html/
                            alias /home/$1/public_html$2;
    
                    }
    
                    location ~ ^(/[^/]+)?/files/(.+) {
                            try_files /wordpress/wp-content/blogs.dir/$blogid/files/$2 /wordpress/wp-includes/ms-files.php?file=$2 ;
                            access_log off;     log_not_found off; expires max;
                    }
    
                    #avoid php readfile()
                    location ^~ /wordpress/blogs.dir {
                            internal;
                            alias /var/www/localhost/htdocs/wordpress/wp-content/blogs.dir ;
                            access_log off;     log_not_found off; expires max;
                    }
    
                    if (!-e $request_filename) {
                            rewrite /wp-admin$ $scheme://$host/wordpress$uri/ permanent;
                            rewrite ^(/[^/]+)?(/wp-.*) /wordpress$2 last;
                            rewrite ^(/[^/]+)?(/.*\.php) /wordpress$2 last;
                    }
    
    #               location @wp {
    #                       rewrite ^/wordpress(.*) /wordpress/index.php?$1;
    #               }
    
                    location ^~ /wordpress {
                            index index.php index.html index.htm;
                            try_files $uri $uri/ /wordpress/index.php?$args;
    
                            location ~ \.php$ {
                                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
                                    include /etc/nginx/fastcgi.conf;
    #                               include fastcgi_params;
                                    try_files $uri =404;
                                    fastcgi_pass unix:/run/php-fpm.socket;
                            }
                    }
    
                    location / {
                            try_files $uri $uri/ /wordpress/index.php?$args ;
                    }
    
                    location ~ \.php$ {
                            include /etc/nginx/fastcgi.conf;
                            try_files $uri =404;
                            fastcgi_pass unix:/run/php-fpm.socket;
                    }
            }
    }

    restrictions.conf

    # Global restrictions configuration file.
    # Designed to be included in any server {} block.
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
     
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
     
    # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
    # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
    location ~ /\/\. {
        deny all;
    }
     
    # Deny access to any files with a .php extension in the uploads directory
    # Works in sub-directory installs and also in multisite network
    # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }

    wp-config.php

    <?php
    /**
     * The base configuration for WordPress
     *
     * The wp-config.php creation script uses this file during the
     * installation. You don't have to use the web site, you can
     * copy this file to "wp-config.php" and fill in the values.
     *
     * This file contains the following configurations:
     *
     * * MySQL settings
     * * Secret keys
     * * Database table prefix
     * * ABSPATH
     *
     * @link https://wordpress.org/support/article/editing-wp-config-php/
     *
     * @package WordPress
     */
    
    // ** MySQL settings - You can get this info from your web host ** //
    /** The name of the database for WordPress */
    define( 'DB_NAME', 'wordpress' );
    
    /** MySQL database username */
    define( 'DB_USER', 'xxx' );
    
    /** MySQL database password */
    define( 'DB_PASSWORD', 'xxx' );
    
    /** MySQL hostname */
    define( 'DB_HOST', 'localhost' );
    
    /** Database Charset to use in creating database tables. */
    define( 'DB_CHARSET', 'utf8' );
    
    /** The Database Collate type. Don't change this if in doubt. */
    define( 'DB_COLLATE', '' );
    
    /**#@+
     * Authentication Unique Keys and Salts.
     *
     * Change these to different unique phrases!
     * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
     * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
     *
     * @since 2.6.0
     */
    define( 'AUTH_KEY',         'xxx' );
    define( 'SECURE_AUTH_KEY',  'xxx' );
    define( 'LOGGED_IN_KEY',    'xxx' );
    define( 'NONCE_KEY',        'xxx' );
    define( 'AUTH_SALT',        'xxx' );
    define( 'SECURE_AUTH_SALT', 'xxx' );
    define( 'LOGGED_IN_SALT',   'xxx' );
    define( 'NONCE_SALT',       'xxx' );
    
    /**#@-*/
    
    /**
     * WordPress Database Table prefix.
     *
     * You can have multiple installations in one database if you give each
     * a unique prefix. Only numbers, letters, and underscores please!
     */
    $table_prefix = 'wp_';
    
    /**
     * For developers: WordPress debugging mode.
     *
     * Change this to true to enable the display of notices during development.
     * It is strongly recommended that plugin and theme developers use WP_DEBUG
     * in their development environments.
     *
     * For information on other constants that can be used for debugging,
     * visit the documentation.
     *
     * @link https://wordpress.org/support/article/debugging-in-wordpress/
     */
    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', '/tmp/wp-debug.log');
    
    /* URL Locations */
    
    /* Always use HTTPS */
    $_SERVER['HTTPS']='on';
    
    /** SSL */   
    define('FORCE_SSL_ADMIN', true);
    
    /* Multisite */
    define('WP_ALLOW_MULTISITE', true);
    define('MULTISITE', true);
    define('SUBDOMAIN_INSTALL', false);
    define('DOMAIN_CURRENT_SITE', 'www.draggoo.com');
    define('PATH_CURRENT_SITE', '/wordpress/');
    define('SITE_ID_CURRENT_SITE', 1);
    define('BLOG_ID_CURRENT_SITE', 1);
    
    /* That's all, stop editing! Happy publishing. */
    
    /** Absolute path to the WordPress directory. */
    if ( ! defined( 'ABSPATH' ) ) {
            define( 'ABSPATH', __DIR__ . '/' );
    }
    
    /** Sets up WordPress vars and included files. */
    require_once ABSPATH . 'wp-settings.php';
    

    db.wp_options.home

    MariaDB [wordpress]> select * from wp_options where option_name = 'home';
    +-----------+-------------+-----------------------------------+----------+
    | option_id | option_name | option_value                      | autoload |
    +-----------+-------------+-----------------------------------+----------+
    |         2 | home        | https://www.draggoo.com/wordpress | yes      |
    +-----------+-------------+-----------------------------------+----------+
    1 row in set (0.000 sec)

    db.wp_2_options.home

    MariaDB [wordpress]> select * from wp_2_options where option_name = 'home';
    +-----------+-------------+-----------------------------------------+----------+
    | option_id | option_name | option_value                            | autoload |
    +-----------+-------------+-----------------------------------------+----------+
    |         2 | home        | https://www.draggoo.com/wordpress/kevin | yes      |
    +-----------+-------------+-----------------------------------------+----------+
    1 row in set (0.000 sec)

    db.wp_options.siteurl

    MariaDB [wordpress]> select * from wp_options where option_name = 'siteurl';
    +-----------+-------------+-----------------------------------+----------+
    | option_id | option_name | option_value                      | autoload |
    +-----------+-------------+-----------------------------------+----------+
    |         1 | siteurl     | https://www.draggoo.com/wordpress | yes      |
    +-----------+-------------+-----------------------------------+----------+
    1 row in set (0.000 sec)

    db.wp_2_options.siteurl

    MariaDB [wordpress]> select * from wp_2_options where option_name = 'siteurl';
    +-----------+-------------+-----------------------------------------+----------+
    | option_id | option_name | option_value                            | autoload |
    +-----------+-------------+-----------------------------------------+----------+
    |         1 | siteurl     | https://www.draggoo.com/wordpress/kevin | yes      |
    +-----------+-------------+-----------------------------------------+----------+
    1 row in set (0.000 sec)

    db.wp_blogs

    MariaDB [wordpress]> select * from wp_blogs;
    +---------+---------+-----------------+-------------------+---------------------+---------------------+--------+----------+--------+------+---------+---------+
    | blog_id | site_id | domain          | path              | registered          | last_updated        | public | archived | mature | spam | deleted | lang_id |
    +---------+---------+-----------------+-------------------+---------------------+---------------------+--------+----------+--------+------+---------+---------+
    |       1 |       1 | www.draggoo.com | /wordpress/       | 2020-06-04 23:52:39 | 0000-00-00 00:00:00 |      1 |        0 |      0 |    0 |       0 |       0 |
    |       2 |       1 | www.draggoo.com | /wordpress/kevin/ | 2020-06-15 03:30:50 | 2020-06-15 03:30:50 |      1 |        0 |      0 |    0 |       0 |       0 |
    +---------+---------+-----------------+-------------------+---------------------+---------------------+--------+----------+--------+------+---------+---------+
    2 rows in set (0.000 sec)

    .htaccess
    I deleted this file since I’m using nginx.

    Final Thoughts
    I prefer to know the “why” for changes instead of blindly trying different options, though I’m not opposed to suggestions based on experience.
    And thank you in advance for your help!

    ~Kevin

    The page I need help with: [log in to see the link]

Viewing 1 replies (of 1 total)
  • I don’t recommend running a multisite on anything but Apache… Save the Nginx for a reverse proxy if you wish.

    But that’s my opinion and with that said…

    Since you are using Nginx I do hope you placed the equivalent htaccess directives into the Nginx configuration.

    I also recommend the WordPress be in the server root for that domain name to reduce the complexity of the rewrites needed. I also like the second method of running WordPress in its own directory and I do prefer that for my own multisites. It’s cleaner!

    https://wordpress.org/support/article/giving-wordpress-its-own-directory/

    The domains under ’tilde names’ probably need special handling and redirects or something… that’s just not something I feel we can deal with here on these forums but I’m sure there’s an Nginx server Guru who could help you with that part on some other forums. Maybe StackExchange?

    My thoughts would be to drop the tilde named sites into a subdirectory or an htaccess type directive (munged to work with Nginx) to then redirect to the WordPress via a meta refresh but that would just be a kludge solution as I can’t think of an elegant answer to that problem.

Viewing 1 replies (of 1 total)
  • The topic ‘WordPress Multisite Subdirectory Errors: 500, Too Many Redirects, 404, etc.’ is closed to new replies.