1
0
dwelling-home/web/articles/nginx_recipes_and_tips.md

71 lines
3.4 KiB
Markdown
Raw Normal View History

### Contents
1. [Introduction](#art-1)
2. [Userdir functionality like Apache's mod_userdir](#art-2)
3. [Note on how NGiNX works with HTTP headers](#art-3)
4. [Tell a Tor visitor of your clearnet site that you have an onion](#art-4)
5. [Variables](#art-5)
### 1. Introduction {#art-1}
Here I'll place recipes for implementing different functionalities and notes on webserver's behaviour.
### 2. Userdir functionality like Apache's mod_userdir {#art-2}
Once I wanted to have a “tilde user directories” like `/~user/` which is more known as Apache's `mod_userdir` feature. I work with NGiNX so regular expressions is the way to do that.
Nothing special in my case. I only need to keep files there, so others may get them. Thing is simple, but I took some time to realise what regexp to use here back then.
The implementation is quite simple:
location ~ ^/~(.+?)(/.*)?$ {
alias /home/$1/pub$2;
autoindex on;
}
Of course, you can choose whatever place for user's public directories. In my case you need to give a read and execute permissions to user's home directory and to public directories inside them to others (`chmod o=rX /home/user`), which may be a security concern.
`autoindex on` will make an index of files that lies by URL. And, of course, you can put there an `index.html` file.
### 3. Note on how NGiNX works with HTTP headers {#art-3}
Let's say in `http` block you specified common headers like `X-Frame-Options`, `X-XSS-Protection`, and so on for all `server` directives to use. But, if you add some other header for a specific `server` or `location` block then all those headers would be dropped.
For now the only cure for it is to place all that headers in a separate file like `common-headers.inc` and using `include` directive to include them in all the `server` and `location` blocks where additional headers are added.
### 4. Tell a Tor visitor of your clearnet site that you have an onion {#art-4}
There is a custom HTTP header `Onion-Location` that is being recognised by Tor Browser and it will show a ".onion available" button in an address bar.
The code for NGiNX is this simple:
add_header Onion-Location http://yoursite.onion$request_uri;
### 5. Variables {#art-5}
Just wanna tell about this cool feature you can use to reduce code repetition. Alas, you can use them only in `server`, `location` and `if` blocks. If only they could be declared in a `http` block, they'd be perfect. But still, they help a lot.
I heavily use aliases pointing to directories within the same base directory.
Judging from a little testing, variables doesn't decrease performance. Or I just don't notice it.
Variables could only store strings. To demonstrate the usage I'll just post here a part of my config:
set $root /srv/http/dwelling;
...
location =/favicon.ico {
alias $root/shared/static/img/favicon.ico;
}
...
location /assets/ {
alias $root/homepage/static/assets/;
}
The very reason why I had to use variables is that `alias` doesn't work with relative paths. I wish `alias` could be relative to `root`, but we are forced to look for workarounds.
Update: Oh, I realised that you can declare variables in `http` block using `map` directive with `default` set to value you need. Funny, I've been using `map` to prevent LAN IPs from being logged all this time, heh. So, here's example:
map 1 $root {
default /srv/http/dwelling;
}