1、Nginx虚拟主机配置

    nginx一个虚拟主机使用一个serer{}配置,可以同时配置多个server。

例如:配置www.a.com 和 www.b.org


配置如下:

user nginx;
worker_processes  1;
worker_rlimit_nofile 65535;

events {
    worker_connections  2048;

}

http {
    include       mime.types;
    default_type  application/octet-stream;
    
    server {
            listen       80;
            server_name  www.a.com;
        }
    server {
            listen 80 default_server;
            server_name www.b.org;
            root /www/b.org;
        }
}

在本机hosts文件中添加解析记录

172.16.42.180   www.a.com
172.16.42.180   www.b.org


分别访问www.a.com 和www.b.org

image.png

image.png


2、nginx基于IP地址,使用access模块做访问控制

nginx访问控制用deny和allow两个指令来控制,例如修改www.b.org的server配置

 server {
        listen 80 default_server;
        server_name www.b.org;
        root /www/b.org;
        deny 172.16.42.1;
        allow 172.16.0.0/16;
        deny all;
    }

172.16.42.1 是Mac的IP,再次访问www.b.org被拒绝

image.png



3、基于用户的访问控制

如果nginx想基于用户做访问控制,在需要在server{}中增加以下配置:

local url {
    root path;
    auth_basic "admin area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

auth_basic:表示为什么做访问控制,

auth_basic_user_file:作访问控制使用的账户密码文件。可以使用htpasswd 命令来创建


测试:

修改www.b.org的配置

   server {
        listen 80 default_server;
        server_name www.b.org;
        root /www/b.org;
        location /admin/ {
            root /www/b.org;
            auth_basic "admin area";
            auth_basic_user_file /etc/nginx/.htpasswd;
        }
    }


创建密码文件: 第一次创建时使用"-c"参数

htpasswd -c -m /etc/nginx/.htpasswd tom
htpasswd  -m /etc/nginx/.htpasswd paul


reload下nginx,测试访问www.b.org站点


image.png


image.png





4、建立下载站点时,使用autoindex模块, 自动列出所有目录和文件

配置方法:在server{}, 配置中加入以下配置:

location /download {
       root /www/b.org;
       autoindex on;
}


例如:修改www.b.org配置

   server {
        listen 80 default_server;
        server_name www.b.org;
        root /www/b.org;
        location /download {
            root /www/b.org;
            autoindex on;
        }
    }


image.png


5、URL rewrite

    rewrite regex replacement [flag];

  

 flag: 标志位,包含以下选项:

  • last:一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite的规则,而通过重写后的规则重新发起请求;

  • break:一旦被当前规则匹配并重写后立即停止后续的其他rewrite的规则,而后继续由nginx进行后续操作;

  • redirect: 返回302临时重定向;

  • permanent:返回301永久重定向;


注意:一般将rewrite写在location中时都使用break标志,或者将rewrite写在if上下文中;


例1:

location / {
    root /www/b.org;
    rewrite ^/images/(.*)$ /imgs/$1;
}

解释:如果访问的uri是以images开头,后面是任意内容的,则重写为/images/任意内容 

例如: 访问http://www.b.org/images/a.jpg 会被重写成http://www.b.org/imgs/a.jpg  


例2:

location /download/ {
  root /www/b.org/;
  rewrite ^/download/(.*\.(jpg|gif|jpeg|png))$  /images/$1 last;
  
  }

解释:访问/download/下任意以jpg等图片格式结尾的uri时,跳转到/images/路径下对应的文件路径 

PS:图片实际路径是/www/b.org/images/1.jpg



修改www.b.org的配置

location /download {
       root /www/b.org;
       rewrite ^/download/(.*\.(jpg|gif|jpeg|png))$  /images/$1 last;
}

image.png


访问download下的html文件,则不会重写

image.png






6、rewrite_log on | off;

     是否把重写过程记录在错误日志中,默认为notice级别, 该功能默认是关闭的,在繁忙的服务器上这个功能建议关闭

例如:修改www.b.org配置

location /download {
    root /www/b.org;
    rewrite ^/download/(.*\.(jpg|gif|jpeg|png))$  /images/$1 last;
    rewrite_log on;
        }


开启error_log日志配置:

error_log  /var/log/nginx/error.log  notice;

保存reload nginx配置,再次访问http://b.org/download/1.jpg ,查看/var/log/nginx/error.log日志文件,发现rewrite日志记录到错误日志文件中了

tail /var/log/nginx/error.log 

2018/05/14 16:01:53 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" does not match "/download/1.jps", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jps HTTP/1.1", host: "www.b.org"
2018/05/14 16:01:53 [error] 1537#0: *41 open() "/www/b.org/download/1.jps" failed (2: No such file or directory), client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jps HTTP/1.1", host: "www.b.org"
2018/05/14 16:01:57 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" matches "/download/1.jpg", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"
2018/05/14 16:01:57 [notice] 1537#0: *41 rewritten data: "/images/1.jpg", args: "", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"
2018/05/14 16:01:58 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" matches "/download/1.jpg", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"
2018/05/14 16:01:58 [notice] 1537#0: *41 rewritten data: "/images/1.jpg", args: "", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"
2018/05/14 16:01:59 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" matches "/download/1.jpg", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"
2018/05/14 16:01:59 [notice] 1537#0: *41 rewritten data: "/images/1.jpg", args: "", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"
2018/05/14 16:01:59 [notice] 1537#0: *41 "^/download/(.*\.(jpg|gif|jpeg|png))$" matches "/download/1.jpg", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"
2018/05/14 16:01:59 [notice] 1537#0: *41 rewritten data: "/images/1.jpg", args: "", client: 172.16.42.1, server: www.b.org, request: "GET /download/1.jpg HTTP/1.1", host: "www.b.org"



7、return code;

     用于结束rewrite规则,并且为客户返回状态码,可以使用的状态码有204,400,402-406,500-504等


8、防盗链配置

location  ~* \.(jpg|png|gif|jpeg)$ {
    root /www/b.org;
    valid_referers none blocked www.b.org *.b.org;
    if ($invalid_referer) {
         rewrite ^/ http://www.b.org/403.html;
    }
}


9、ssl配置,使用https相关配置

server {
    ssl   on;
    ssl_certificate           cert.pem;       //证书保存路径
    ssl_certificate_key       cert.key;       //私钥保存的路径
    ssl_session_timeout       5m;             //会话超时时长5分钟,时间根据实际情况调整
    ssl_prefer_server_ciphers on;             //服务器自己选择加密算法
}


10、nginx状态页面配置

 location /server-status {
            stub_status on;
            access_log off;           //不记录日志到访问日志中,防止信息泄露
            allow 172.16.42.0/24;     //出于安全考虑,基于IP做访问控制
            deny all;
        }


image.png

active connection:所有的活动连接

server accepts handled requests:  服务器已经接受或处理过的请求数,

有三个数:第一个116表示nginx已经接收到的请求数

第二个116表示nginx已经处理过的请求数,请求还没有closed

第三个313表示正在处理的连接数


下面三个数当前正在处理的请求:

  • Reading:正在读取客户端请求的请求数

  • Writing:  请求主体已经获取了,准备响应请求

  • Waiting: 保持连接的请求数, Waiting = Active - (Reading + Writing)



11、upstream配置

先看下官方给出example 配置样例

Example Configuration


upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}


参数设置:

  • weight=number 设置服务器的权重,默认为1

  • max_fails=number  设置在fail_timeout 时间内不成功的尝试次数,判断此机器是否可用,默认尝试次数为1

  • fail_timeout=time  设置判断机器是否可用尝试的时间,默认时间为10s

  • backup 标明此机器为备份机器,当主机器不可用的时候起作用。

  • down  标明此机器不可用。

  • max_conns=number 限制代理服务器的最大连接数。默认值为0,也就是没有限制

  • resolve  监听ip地址以及对应的服务器域名的改变,自动修改配置,不用重启nginx.

  • route=string 设置服务器的路由名称

  • slow_start=time  设置服务器权重从0恢复到标准值的时间,默认值为0


upstream配置使用样例:

在nginx本机安装httpd,并修改apache默认欢迎页面监听端口为8080,然后启动httpd服务,然后在nginx中增加以下配置

upstream backend {
        server 127.0.0.1:8080;
}
server {
    listen       80;
    server_name  www.test.cc;
    location / {
    proxy_pass http://backend;
    root   /www/a.com;
    index  index.html index.htm;
    }
}


访问www.test.cc

image.png