Nginx – Error configure nginx multiple subfolders with multi wordpress site

configurationdirectorynginxWordpress

I have problem with configure nginx for mutilple subfolder, I had apply many solutions on serverfault, but it didn't work with my site. My sites are using two wordpress. Main site https://optshare.com, and blog site: https://optshare.com/blog

I create a subfolder blog in root folder /var/www/html/blog

And here is my nginx configure

the main site is working
but the blog site didn't work

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Generally, you will want to move this file somewhere, and start with a clean
# file but keep this around for reference. Or just disable in sites-enabled.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
    listen 80 default_server;
    listen [::]:80 default_server;
        server_name optshare.com www.optshare.com;
        return 301 https://$server_name$request_uri;
}

server {
    # SSL configuration
    #
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;
        include snippets/ssl-optshare.com.conf;
        include snippets/ssl-params.conf;
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Note: You should disable gzip for SSL traffic.
    # See: https://bugs.debian.org/773332
    #
    # Read up on ssl_ciphers to ensure a secure configuration.
    # See: https://bugs.debian.org/765782
    #
    # Self signed certs generated by the ssl-cert package
    # Don't use them in a production server!
    #
    # include snippets/snakeoil.conf;

    root /var/www/html;

    # Add index.php to the list if you are using PHP
    index index.php index.html index.htm index.nginx-debian.html;

    server_name optshare.com www.optshare.com;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        #try_files $uri $uri/ =404;
                try_files $uri $uri/ /index.php$is_args$args;
    }
        location /blog {
                index index.php index.html index.htm;
                try_files $uri $uri/ /blog/index.php$is_args$args;
        }

        location /en {
                index index.php index.html index.htm;
                try_files $uri $uri/ /en/index.php$is_args$args;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;                
        }

        location ~ /\.ht {
                deny all;
        }

        location ~ /.well-known {
                allow all;
        }

        location = /favicon.ico { log_not_found off; access_log off; }
        location = /robots.txt { log_not_found off; access_log off; allow all; }
        location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
                expires max;
                log_not_found off;
        }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #   include snippets/fastcgi-php.conf;
    #
    #   # With php7.0-cgi alone:
    #   fastcgi_pass 127.0.0.1:9000;
    #   # With php7.0-fpm:
    #   fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #   deny all;
    #}
}


# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#   listen 80;
#   listen [::]:80;
#
#   server_name example.com;
#
#   root /var/www/example.com;
#   index index.html;
#
#   location / {
#       try_files $uri $uri/ =404;
#   }
#}

Best Answer

I would setup a reverse proxy and serve the two WordPress websites through it. The logic for this setup would be:

  • In your main vhost file (this will be the the reverse proxy) set the server to listing on public IP with the server_name optopshare.com.
  • Add http->https redirect and SSL handling in there (as you're doing it already).
  • Add two location sections

    location / {
        proxy_set_header X-Original-Request $request_uri;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http:127.0.0.1:8001;
    }
    location /blog/ {
        proxy_set_header X-Original-Request $request_uri;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http:127.0.0.1:8002;
    }
    
  • That's it for the main vhost file.

  • Create a second vhost file with a server that listens on 127.0.0.1:8001 for serving the main WordPress site.

  • Create a third vhost file with a sever that listenes on 127.0.0.1:8002 for serving the /blog WordPress site.

Keep in mind there are some things you have to take care of if serving WordPress behind a reverse proxy, depending on your individual setup. For example:

  • To get WordPress running with SSL behind a reverse proxy you need to add this to your wp-config.file:

    if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
        $_SERVER['HTTPS']='on';
    }