Merge directory listing for 2 different folders nginx - nginx

I have 2 folders like folder-a and folder-b and they are shown as part of the Nginx file explorer.
I have my Nginx file below. I have a problem statement like folder-a and folder-b sometimes share common sub-directory with different content like
folder-a->sub-folder->1.txt
folder-b->sub-folder->2.txt
so when the user is viewing folder folder-a->sub-folder or folder-b>sub-folder he should be able to see both 1.txt and 2.txt i.e. it should feel like a unified view. Can I achieve this is nginx?
worker_processes 1;
events { worker_connections 1024; }
http {
include /etc/nginx/mime.types;
server {
server_name localhost;
listen 80;
root /usr/share/nginx/html;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
location ~ ^/folder-a/(.+)$ {
error_page 404 #redirect;
}
location #redirect {
return 301 /folder-b/$1;
}
}
}

Not tested but as we can specify the output format of the autoindex there may be solutions / configuration to print create a new directory listing.
http://nginx.org/en/docs/http/ngx_http_autoindex_module.html
But it will always "print / show" the current folders content. Given that if you want to combine the filelist of two different folders njs could help here.
Something like a server that is configured with autoindex = on and a useable format like json or xml. njs could query both directories and reconstruct a new output (xml, json).
Not tested just a fancy idea.

Related

How to route different webservers to different URL using nginx

creating a website for my self and need to host projects.
Basically, i hhave different projects with different framework. ie, Flask, Django, Node.JS and some html file projects. I would like to host them at projects.domain.com/<project name>
I tried to set server_name projects.domain.com/asdf but in error.log it says, server name "projects.domain.com/asdf" has suspicious symbols
Next up, i tried to nest location blocks (which i presume isn't how its supposed to be)
location /asdf {
location /static/ {
root blah blah;
}
location / {
..
proxy_pass http://localhost:3000 ;
}
}
But, this errors out saying location static is outside asdf
Some suggested to alias instead of root in the location /static/ block, but that doesnt work too.
Any help is appreciated :)
First of all a server_name can not contain URI segments. So a hostname or IP should be used as a value.
If you want to mix different local directories and proxy-locations a configuration could look like this.
Notice: Your location URI (/one, /two) will be appended to the root path.
The root directive can be used in every location block to set the document root.
http://nginx.org/en/docs/http/ngx_http_core_module.html#root
This is the reason why alias exists. With alias the location will not be part of the directory path. Check this out:
http://nginx.org/en/docs/http/ngx_http_core_module.html#alias
server {
server_name project.domain.com;
listen 80;
location / {
proxy_pass http://localhost:3000;
}
location /one/ {
alias/var/www/html/project1/;
index index.html;
}
location /two/ {
alias/var/www/html/project2/;
index index.html;
}
}

How can nginx serve static files on a subdirectory and pass the rest to uwsgi?

I've got a directory example.com/data/ that is only served static content at root (i.e. example.com/data/ serves a static webpage, but example.com/data/file is served by a script). I'm using uwsgi to serve the static portion, and have managed to get my script to serve content on its own, but I can't figure out what rules I need to get this behavior because I'm getting an "500 Internal Server Error."
My current (nonworking) configuration looks like:
location = /data/ {
alias /srv/data/index.html;
}
location /data {
gzip off;
include uwsgi_params;
uwsgi_modifier1 9;
uwsgi_pass unix:/run/uwsgi/data.sock;
}
I've tried a few configurations with try_files, but I can't seem to make it work. Do I need to reference one of the directories here differently or use try_files and some named routes somehow?
EDIT: Thanks to #Richard Smith, this configuration works:
location = /data/ {
root /srv/data/;
try_files /index.html =404;
}
location = /data {
gzip off;
include uwsgi_params;
uwsgi_modifier1 9;
uwsgi_pass unix:/run/uwsgi/data.sock;
}

How to set up a websites folder so the Url address outputs as a index of directory

