[代理-网络]Nginx

Posted Gustavo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[代理-网络]Nginx相关的知识,希望对你有一定的参考价值。

技术图片


简介

nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡。


查找安装目录

1 which nginx

2  ps  -ef | grep nginx
返回结果包含安装目录
root      2662     1  0 07:12 ?        00:00:00 nginx: master process /usr/sbin/nginx

常用命令

启动
1 默认启动,走默认配置文件,直接执行安装目录下 /usr/local/nginx/sbin/nginx
2 通过指定配置文件的方式启动 /usr/sbin/nginx -c /etc/nginx/nginx.conf (前面的是安装目录,后面的是配置文件)
3 systemctl start nginx 

柔和重启
nginx -s reload

配置文件检查
nginx -t

匹配规则

location = / {
  # 精确匹配 / ,主机名后面不能带任何字符串
  [ configuration A ]
}

location / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
  [ configuration B ]
}

location /documents/ {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration C ]
}

location ~ /documents/Abc {
  # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration CC ]
}

location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  [ configuration D ]
}

location ~* .(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ]
}

location /images/ {
  # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
  [ configuration F ]
}

location /images/abc {
  # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
  # F与G的放置顺序是没有关系的
  [ configuration G ]
}

location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ configuration H ]
}

参考配置

防盗链
location ~* .(gif|jpg|png)$ {
    # 只允许 192.168.0.1 请求资源
    valid_referers none blocked 192.168.0.1;
    if ($invalid_referer) {
       rewrite ^/ http://$host/logo.png;
    }
}
根据文件类型设置过期时间
location ~.*.css$ {
    expires 1d;
    break;
}
location ~.*.js$ {
    expires 1d;
    break;
}

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
    access_log off;
    expires 15d;    #保存15天
    break;
}

# curl -x127.0.0.1:80 http://www.test.com/static/image/common/logo.png -I #测试图片的max-age
静态资源访问
http {
    # 这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,
    # 建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
    open_file_cache max=204800 inactive=20s;

    # open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,
    # 如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个
    # 文件在inactive 时间内一次没被使用,它将被移除。
    open_file_cache_min_uses 1;

    # 这个是指多长时间检查一次缓存的有效信息
    open_file_cache_valid 30s;

    # 默认情况下,Nginx的gzip压缩是关闭的, gzip压缩功能就是可以让你节省不
    # 少带宽,但是会增加服务器CPU的开销哦,Nginx默认只对text/html进行压缩 ,
    # 如果要对html之外的内容进行压缩传输,我们需要手动来设置。
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;


    server {
        listen       80;
        server_name www.test.com;
        charset utf-8;
        root   /data/www.test.com;
        index  index.html index.htm;
    }
}
access_log 访问日志
http {
    log_format  access  ‘$remote_addr - $remote_user [$time_local] $host "$request" ‘
                  ‘$status $body_bytes_sent "$http_referer" ‘
                  ‘"$http_user_agent" "$http_x_forwarded_for" "$clientip"‘;
    access_log  /srv/log/nginx/talk-fun.access.log  access;
}
反向代理
http {
    include mime.types;
    server_tokens off;

    ## 配置反向代理的参数
    server {
        listen    8080;

        ## 1. 用户访问 http://ip:port,则反向代理到 https://github.com
        location / {
            proxy_pass  https://github.com;
            proxy_redirect     off;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        ## 2.用户访问 http://ip:port/README.md,则反向代理到
        ##   https://github.com/zibinli/blog/blob/master/README.md
        location /README.md {
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass https://github.com/zibinli/blog/blob/master/README.md;
        }
    }
}
禁止指定user_agent
#虚拟主机的配置文件里加入:

if ($http_user_agent ~* ‘baidu|360|sohu‘) #禁止useragent为baidu、360和sohu,~*表示不区分大小写匹配
{
   return 403;
}

location /  和  location  ~ /  优先级是不一样的。 
结合这个文章研究一下吧 http://blog.itpub.net/27181165/viewspace-777202/
curl -A "baidu" -x127.0.0.1:80 www.test.com/forum.php -I    该命令指定百度为user_agent,返回403
nginx访问控制
# 可以设置一些配置禁止一些ip的访问

deny 127.0.0.1;     #全局定义限制,location里的是局部定义的。如果两者冲突,以location这种精确地优先,

location ~ .*admin.php$ {
    #auth_basic "cct auth";
    #auth_basic_user_file /usr/local/nginx/conf/.htpasswd;

    allow 127.0.0.1;  只允许127.0.0.1的访问,其他均拒绝
    deny all;

    include fastcgi_params;
    fastcgi_pass unix:/tmp/www.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
}
负载均衡
http {
    upstream test.net {
        ip_hash;
        server 192.168.10.13:80;
        server 192.168.10.14:80  down;
        server 192.168.10.15:8009  max_fails=3  fail_timeout=20s;
        server 192.168.10.16:8080;
    }
    server {
        location / {
            proxy_pass  http://test.net;
        }
    }
}

场景应用

1 nginx 访问时的权限问题
chmod -R 755  /home/apiserver1/

2 404页面跳转到首页
try_files $uri $uri/ /index.html =404;

3 静态图片配置
      location ~ .*.(gif|jpg|jpeg|png)$ {
      expires 24h;
      root /home/apiserver1/images;
      access_log /var/log/nginx/log/test_iindex.image.log;
      proxy_store on;
      proxy_store_access user:rw group:rw all:rw;
      proxy_temp_path /home/apiserver1/images;
      proxy_redirect off;
      proxy_set_header Host 127.0.0.1;
      client_max_body_size 10m;
      client_body_buffer_size 1280k;
      proxy_connect_timeout 900;
      proxy_send_timeout 900;
      proxy_read_timeout 900;
      proxy_buffer_size 40k;
      proxy_buffers 40 320k;
      proxy_busy_buffers_size 640k;
      proxy_temp_file_write_size 640k;
      if ( !-e $request_filename)
      {
         proxy_pass http://127.0.0.1;
      }
     }

4单页面多应用
用alias可以轻松配置

如果一个域名下有多个项目,那么使用根路径配置就不合适了,我们需要在根路径下指定一层路径,比如说
A项目
http://yoursite.com/A
B项目
http://yoursite.com/B
nginx的配置
    location ^~/A {
            alias /XX/A;//此处为A的路径
            index index.html;
            try_files $uri $uri/ /A/index.html;
    }
    location ^~/B {
            alias /XX/B;//此处为B的路径
            index index.html;
            try_files $uri $uri/ /B/index.html;
    }
tip: 注意要用alias不能用root
    }

常见问题

# root 和 alias的区别?
**root**
location /i/ {
  root /data/w3;
}
真实的路径是root指定的值加上location指定的值,即/data/w3/i/...

**alias**
location /i/ {
  alias /data/w3/;
}
在服务器查找的资源路径是: /data/w3/...

以上是关于[代理-网络]Nginx的主要内容,如果未能解决你的问题,请参考以下文章

[代理-网络]Nginx

Nginx反向代理常用配置

Nginx的代理和反向代理

markdown 如何使用nginx代理网络应用程序?

markdown 如何使用nginx代理网络应用程序?

markdown 如何使用nginx代理网络应用程序?