How to create reverse proxy on Nginx 1.12 with Wordpress subfolders?

February 14, 2018 128 views
Nginx WordPress LEMP Ubuntu 16.04

Hi,

I have a main website http://optshare.com/ and a blog (subfolder) http://optshare.com/blog/. The main and blog are using two differences Wordpress (Multiple Wordpress) with separately databases.

The main website work very well, but the Blog, it too slow and always show 504 Error. I try to fix many many solutions on internet, but it didn't work. so I really need your help to configure nginx again for my main website and blog.

Here is my Nginx default setting:

##
# 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; 
                #access_log /var/log/nginx/blog.access.log;
                #error_log /var/log/nginx/blog.error.log;                
        }

        location ~ /blog/.+\.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;                
                fastcgi_busy_buffers_size 512k;
                fastcgi_buffer_size 512k;
                fastcgi_buffers 16 512k;
                fastcgi_connect_timeout 600;
                fastcgi_send_timeout 600;
                fastcgi_read_timeout 600;
                proxy_connect_timeout       600;
                proxy_send_timeout          600;
                proxy_read_timeout          600;
                send_timeout                600;
        }


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

My host are using:

  • Nginx 1.12
  • PHP 7.0
  • Wordpress 4.9.4
  • Mysql database
  • Ubuntu 16.04

Thank you so much!

1 Answer

I found a solution already, don't need to use reverse proxy, I just add it 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

Have another answer? Share your knowledge.