Nginx 配置总结

  • (1) 一些全局配置

user nobody nobody; # 出于安全,无特别要求禁止使用root
worker_processes 4; # 推荐配置为CPU核数
error_log /data/log/nginx/error.log error; #可选
pid /var/run/nginx.pid; # 此路径不建议更改 #windows可以不写

工作模式与连接数上限

events
{
# 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
#epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

  • (2) Location配置

语法规则: location [=||*|^~] /uri/ { … }

= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!和!*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的情况下匹配顺序为:

首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 /

通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

  • (3) ReWrite语法

last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

下面是可以用来判断的表达式:

  • -f和!-f用来判断是否存在文件
  • -d和!-d用来判断是否存在目录
  • -e和!-e用来判断是否存在文件或目录
  • -x和!-x用来判断文件是否可执行
  • (4) Redirect语法
server {
    listen 80;
    server_name start.igrow.cn;
    index index.html index.php;
    root html;
    if ($http_host !~ “^star\.igrow\.cn$&quot {
        rewrite ^(.*) http://star.igrow.cn$1 redirect;
    }
}
  • (5) 防盗链
location ~* \.(gif|jpg|swf)$ {
    valid_referers none blocked start.igrow.cn sta.igrow.cn;
    if ($invalid_referer) {
        rewrite ^/ http://$host/logo.png;
    }
}
  • (6) 根据文件类型设置过期时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
        expires 1h;
        break;
    }
}
  • (7) 禁止访问某个目录
location ~* \.(txt|doc)${
    root /data/www/wwwroot/linuxtone/test;
    deny all;
}
  • (8) gzip
#gzip on|off
gzip  on;

#消息体太小就没必要压缩(这里设置最小范围1K)
gzip_min_length  1024; 

#Nginx做为反向代理的时候启用,
#param:off|expired|no-cache|no-sotre|private|no_last_modified|no_etag|auth|any]
#expample:gzip_proxied no-cache;
#off – 关闭所有的代理结果数据压缩
#expired – 启用压缩,如果header中包含”Expires”头信息
#no-cache – 启用压缩,如果header中包含”Cache-Control:no-cache”头信息
#no-store – 启用压缩,如果header中包含”Cache-Control:no-store”头信息
#private – 启用压缩,如果header中包含”Cache-Control:private”头信息
#no_last_modified – 启用压缩,如果header中包含”Last_Modified”头信息
#no_etag – 启用压缩,如果header中包含“ETag”头信息
#auth – 启用压缩,如果header中包含“Authorization”头信息
#any – 无条件压缩所有结果数据

gzip_proxied     any;

#Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。
gzip_proxied expired no-cache no-store private auth;

#压缩比例,比例越大,压缩时间越长。
#默认是1 
#建议 nginx gzip级别为4
gzip_comp_level  4;

#哪些文件可以被压缩
gzip_types       text/plain text/html text/javascript text/xml text/css application/x-javascript application/xml;

#无视IE6这个笨蛋
gzip_disable  "MSIE [1-6]\.";

有时出现:duplicate MIME type "text/html"
原因一般新版本的nginx是默认对text/html 实施gzip 压缩的,所以只需要找到对应的 gzip_types 配置删除其中的text/html即可。

  • (9) 本地动静分离反向代理

JSP:

location ~ .(jsp|jspx|do)?$ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

php:

location ~ .*\.(php|php5)?$ {
    root  /data/app/test/;
    fastcgi_pass   unix:/var/run/php-fpm/php-cgi.sock;
    fastcgi_index  index.php;
    include fastcgi.conf;
}

负载均衡:

upstream mysvr {
    #weigth参数表示权值,权值越高被分配到的几率越大
    server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口
    server 192.168.8.2x:80  weight=1;
    server 192.168.8.3x:80  weight=6;
}

location ~* /mysvr/ {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://mysvr/$request_uri;    
}
  • (10) http 常见配置
