0

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;
#   }
#}
0

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';
    }
    
0

Thank Bob for your nice help! reverse proxy actually difficult set up for me, I tried it many many times but always show errors. and I found another solution, don't need to use reverse proxy, I just add code bellow to nginx server block

    if (!-e $request_filename) {
            rewrite /wp-admin$ $scheme://$host$uri/ permanent;
            rewrite ^(/[^/]+)?(/wp-.*) $2 last;
            rewrite ^(/[^/]+)?(/.*\.php) $2 last;
    }

for a large site, I think reverse proxy is best solution

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.