Its a WordPress website using a nginx webservers, we created a folder using FTPS to download/upload files into the new directory, and want the output folder to show like the example link below. Anyone would like to help me out thanks a ton!
[https://i.stack.imgur.com/gCaiD.png]
Directory Listing in NGINX
To enable directory listing, it's as simple as adding this:
autoindex on;
To either a site's NGINX config file (e.g. /etc/nginx/sites-enabled/mysite.com), or in your http NGINX block for it to always occur on all your sites. Here's an example site config from this article:
server {
listen 80;
server_name domain.com www.domain.com;
access_log /var/...........................;
root /path/to/root;
// autoindex on; // put it here for site wide listings
location / {
index index.php index.html index.htm;
}
location /somedir { // Or use location to target particular dirs
autoindex on;
}
}
Fixed: Only had add autoindex on; to the mywebsite.com.conf file.
root /var/www/mywebsite.com/htdocs/;
autoindex on;
Thanks Luke!

nginx - Serve file conditionally without redirection

I'm currently building a multi-domain cms in rails. Since this content is the same until the next change I'd like to do caching via static files.
The public directory with some cached pages of foo.com and baz.com (/ and /asdf in both cases):
public/
assets/
cms.css
sites/
foo.com/
assets/
screen-some-hash.min.css
index.html
asdf/
index.html
baz.com/
assets/
screen-some-hash.min.css
index.html
asdf/
index.html
What I want to do is the following:
redirect www to non-www (works)
If the requests contains a subdomain (cms, admin, whatever):
If the path contains /assets serve the file in public/assets and set the expire stuff to 30d or so. No problem here since /assets = public/assets and public/ is the passenger root.
Everything else: handle it via rails, no special caching or anything required.
For all other requests (meaning no subdomain):
If the path contains /assets serve the file in public/sites/$host$request_uri and set the expire stuff to 30d or so. Everything else: check for public/sites/$host$request_uri or fall back to the rails app.
I have never worked with nginx conditionals other than the www/non-www redirects and don't really know what I have to do for the conditions mentioned above. If at all possible, I don't want to use redirects for the cached stuff (ie redirection to /sites/foo.com/asdf), instead I'd like to have nginx serve this file directly when going to http://foo.com/asdf.
Further: I don't want to hardcode the hostnames as I'd like to handle an unknown amount of domains. I also don't want to use more than a single rails application for this.
Got something that works, not 100% but good enough for now.
server {
listen 80;
server_name *IP*;
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;
}
location ~ ^/(assets)/ {
try_files /sites/$host$uri $uri #passenger;
root /home/cms/app/current/public;
gzip_static on;
expires max;
add_header Cache-Control public;
}
location / {
try_files /sites/$host$uri/index.html /sites/$host$uri $uri #passenger;
root /home/cms/app/current/public;
}
location #passenger {
access_log /home/cms/app/shared/log/access.log;
error_log /home/cms/app/shared/log/error.log;
root /home/cms/app/current/public;
passenger_enabled on;
}
}
For subdomains, this should do the trick:
server {
server_name ~^(?<subdomain>.+)\.example\.com$;
access_log /var/log/nginx/$subdomain/access.log;
location /assets {
expires max;
}
location / {
proxy_pass http://your_rails_app;
}
}
Not really sure about the proxy_pass setting as my only experience with Ruby apps is Gitlab, which I'm running this way. I hope this helps at least a little.
server {
server_name example.com;
location /assets {
root /public/sites/$hostname/$request_uri;
expires max;
}
}
You'll have to add your own settings and play with it a little as I don't have a chance to actually test it now. But it should show you the way.

Subdomain setup nginx

My reviewer24.com.conf file looks like this:
server {
server_name reviewer24.com www.reviewer24.com;
access_log /home/nginx/domains/reviewer24.com/log/access.log combined buffer=32k;
error_log /home/nginx/domains/reviewer24.com/log/error.log;
root /home/nginx/domains/reviewer24.com/public;
location / {
# Enables directory listings when index file not found
#autoindex on;
# Shows file listing times as local time
#autoindex_localtime on;
# Enable for vBulletin usage WITHOUT vbSEO installed
#try_files / /index.php;
}
include /usr/local/nginx/conf/staticfiles.conf;
include /usr/local/nginx/conf/php.conf;
include /usr/local/nginx/conf/drop.conf;
#include /usr/local/nginx/conf/errorpage.conf;
}
I have created a folder "m" and placed a mobile version of the website in it.
What rule should I add to this .conf file so when you go to: http://m.reviewer24.com it will display content from "m" folder?
I would create a new .conf file specifically your mobile site, e.g. in m.reviewer24.com.conf with a new server block then reload your nginx config.
This way if you need to make specific changes to your subdomain configuration, it's easier to manage. Alternatively, you could append the new server block the into your existing config.
You'll also probably want to delegate where the mobile traffic access and error logs are :)
server {
server_name m.reviewer24.com;
access_log /home/nginx/domains/reviewer24.com/log/access.log combined buffer=32k;
error_log /home/nginx/domains/reviewer24.com/log/error.log;
root /home/nginx/domains/reviewer24.com/public/m;
location / {
# Enables directory listings when index file not found
#autoindex on;
# Shows file listing times as local time
#autoindex_localtime on;
# Enable for vBulletin usage WITHOUT vbSEO installed
#try_files / /index.php;
}
include /usr/local/nginx/conf/staticfiles.conf;
include /usr/local/nginx/conf/php.conf;
include /usr/local/nginx/conf/drop.conf;
#include /usr/local/nginx/conf/errorpage.conf;
}

Resources