http
{
    include mime.types; #文件扩展名与文件类型映射表
    default_type application/octet-stream; #默认文件类型
    #charset utf-8; #默认编码
    log_format main '$remote_addr,[$time_local],http://$host$request_uri,$status,$content_length,$request_time';
    access_log    /var/log/nginx/access.log;
    server_names_hash_bucket_size 128; #服务器名字的hash表大小
    client_header_buffer_size 32k; #上传文件大小限制
    large_client_header_buffers 4 64k; #设定请求缓
    client_max_body_size 8m; #设定请求缓
    sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改 成off。
    autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
    tcp_nopush on; #防止网络阻塞
    tcp_nodelay on; #防止网络阻塞
    keepalive_timeout 120; #长连接超时时间,单位是秒

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #ssi 相关配置
    #ssi on;
    #ssi_silent_errors on;
    #ssi_types text/shtml;
    #ssi_last_modified on;  #一定要加上这句,就不会返回 ETag 及Last-Modified 头了

    include vhosts/*.conf;
  • (11) 一则多语言实例
location  ~ /([a-zA-Z]+)/{
    if (!-e $request_filename){
        rewrite ^/([a-zA-Z]+)/(.*)$ /en/$2 break;
    }

    #图片资源的缓存策略
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires         30d;
        access_log      off;
    }

    #js、css资源的缓存策略
    location ~ .*\.(js|css)$ {
        expires         1h;
        access_log      off;       
    }

    #html缓存策略
    location ~ .*\.(html|htm)$ {
        #add_header Cache-Control no-cache;
        #add_header Cache-Control no-store;
        add_header Cache-Control max-age=60;
        access_log      off;
    }
}
  • (12) 内容控制

http头控制:

add_header 这个指令用来增加协议头:
add_header Cache-Control no-cache;
add_header Cache-Control no-store;
add_header Cache-Control max-age=60;
add_header Content-Encoding gzip
add_header Content-Type 'text/html; charset=utf-8';

if ($request_uri ~* "^/$|^/search/.+/|^/company/.+/") {
    add_header    Cache-Control  max-age=3600;
}

if ($request_uri ~* "^/search-suggest/|^/categories/") {
    add_header    Cache-Control  max-age=86400;
}

直接简单粗暴的返回状态码及内容文本:

location = /do_not_delete.html {
    return 200 "hello.";
}

错误页面指定

error_page 404 https://www.hello.com/; 一般放在server里

  • (13) 可用的全局变量
$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri
  • (14) 一则备忘

以前我想过用nodejs来分析日志,当时搞了一个模型:

log_format mylog '{"ip":"$remote_addr",''"time":"$time_local",''"req":"$request",''"status":"$status",''"referer":"$http_referer",''"agent":"$http_user_agent"}';

access_log /data/logs/nginx/test.log mylog;

在分析日志的时候,你发现文件是JSON,便于处理。

  • (15) SSL HTTPS

一则范例:

server{
    listen 443;
    server_name www.test.com;
    charset utf8;
    ssl on;
    ssl_certificate /etc/ssl/test.com.crt;
    ssl_certificate_key /etc/ssl/test.com.key;

#如果发现后端PHP等开启了上传许可,还是不行的话,检查下nginx 是否设置了上传大小的限制
client_max_body_size 30m;

#设置连接超时阀值
keepalive_timeout 10;

#容灾设置
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;

#反向代理优化
proxy_set_header Connection "";
proxy_http_version 1.1;

#在具体的upstream中,添加
keepalive 512;

 

location /status {
         # 打印Tengine状态页  localhost/status
        stub_status on; # 开启状态页,依赖 http_stub_status_module 模块
        access_log  off; #访问过程不记日志
    }

    location ~ ^(.*)\/\.(svn|git|hg|bzr|cvs)\/ { # 屏蔽这些目录
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~ /\. { # 屏蔽.开头的目录或文件,比如  .htaccess .bash_history
        deny all;
        access_log off;
        log_not_found off;
    }

提供空图片

location /empty.gif{
            access_log off;
            empty_gif;
}

依赖:load ngx_http_empty_gif_module.so ;

 

nginx的root和alias指令的区别

location /img/ {
    alias /var/www/image/;
}
#若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
location /img/ {
    root /var/www/image;
}
#若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。]

alias是一个目录别名的定义,root则是最上层目录的定义。

还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无~~

 

一个设置了缓存,但刷新始终返回200的问题

我对html设置了缓存,照理如果我刷新的话,应该出现期望中的304,但遗憾的是没有。排查发现是:

ssi on;
ssi_silent_errors on;
ssi_types text/shtml;

是这段设置有影响,注释掉就出现了期望的304。
html不应该被影响才对。

注:ssi_last_modified on;  # 加上这句,就会返回 ETag 及Last-Modified  304头了.

 
Nginx 配置总结(转)
标签: