nginx tips
基本的 HTTP 登录认证可使用 ngx_http_auth_basic_module 实现, 参考 http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html
基本的配置:
auth_basic "login please";
auth_basic_user_file htpasswd;
htpasswd 文件内容:
q:{PLAIN}q:my custom user, `curl -u qq:qq 8000.sv.tyio.net` or `curl q:q@8000.sv.tyio.net`
qq:qqPwfUusmauWo:
w::has no password
ctypt 密码可用 perl 脚本生成:
#!/usr/bin/perl
use strict;
my $pw = $ARGV[0];
print crypt($pw, $pw)."\n";
为了搞长轮询, 可以设置 proxy_read_timeout 长一点, 默认好像是 120 秒,
server {
server_name 8000.*;
location / {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8080;
}
}
server {
server_name supervisor-notebook.*;
location / {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://unix:/home/q/etc/.supervisor.sock;
}
}
# 负载均衡
upstream frontends {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}
server {
server_name multi-backend.*;
location / {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://frontends;
}
}
# websocket 反向代理
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
server_name notebook.*;
location / {
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://localhost:8888;
}
}
# 只允许客户端 8.8.8.8 通过 指定的 g.cn:80 访问,其余 IP 不符或不是通过指定域名:80 访问都禁止
server {
listen 80;
server_name g.cn;
location / {
allow 8.8.8.8;
deny all;
proxy_pass http://localhost:65535;
}
}
server {
listen 80 default;
location / {
deny all;
}
}
利用 autoindex 模块, 可以做一个文件服务器, 参考 http://nginx.org/en/docs/http/ngx_http_autoindex_module.html
例子:
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
location 匹配规则
~ 波浪线表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
^~ 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
= 进行普通字符精确匹配
@ "@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location 匹配的优先级(与location在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。
location = / {
# 只匹配"/".
[ configuration A ]
}
location / {
# 匹配任何请求,因为所有请求都是以"/"开始
# 但是更长字符匹配或者正则表达式匹配会优先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以 gif, jpg, or jpeg结尾的请求.
# 但是所有 /images/ 目录的请求将由 [Configuration C]处理.
[ configuration D ]
}
避免浏览器自动播放文件
有时对于图片、视频,浏览器会视能力,自动为用户显示或播放。这主要是由于Web服务器在返回文件本身数据的同时,返回了一些特殊的MIME类型,比如:image/jpeg(JPEG图像),application/pdf(PDF文档),video/mpeg(MPEG动画)。这些MIMIE类型实际上是告诉浏览器,文件数据到底是什么,这样浏览器就能更好的为用户展示数据。现在像图片、pdf、甚至是视频基本都是可以直接在浏览器中展示和播放的。但是有时,我们需要浏览器为用户下载文件而不是直接播放,而Nginx在默认配置下,会根据文件的后缀来匹配相应的MIME类型,并写入Response header,导致浏览器播放文件而不是下载,这时需要通过配置让Nginx返回的MIME类型为下面这个类型:
application/octet-stream
这个类型会让浏览器认为响应是普通的文件流,并提示用户下载文件。可以通过在Nginx的配置文件中做如下配置达到这样的目的:
location /download/ {
types { }
default_type application/octet-stream;
}
这样当Url路径中包含/download/时,MIME类型会被重置为application/octet-stream。另外,nginx自带的MIME类型映射表保存在conf/mime.types中。
文件上传大小限制放开
有的时候后端的Web-Server提供文件上传的服务,但是如果前端使用Nginx做反向代理时,会出现文件无法上传的问题,这可能是由于Ngxin默认对客户端请求的body的限制。因为,默认情况下Nginx对客户端请求的大小限制是1m,而上传的文件往往超过1m。可以通过修改如下配置项,来放宽这个限制:
client_max_body_size 10m;
将这个值设置为0,可以取消这个限制, 详见 client_max_body_size