1 应用场景

我们经常会遇到在同一台服务器建立多个Web站点的情况,普遍的做法是为不同的站点配置不同的端口,这样就可以用IP:Port的形式访问。
但是用IP访问毕竟不方便,不生动,不容易记忆。那么,我们可以给每个站点绑定不同的域名。(在这里我们仅谈公网情况)即使我们只有一个域名,我们可以设置多个二级域名,使用Nginx很容易实现。

2 基本要求

首先,要有一个自己能管理的域名,比如我有一个 51cto.com 的域名,就可以生出多个子域名,
其次,有一台能访问的公网IP服务器,可以在这台服务器上建立自己的Web站点,设置指定端口。

3 域名配置

把域名的A记录解析指向我们的公网服务器,这一点一般人都能想到。解析的时候只能加IP,是不能带端口号的,即只能使用默认的80端口。(不讨论域名转发)
若想实现子域名绑定,在域名解析的时候必须配置合理。否则只靠Nginx是不行的。
例如我要把子域名 jira.51cto.com 绑定到 服务器的 8001端口,我首先要保证访问 jira.51cto.com 的请求能到达该服务器,然后Nginx才能处理。
此时,要么在域名A记录解析里加一条 p 的主机记录,要么主机记录里有通配符 的配置(.postmsg.cn的访问全部解析到对应的服务器,慎用),只设置@和www肯定是不行的。
nginx反向代理二级域名及修改默认端口

4 服务器配置

域名的请求到达主机之后,一切才可以交给Nginx来处理。

4.1 安装nginx服务

参考:RHEL/CentOS 安装 nginx

4.2 配置反向代理

单独写一个.conf的文件配置server块,内容可以参考/etc/nginx/conf.d/default.conf

[root@node1 ~]# cd /etc/nginx/conf.d
[root@node1 conf.d]# vim reverse_proxy.conf
server
{
        listen 80;
        server_name jira.51cto.com;
        location / {
                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;
                proxy_pass http://192.168.1.101:8080;
        }
        access_log /var/log/nginx/jira-51cto-com.log;
}
[root@node1 ~]# 

简单说明

  • listen 80 # 监听的端口;一定要把 80 端口留给负责代理的Nginx。
  • server_name jira.51cto.com; # 要监听的域名;
  • proxy_pass http://192.168.1.101:8080; # 要转发的内网访问的IP和端口;
  • access_log /var/log/nginx/jira-51cto-com.log; # 日志,注意路径是否存在

这样所有通过jira.51cto.com访问本机的请求,都会被nginx转发到http://192.168.1.101:8080上
其中server可以配置多个,来实现多个域名的不同转发规则

4.3 重启nginx服务

CentOS 6.*

[root@node1 ~]#  service nginx restart

CentOS 7.*

[root@node1 ~]#  systemctl restart nginx.service

4.4 验证

浏览器输入URL:jira.51cto.com

配置重启后,即时生效性,如果无法登陆一般的原因:

  • 域名解析生效时间。一般的域名解析最低生效时间是10分钟,有时候可能大于这个值。
  • 本地DNS缓存。可在CMD使用 ipconfig /flushdns 命令刷新本地DNS缓存。
  • 浏览器缓存。这个可能才是最不容易发现的,尤其是谷歌浏览器。F12之后,右键左上角地址栏边上的刷新按钮,点击清空缓存并硬性重新加载。
  • 服务未重启。service nginx restart 有时候可能没有先 stop, 再 start 好用。

4.5 调整主配置文件nginx.conf的代理超时参数(可选)

[root@node1 nginx]# vim /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 65535;

events {
    worker_connections  65535;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    client_max_body_size 500m;      # 缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
    client_body_buffer_size 256k;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    proxy_connect_timeout 300s;     # nginx跟后端服务器连接超时时间(代理连接超时)
    proxy_read_timeout 300s;        # 连接成功后,后端服务器响应时间(代理接收超时)
    proxy_send_timeout 300s;
    proxy_buffer_size 64k;          # 设置代理服务器(nginx)保存用户头信息的缓冲区大小
    proxy_buffers 4 32k;            # proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
    proxy_busy_buffers_size 64k;    # 高负荷下缓冲大小(proxy_buffers*2)
    proxy_temp_file_write_size 64k; # 设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
    proxy_ignore_client_abort on;   # 不允许代理端主动关闭连接
    server {
        listen 80;
        server_name localhost;
        location / {
            root html;
            index index.html index.htm;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}
[root@node1 nginx]#

重启nginx服务

CentOS 6.*

[root@node1 ~]#  service nginx restart

CentOS 7.*

[root@node1 ~]#  systemctl restart nginx.service

4.6 负载均衡

如果想对后端机器做负载均衡,像下面这配置就可以把对jira.51cto.com的请求分发给内网的101和102这两台机器做负载均衡。

[root@node1 ~]# cd /etc/nginx/conf.d
[root@node1 conf.d]# vim reverse_proxy.conf

upstream monitor_server {
        server 192.168.1.101:8080;
        server 192.168.1.102:8080;
}

server
{
        listen 80;
        server_name jira.51cto.com;
        location / {
                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;
                proxy_pass http://monitor_server;
        }
        access_log /var/log/nginx/jira-51cto-com.log;
}
[root@node1 ~]#

4.7 修改nginx默认端口

修改两个地方:

  • 修改listen监听端口,如改为81
  • 给"location"的"proxy_set_header Host"指定端口,由"$host"改为"$host:$server_port";其中"$server_port"可以设置为具体端口,如:81
    [root@node1 ~]# cd /etc/nginx/conf.d
    [root@node1 conf.d]# vim reverse_proxy.conf
    server
    {
        listen 81;
        server_name jira.51cto.com;
        location / {
                proxy_redirect off;
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://192.168.1.101:8080;
        }
        access_log /var/log/nginx/jira-51cto-com.log;
    }
    [root@node1 ~]# 

    END