Title: NGinx Proxy &gt; Nginx WordPress Multisite
Last modified: February 14, 2019

---

# NGinx Proxy > Nginx WordPress Multisite

 *  [hellman.c](https://wordpress.org/support/users/hellmanc/)
 * (@hellmanc)
 * [7 years, 3 months ago](https://wordpress.org/support/topic/nginx-proxy-nginx-wordpress-multisite/)
 * i having trouble to set up a subdir multisite after following [https://codex.wordpress.org/Nginx](https://codex.wordpress.org/Nginx).
 *     ```
       Error msg 
       nginx: [emerg] "map" directive is not allowed here in /etc/nginx/conf.d/global/wordpress-ms-subdir.conf:4
       nginx: configuration file /etc/nginx/nginx.conf test failed
   
       and i can´t find the error but i am still getting the same error.
   
       proxy Server - nginx/sites-enabled/multi.ledtec.conf
   
       <blockquote>server {
           listen 80 ;
           listen [::]:80 ;
           server_name multi.ledtec.se;
   
       # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
           return 301 https://$host$request_uri;
       }
   
       server {
           listen 443 ssl http2;
           listen [::]:443 ssl http2;
           server_name multi.ledtec.se;
           # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
           ssl_certificate /etc/letsencrypt/live/multi.ledtec.se/fullchain.pem; # managed by Certbot
           ssl_certificate_key /etc/letsencrypt/live/multi.ledtec.se/privkey.pem; # managed by Certbot
           ssl_session_timeout 1d;
           ssl_session_cache shared:SSL:50m;
           ssl_session_tickets off;
   
           # modern configuration. tweak to your needs.
           ssl_protocols TLSv1.2;
           ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY$
           ssl_prefer_server_ciphers on;
   
           # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
           add_header Strict-Transport-Security max-age=15768000;
   
           # OCSP Stapling ---
           # fetch OCSP records from URL in ssl_certificate and cache them
           ssl_stapling on;
           ssl_stapling_verify on;
   
           ## verify chain of trust of OCSP response using Root CA and Intermediate certs
           ssl_trusted_certificate /etc/letsencrypt/live/multi.ledtec.se/fullchain.pem;
   
          # resolver <IP DNS resolver>;
   
               location / {
               proxy_pass http://192.168.1.24;
               include /etc/nginx/proxy_params;
               proxy_set_header X-Real-IP $remote_addr;
           }
   
       }
       </blockquote>
   
       Wordpress Server
       Nginx.conf
   
       <blockquote># Generic startup file.
       user www-data;
   
       #usually equal to number of CPUs you have. run command "grep processor /proc/cpuinfo | wc -l" to find it
       worker_processes  auto;
       worker_cpu_affinity auto;
   
       error_log  /var/log/nginx/error.log;
       pid        /var/run/nginx.pid;
   
       # Keeps the logs free of messages about not being able to bind().
       #daemon     off;
   
       events {
               worker_connections  1024;
       }
   
       http {
               # this section is needed to proxy web-socket connections
                   map $http_upgrade $connection_upgrade {
                           default upgrade;
                             ''      close;
                   }
   
       #       rewrite_log on;
   
               include mime.types;
               default_type       application/octet-stream;
               access_log         /var/log/nginx/access.log;
               sendfile           on;
       #       tcp_nopush         on;
               keepalive_timeout  3;
       #       tcp_nodelay        on;
       #       gzip               on;
               #php max upload limit cannot be larger than this
               client_max_body_size 13m;
               index              index.php index.html index.htm;
   
               # Upstream to abstract backend connection(s) for PHP.
               upstream php {
                       #this should match value of "listen" directive in php-fpm pool
                       server unix:/tmp/php-fpm.sock;
       #               server 127.0.0.1:9000;
               }
   
               include sites-enabled/*;
       }
       </blockquote>
   
       Wordpress Server
       Sites-enable/multi.conf
       <blockquote># Redirect everything to the main site. We use a separate server statement and NOT an if statement - see http://wiki.nginx.org/I$
   
       server {
               server_name  _;
               return 302 $scheme://example.com$request_uri;
       }
   
       server {
               server_name example.com;
               root /var/www/wordpress;
   
               index index.php;
   
               include conf.d/global/restrictions.conf;
   
               # Additional rules go here.
   
               # Only include one of the files below.
       #       include conf.d/global/wordpress.conf;
               include conf.d/global/wordpress-ms-subdir.conf;
       #       include global/wordpress-ms-subdomain.conf;
       }
       </blockquote>
   
       Wordpress Server
       conf.d/global/restrictions.conf
   
       <blockquote># Global restrictions configuration file.
       # Designed to be included in any server {} block.
       location = /favicon.ico {
               log_not_found off;
               access_log off;
       }
       # robots.txt fallback to index.php
       location = /robots.txt {
       # Some WordPress plugin gererate robots.txt file
           allow all;
           try_files $uri $uri/ /index.php?$args @robots;
           access_log off;
           log_not_found off;
       }
       # additional fallback if robots.txt doesn't exist
       location @robots {
          return 200 "User-agent: *\nDisallow: /wp-admin/\nAllow: /wp-admin/admin-ajax.php\n";
       }
   
       # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac) excepted .well-known directory.
       # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban)
       location ~ /\.(?!well-known\/) {
           deny all;
       }
   
       # Deny access to any files with a .php extension in the uploads directory for the single site
       location /wp-content/uploads {
           location ~ \.php$ {
               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;
       }
       </blockquote>
   
       Wordpress server
       conf.d/global/wordpress-ms-subdir.conf
   
       <blockquote>
   
       # WordPress multisite subdirectory rules.
       # Designed to be included in any server {} block.
   
       map $uri $blogname{
           ~^(?P<blogpath>/[^/]+/)files/(.*)       $blogpath ;
       }
   
       map $blogname $blogid{
           default -999;
   
           #Ref: http://wordpress.org/extend/plugins/nginx-helper/
           include /var/www/wordpress/wp-content/plugins/nginx-helper/map.conf ;
       }
   
       server {
           server_name example.com ;
   
           root /var/www/wordpress;
           index index.php;
   
           location ~ ^(/[^/]+/)?files/(.+) {
               try_files /wp-content/blogs.dir/$blogid/files/$2 /wp-includes/ms-files.php?file=$2 ;
               access_log off;     log_not_found off; expires max;
           }
   
           #avoid php readfile()
           location ^~ /blogs.dir {
               internal;
               alias /var/www/wordpress/wp-content/blogs.dir ;
               access_log off;     log_not_found off; expires max;
           }
   
           if (!-e $request_filename) {
               # Don't use <code>$uri</code> here, see https://github.com/yandex/gixy/issues/77
               rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
               rewrite ^(/[^/]+)?(/wp-.*) $2 last;
               rewrite ^(/[^/]+)?(/.*\.php) $2 last;
           }
   
           location / {
               try_files $uri $uri/ /index.php?$args ;
           }
   
           location ~ \.php$ {
               try_files $uri =404;
               include fastcgi_params;
               fastcgi_pass php;
           }
   
           #add some rules for static content expiry-headers here
       }
   
       </blockquote>
       ```
   
    -  This topic was modified 7 years, 3 months ago by [Jan Dembowski](https://wordpress.org/support/users/jdembowski/).
    -  This topic was modified 7 years, 3 months ago by [Jan Dembowski](https://wordpress.org/support/users/jdembowski/).
 * The page I need help with: _[[log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fwordpress.org%2Fsupport%2Ftopic%2Fnginx-proxy-nginx-wordpress-multisite%2F%3Foutput_format%3Dmd&locale=en_US)
   to see the link]_

Viewing 1 replies (of 1 total)

 *  [Dion](https://wordpress.org/support/users/diondesigns/)
 * (@diondesigns)
 * [7 years, 3 months ago](https://wordpress.org/support/topic/nginx-proxy-nginx-wordpress-multisite/#post-11206717)
 * This really has nothing to do with WordPress, other than mentioning that nginx
   doesn’t support .htaccess files, which are extensively used by WordPress. You
   might want to ask your question on stackexchange or serverfault.

Viewing 1 replies (of 1 total)

The topic ‘NGinx Proxy > Nginx WordPress Multisite’ is closed to new replies.

 * In: [Localhost Installs](https://wordpress.org/support/forum/localhost-installs/)
 * 1 reply
 * 2 participants
 * Last reply from: [Dion](https://wordpress.org/support/users/diondesigns/)
 * Last activity: [7 years, 3 months ago](https://wordpress.org/support/topic/nginx-proxy-nginx-wordpress-multisite/#post-11206717)
 * Status: not resolved

## Topics

### Topics with no replies

### Non-support topics

### Resolved topics

### Unresolved topics

### All topics
