精华内容
下载资源
问答
  • 主要介绍了Nginx虚拟主机配置中server_name的具体写法,server_name服务器名是虚拟主机中必须配置的重要参数,需要的朋友可以参考下
  • nginx server_name 多个

    千次阅读 2020-08-28 20:31:05
    nginx server_name 多个 nginx server_name 多个的话,空格隔开就行 server_name baidu.com baidu.me; 如果很多的话可以用正则,我的需求,xxx-api-dev.zzg.me 统一跳转到127.0.0.1:8888 server { listen 80; ...

    nginx server_name 多个

    nginx server_name 多个的话,空格隔开就行

     server_name baidu.com baidu.me;
    

    如果很多的话可以用正则,我的需求,xxx-api-dev.zzg.me 统一跳转到127.0.0.1:8888

    server {
            listen 80;
            server_name ~^.+-api-dev\.zzg\.me$;
     
            location / {
                    #error_log    /var/log/nginx/x-api-dev.1yd.me.error.log debug;
                    #access_log /var/log/nginx/x-api-dev.1yd.me.access.log;
                    #rewrite_log on;
                    proxy_set_header  Host  $host;
                    proxy_set_header  X-Real-IP $remote_addr;
                    proxy_pass http://127.0.0.1:8888;
    }
    

    文章来自于:雨夜的博客

    展开全文
  • nginx绑定多个域名可又把多个域名规则写一个配置文件里,也可又分别建立多个域名配置文件,我一般为了管理方便,每个域名建一个文件,有些同类域名也可又写在一个总的配置文件里。 一、每个域名一个文件的写法 首先...

     nginx绑定多个域名可又把多个域名规则写一个配置文件里,也可又分别建立多个域名配置文件,我一般为了管理方便,每个域名建一个文件,有些同类域名也可又写在一个总的配置文件里。

    一、每个域名一个文件的写法
           首先打开nginx域名配置文件存放目录:/usr/local/nginx/conf/servers ,如要绑定域名www.itblood.com 则在此目录建一个文件:www.itblood.com.conf然后在此文件中写规则,如:server

    1

    2

    3

    4

    5

    6

    7

    {

    listen 80;

    server_name www.itblood.com; #绑定域名

    index index.htm index.html index.php; #默认文件

    root /home/www/itblood.com; #网站根目录

    include location.conf; #调用其他规则,也可去除

    }

    然后重起nginx服务器,域名就绑定成功了nginx服务器重起命令:/etc/init.d/nginx restart
    二、一个文件多个域名的写法
    一个文件添加多个域名的规则也是一样,只要把上面单个域名重复写下来就ok了,如:server

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    {

    listen 80;

    server_name www.itblood.com; #绑定域名

    index index.htm index.html index.php; #默认文件

    root /home/www/itblood.com; #网站根目录

    include location.conf; #调用其他规则,也可去除

    }server

    {

    listen 80;

    server_name msn.itblood.com; #绑定域名

    index index.htm index.html index.php; #默认文件

    root /home/www/msn.itblood.com; #网站根目录

    include location.conf; #调用其他规则,也可去除

    }

    三、不带www的域名加301跳转
    如果不带www的域名要加301跳转,那也是和绑定域名一样,先绑定不带www的域名,只是不用写网站目录,而是进行301跳转,如:

    1

    2

    3

    4

    5

    6

    server

    {

    listen 80;

    server_name itblood.com;

    rewrite ^/(.*) http://www.itblood.com/$1 permanent;

    }

    四、添加404网页

           添加404网页,都可又直接在里面添加,如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    server

    {

    listen 80;

    server_name www.itblood.com; #绑定域名

    index index.htm index.html index.php; #默认文件

    root /home/www/itblood.com; #网站根目录

    include location.conf; #调用其他规则,也可去除

    error_page 404 /404.html;

    }

    学会上面四种规则方法,基本就可以自己独立解决nginx 多域名配置问题了

     

    注意事项

    特别要注意的是,在nginx的配置文件中只有一个server配置的时候,server_name无效的,也就是说任何域名绑定了这个IP的时候,无论server_name填什么域名,都会匹配到这个唯一的server。只有在多个server的时候,server_name才会有效。

     

    Nginx中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序分别为:
    1、准确的server_name匹配,例如:

    server {
    listen 80;
    server_name domain.com www.domain.com;
    ...
    }

    2、以通配符开始的字符串:
    server {
    listen 80;
    server_name .domain.com;
    ...
    }
    3、以
    通配符结束的字符串:
    server {
    listen 80;
    server_name www.
    ;
    ...
    }
    4、匹配正则表达式:
    server {
    listen 80;
    server_name ~^(?.+).domain.com$;
    ...
    }

    nginx将按照1,2,3,4的顺序对server name进行匹配,只有有一项匹配以后就会停止搜索,所以我们在使用这个指令的时候一定要分清楚它的匹配顺序(类似于location指令)。
    server_name指令一项很实用的功能便是可以在使用正则表达式的捕获功能,这样可以尽量精简配置文件,毕竟太长的配置文件日常维护也很不方便。下面是2个具体的应用:
    1、在一个server块中配置多个站点:
    server
    {
    listen 80;
    server_name ~^(www.)?(.+)$;
    index index.php index.html;
    root /data/wwwsite/$2;
    }
    站点的主目录应该类似于这样的结构:
    /data/wwwsite/domain.com
    /data/wwwsite/nginx.org
    /data/wwwsite/baidu.com
    /data/wwwsite/google.com

    这样就可以只使用一个server块来完成多个站点的配置。
    2、在一个server块中为一个站点配置多个二级域名。
    实际网站目录结构中我们通常会为站点的二级域名独立创建一个目录,同样我们可以使用正则的捕获来实现在一个server块中配置多个二级域名:

    server
    {
    listen 80;
    server_name ~^(.+)?.domain.com$;
    index index.html;
    if ($host = domain.com){
    rewrite ^ http://www.domain.com permanent;
    }
    root /data/wwwsite/domain.com/$1/;
    }
    站点的目录结构应该如下:
    /data/wwwsite/domain.com/www/
    /data/wwwsite/domain
    .com/nginx/
    这样访问www.domain.com时root目录为/data/wwwsite/domain.com/www/nginx.domain.com时为/data/wwwsite/domain.com/nginx/,以此类推。

    后面if语句的作用是将domain.com的方位重定向到www.domain.com,这样既解决了网站的主目录访问,又可以增加seo中对www.domain.com的域名权重。

    Nginx 的 default_server 指令

    server {
    listen 80 default_server;
    server_name oschina.net www.oschina.net;
    ...
    }
    先看看上面这段配置,listen 指令后面有一个参数 default_server ,这个参数是在 0.8.21 版本以后才有的,而之前是 default 指令。
    Nginx 的虚拟主机是通过HTTP请求中的Host值来找到对应的虚拟主机配置,如果找不到呢?那 Nginx 就会将请求送到指定了 default_server 的 节点来处理,如果没有指定为 default_server 的话,就跑到 localhost 的节点,如果没有 localhost 的节点,那只好 404 了。
    另外你也可以指定对于没有匹配的 Host 值时,返回错误到客户端,这在现在国内用来处理未备案域名指向自己时非常有用,看看下面的配置:
    server {
    listen 80 default_server;
    server_name _;
    return 444;
    }
    通过返回444这个Nginx的非标准错误码来让Nginx断开与浏览器之间的连接。



    nginx 的 default_server 定义及匹配规则

    nginx 的 default_server 指令可以定义默认的 server 出处理一些没有成功匹配 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。

    在了解到如上规则后,我们可以捕获未做绑定的域名访问或直接IP访问,做重定向到403页面等处理。

    1、nginx 隐式的 default server

    http {
        # 如果没有显式声明 default server 则第一个 server 会被隐式的设为 default server
        server {
            listen 80;
            server_name _; # _ 并不是重点 __ 也可以 ___也可以
            return 403; # 403 forbidden
        }
        
        server {
            listen 80;
            server_name www.a.com;
            ...
        }
        
        server {
            listen 80;
            server_name www.b.com;
            ...
        }
    }

    很多人复制粘贴广泛传播 server_name 要设为 '_',其实一毛钱的关系也没有。'_' 只是作为一个和业务域名无关的请求回收服务而已,如果我们线上的业务都是明确的业务域名访问,那泛解析造成的一些非业务域名或ip访问都会被这个 sever 回收处理。

    在没有显式定义 default server 时,nginx 会将配置的第一个 server 作为 default server,即当请求没有匹配任何 server_name 时,此 server 会处理此请求。所以,当我们直接使用 ip 访问时会被交给此处定义的第一个 server 处理,403 forbidden。

    2、显示的定义一个 default server

    http {
        server {
            listen 80;
            server_name www.a.com;
            ...
        }
        
        server {
            listen 80;
            server_name www.b.com;
            ...
        }
        
        # 显示的定义一个 default server
        server {
            listen 80 default_server;
            server_name _;
            return 403; # 403 forbidden
        }
        
    }

    3、直接指定server_name 为 ip(只能禁止ip访问)

    http {
        server {
            listen 80;
            server_name www.a.com;
            ...
        }
        
        server {
            listen 80;
            server_name www.b.com;
            ...
        }
        
        # 直接指定 ip server_name
        server {
            listen 80;
            server_name xxx.xxx.xxx.xxx;
            return 403; # 403 forbidden
        }
        
    }

    以上三种方式都可禁止 ip 直接访问,且 1,2 同时可以禁止未绑定域名的访问(比如你泛解析了主域名)。

    展开全文
  • 记一个nginx server_name配置多个时的坑

    万次阅读 2020-06-13 18:50:36
    背景为了区分线上环境和测试环境,我弄了个自己测试专用的域名test.daemoncoder.com,线上环境的正式域名是www.daemoncoder.com。nginx里的server...

    背景

    为了区分线上环境和测试环境,我弄了个自己测试专用的域名test.daemoncoder.com,线上环境的正式域名是www.daemoncoder.com。nginx里的server_name配置改为:

    # 只列出了我们关心的配置,省略了其他无关部分
    server {
        server_name www.daemoncoder.com test.daemoncoder.com;
        ...
    }

    但是使用时发现请求一直报错,重定向到错误页面,于是开始了问题的定位。

    问题的定位

    根据业务上报错时打的日志,定位到请求公共处理的部分里有这么一个判断:

    if ($_SERVER['SERVER_NAME'] != parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)) {
        $this->redirectError();
    }

    判断请求referer里解析出的域名如果和nginx里的$server_name变量里的域名如果不一样,就跳到错误页面,也是前面说的问题。

    那么问题来了,看referer中的域名为什么和 $_SERVER['SERVER_NAME'] 不一致呢?我请求用的链接形式如 http://test.daemoncoder.com/xxx 这种形式,但是最终在PHP这一层取到 $_SERVER['SERVER_NAME'] 的值为 www.daemoncoder.com,而 HTTP_REFERER 里的域名为:test.daemoncoder.com。可以看到 SERVER_NAME 的取值和我们的预期不一致,nginx是怎么把这个变量传过来的,需要从 nginx 的 fastcgi_params 配置文件中找一下 SERVER_NAME 的定义:

    fastcgi_param SERVER_NAME $server_name;

    可以看到 nginx 里的 $server_name 变量就是我们PHP里取的$_SERVER['SERVER_NAME'] 的来源。

    问题的原因

    通过上面的定位,我们基本可以看到问题的根本原因了(敲黑板,划重点):

    当nginx配置里一个server节点下,server_name配置多个域名时,$server_name变量的值都是配置的第一个。

    再回顾下我的 nginx 配置:

    # 只列出了我们关心的配置,省略了其他无关部分
    server {
        server_name www.daemoncoder.com test.daemoncoder.com;
        ...
    }

    server_name 结点有两个:www.daemoncoder.com 和 test.daemoncoder.com,当我用测试域名去访问页面的时候,可以匹配到 test.daemoncoder.com 这个域名,所以会根据当前这个server节点的配置来处理这个请求,但是 nginx 会把 $server_name 的值设置为当前 server 节点的配置的第一个 server_name,也就是 www.daemoncoder.com。如果配置改为:

    server_name test.daemoncoder.com www.daemoncoder.com;

    那么用测试域名请求就可以得到期望的值了(但是正式域名就出问题了)。

    解决方式

    第一种方式就是把配置文件按域名拆分到各自单独的server节点下,也就是:

    # 省略其他无关部分
    server {
        server_name www.daemoncoder.com;
        ...
    }
    server {
        server_name test.daemoncoder.com;
        ...
    }

    这样用不同的域名访问会落到各自对应的配置中,解析到的 $server_name 也都是各自的值。

    第二种方式是修改 nginx SERVER_NAME 使用 $host 变量, 也就是把 

    fastcgi_param SERVER_NAME $server_name;

    修改为:

    fastcgi_param SERVER_NAME $host;

    $host变量的解析都是当前请求的host,不会受 server_name 是否配置多个域名的影响,这样我们在PHP里取 $_SERVER['SERVER_NAME'] 取出的值就是实际请求的域名,也可以解决问题(但是代码里的这个判断逻辑在测试环境似乎就没有意义了,问题不大)。


    微信公共号:

    转载请注明出处,本文原始链接:

    https://www.daemoncoder.com/

    点击下方阅读原文,发现更多优质内容。

    展开全文
  • nginx server_name解析

    千次阅读 2019-03-28 14:31:27
    nginx会解析http header里的host 找到匹配的server_name 如果没有则用默认的 或者第一个 禁止ip访问: server { listen 80; server_name _; return 404; } server { listen 80; ...

    nginx会解析http header里的host 找到匹配的server_name 如果没有则用默认的  或者第一个

     

     

    禁止ip访问:

    server {
              listen      80;
              server_name  _;
              return 404;
       }

     server {
            listen       80;
            server_name  www.hello.com;

    }

    当用ip访问的时候 没有匹配的server 则会匹配到第一个server  返回404

     

    展开全文
  • Nginx server_name 参数配置

    万次阅读 2018-01-20 20:17:30
    Nginx中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序分别为: 1、准确的server_name匹配,例如:   server { listen 80; server_name domain....
  • nginx server_name匹配规则

    万次阅读 2017-06-28 20:00:09
    官网说明:http://nginx.org/en/docs/http/server_names.html 需要记住的是两点: 1)完全匹配,匹配成功则终止搜索 2)不匹配,默认走第1个server nginx配置如下: worker_processes 1; events { worker_...
  • 配置server_name时一直没有摸清大体规则是什么,这里是网上搜到的一个简单易懂的规则,很适合新手理解
  • Nginx server_name 的问题

    千次阅读 2013-12-04 09:34:36
    nginx 绑定多个域名时, 默认 $_SERVER["SERVER_NAME"] 取的是 server_name 的第一个域名 在你的 nginx 配置中找到 fastcgi_param 部分,修改 fastcgi_param SERVER_NAME $server_name; 为 fastcgi_param...
  • nginx配置server_name后不生效

    千次阅读 2020-10-20 00:23:29
    公司办公网默认解析8080端口,所以nginx需要配置不同server_name,相同端口。 问题描述: nginx配置中配置了 http{ xxx server{ xxx; port 8080; server_namewww.name1.com; } server{ xxx; port 8080; ...
  • Nginx server_name 如何配置二级域名

    千次阅读 2013-12-17 06:26:47
    今天在使用Nginx时,由于在DNS解析做了泛解析,在配置Nginx时 发现 server {  listen 80;  server_name foxdb.cc;  //这里随便写域名或者 删除 server_name都能正常访问 在访问其他的二级域名是,在php...
  • Nginx配置中没有server_name会怎样?

    千次阅读 2019-08-30 19:19:22
    Nginx配置中没有server_name会怎样? 答案:相当于填了server_name “”;,不会匹配任何域名。此时Nginx会将HTTP请求交给监听该端口的默认server处理。 Nginx选用server的规则 配置文件nginx.conf中,http{}中可以...
  • 如果IP地址匹配不成功,会对 域名(server_name属性) 进行匹配;如果域名也匹配不成功,则会默认匹配第一个server服务器(因此,当只有一个Nginx服务器时,客户端的请任何情况下都会匹配到这个服务器上)。 到这里...
  • nginx 多个 server_name 如何匹配? 简单看这个问题,会觉得这个问题很蠢,怎么匹配?不就是根据 server_name 名字匹配的么? 是的,我最开始也是这么觉得的,并且在之前的笔记:Nginx学习日志(二)通过反向代理将...
  • nginx 配置的server_name参数

    千次阅读 2019-02-20 15:12:07
    nginx中的server_name指令主要用于配置基于名称虚拟主机. 一、 匹配顺序,server_name指令在接到请求后的匹配顺序如下: 1、确切的server_name匹配,例如: server { listen 80; server_name ...
  • nginx的默认 server_name

    千次阅读 2020-05-28 19:41:59
    加一条默认的阻挡。...当所有server的规则都不匹配时,nginx会采用第一条server配置,所以一般第一条server会使用阻止页面。 server { listen 80 default_server; server_name _; return 404; }
  • nginxserver_name的匹配规则

    万次阅读 2019-01-16 17:01:59
    在开始学nginx的时候server_name明明没有匹配上,但竟然访问到了,还以为server_name不起作用,后来发现server_name的匹配规则是:先遍历所有配置的server_name,如果找到了,则执行对应的server,如果没有找到,则...
  • nginx配置文件中server_name的作用

    千次阅读 2020-03-07 12:47:44
    最近学习了Nginx,做一些必要的... server name 为虚拟服务器的识别路径。因此不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去。    当我们通过hosts文件指定IP...
  • Nginx配置server_name为域名后无法访问

    万次阅读 2019-04-16 16:07:27
    Nginx的配置文件中增加服务器,其server_name设置为域名时,该网址不能正常访问。 问题解决 1. 修改host文件 Linux 修改 /etc/host 文件,增加以下内容: www.test.com 127.0.0.1 修改 /etc/hosts 文件,增加...
  • nginx server_name正则匹配二级域名

    千次阅读 2012-01-30 17:07:26
    server { set $hostip 10.1.9.201; //set variable listen 80; root /var/www; server_name ~^(?P<iname>.+).xxx.cn; index $iname.php; l...
  • nginxserver_name配置

    千次阅读 2016-04-16 17:32:44
    > server 里面),server_name指令在接到请求后的匹配顺序分别为: 1.准确的server_name匹配,例如: server { listen 80; server_namessdr.info www.ssdr.info; ... }   2.以*通配符开始的字符串: ...
  • 现在假设有三台主机,他们的ip分别为: A: 192.168.1.167 B: 192.168.1.168 C: 192.168.1.169 ...一、通过不同的listen实现对B和C的访问,实现方式如下:在nginx.conf中添加两个server server {...
  • server_name _;//也不明白 别人说配的域名 location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }//普通定位 ...
  • nginx配置文件nginx.conf之serverserver_name的意义详解

    万次阅读 多人点赞 2018-12-17 18:37:18
    本人在学习nginx的时候被server_name的意义困扰了很久。又是查资料,又是请教人。最后还是自己测试出来的。 你搜到这篇文章说明你已经经过了基本的配置,但是还不懂其中的含义。 先上一段配置 server { listen...
  • nginx一个server_name配置多个二级域名

    千次阅读 2020-06-12 19:09:05
    需求:一台服务器部署多个项目(前端),项目对应不同的二级域名,比如img.luwuer.com,luwuer.com,blog.luwuer.com 转载自 :... 二级域名结构 ### 3个项目的目录结构 ... nginx配置 server { listen 80 d.
  • nginx配置:server_name的作用

    万次阅读 2018-12-26 15:18:09
    server name 为虚拟服务器的识别路径。因此不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去。 案例 修改nginx.conf server { listen 80; server_name www; location ...
  • nginx需要设置多个server_name域名

    千次阅读 2020-04-05 14:53:41
    1.配置反代设置一个.conf 文件 ...server 192.168.142.83:84; } server { listen 80; listen 443 ssl; ssl_certificate /data/ssl/panda.crt; ssl_certificate_key /data/ssl/panda.key; include vhost/fangfen...
  • nginx负载均衡中的server_name _;

    千次阅读 2019-05-25 20:58:36
    server_name _; ... ... } 官网上是这么解释的 在catch-all server示例中,可以看到奇怪的名称“_”: 这个名字没有什么特别之处,它只是无数无效域名中的一个,这些域名永远不会与任何真实的名字交叉。其...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 219,005
精华内容 87,602
关键字:

nginx的server_name