微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于Nginx虚拟主机

  • 定义

    任何由关键字server开始的部分都被称为“虚拟主机”部分。描述的是一组根据不同的server_name指令逻辑分割的资源,这些虚拟主机响应HTTP请求,都包含在http部分中。

    一个虚拟主机由listen和server_name指令组合定义。

    listen指令定义一个IP/端口组合或者是Unix域套接字路径:

listen address[:port];
listen port;
listen unix:path;

    server_name指令的认值是“”,意味着server部分没有server_name指令,对于没有设置Host头字段的请求,将会匹配该server处理。可用于丢弃不含Host头的请求。

server {
    listen 80;
    return 444;    # 444非标准代码将会使得Nginx立即关闭一个连接。
}

    Nginx接受通配符和正则表达式作为server_name指令的参数:

通配符可以替代部分子域名:*.example.com
通配符可以替代部分顶级域:www.example.*
匹配子域或域本身:.example.com(匹配.example.com,也包括example.com)
在域名前加上波浪号(~)说明使用正则表达式:
    server_name ~^www\.example\.com$;
    server_name ~^www(d+)\.example\.(com)$;
  • 特定请求匹配虚拟主机时遵循的逻辑

    1、匹配IP地址和listen指令指定的端口;

    2、将Host头字段作为一个字符串匹配server_name;

    3、将Host头字段与server_name字符串的开始部分做匹配;

    4、将Host头字段与server_name字符串的结尾部分做匹配;

    5、将Host头字段与server_name进行正则表达式匹配;

    6、如果所有Host头匹配失败,将会转向listen指令定义的default_server;

    7、如果所有的Host头匹配失败,并且没有default_server,那么将会转向第一个server的listen指令。

  • Locations

    location指令可以用在虚拟主机server部分,提供来自客户端的URI或者内部重定向访问。location可以被嵌套使用。

    location定义如下:

location [=|^~|~|~*] /uri {
    ……
}
或者命名location:
location @name {
    ……
}

    location修饰符:

使用精确匹配并且终止搜索

~

使用区分大小写的正则表达式匹配

~*

使用不区分大小写的正则表达式匹配

^~

如果该location是最佳匹配,那么对于匹配这个location的字符串,不再进行正则表达式匹配。

这不是一个正则表达式,目的是优于正则表达式的匹配。

    匹配规则:

        1、没有正则表达式的location被优先匹配,独立于含有正则表达式的location顺序;

        2、在配置文件中按照顺序进行正则表达式匹配。在查找到第一个正则表达式匹配之后结束查找。

    try_files:

        try_files指令将会按照给定它的参数顺序进行尝试,第一个匹配的将会使用。经常被用于从一个变量去匹配一个可能的文件,然后将剩余请求传递到一个命名location:

location / {
    try_files $uri $uri/ @app;
}
location @app {
    proxy_pass http://appserver;
}

    location的嵌套使用,不适用于使用“=”修饰符做前缀和命令location:

location / {                          # 首先,匹配根路径
    location ^~ /css {                # 然后,找到一个最佳匹配/css。注意,这里不是正则表达式
        location ~* /css/.*\.css$ {   # 最后,通过正则表达式找到了最佳匹配
        ……
        }
    }
}
  • 一个虚拟服务器的完整示例配置

server {
    listen 80;
    return 444;
}
server {
    listen 80;
    server_name localhost.myserver.com;
    location / {
        try_files $uri $uri/ @Nginxserver;
    }
    location @Nginxserver {
        proxy_pass http://127.0.0.1:8080;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