nginx 多域名访问多端口应用

对于个人用户来说,我们一般手上只有一个服务器,但是我们希望在上面部署多个 web 应用。这些不同的应用会占用不同的端口。如果我们不设置 nginx 的话访问方式就是下面这样,靠端口访问十分不方便。

服务 端口 访问方式
网盘 2222 www.domain.com:2222
博客 3333 www.domian.com:3333

我们希望的访问的方式是,我们用不同的域名就能够访问不同端口的 web 应用,本文就记录配置方式。

服务 端口 访问方式
网盘 2222 netdisk.domain.com
博客 3333 blog.domian.com

这就依靠 nginx 的反向代理功能,即把不同端口的服务反向代理到一个端口,这样我们虽然都是访问了 80 端口,但是由于使用的域名不同,nginx 会代理给我们不同的服务。

nginx 文件结构

我们首先要了解 nginx 的配置文件的结构,才知道我们要对哪里动刀。一般情况下 nginx 默认安装在/etc/nginx。和今天任务有关的文件树如下:

/etc/nginx
├── nginx.conf              # nginx 总配置文件
└── conf.d                  # 服务配置文件夹
        ├── default.conf    # 默认服务配置 - 80 端口            
        ├── *.conf          # 自定义的服务配置文件    

首先我们要保证/etc/nginx/nginx.conf总配置文件内有这个语句:include /etc/nginx/conf.d/*.conf;,一般在文件末尾,这句话的意思就是,nginx 启动时会把/etc/nginx/conf.d/文件夹里所有的.conf配置文件都载入。一般情况下这个语句都是包含的。
接下来就是要编写自定义的配置文件,编写方式有两种:
1. 在default.conf一个文件里,通过添加配置来部署所有的服务。
2. 不同的域名(服务)编写不同的.conf文件。

本文推荐第二种,因为后期服务管理起来更方便,喜欢一个文件解决的只需要把单独文件的内容拼接在default.conf后面就行了。

多域名-多端口配置文件

首先我们要把多个域名都先指向我们的服务器,笔记:域名获取 · 解析至公网服务器。然后为了实现上面表格中的访问方式,我们把文件树配置成这样:

/etc/nginx
├── nginx.conf
└── conf.d  
        ├── default.conf                    # 一般建议配置文件用域名来命名            
        ├── netdisk_admin_com.conf          # 网盘服务配置文件  
        ├── blog_admin_com.conf             # 博客服务配置文件

具体的文件配置如下:

netdisk_admin_com.conf

server{
    listen 80;                          # http默认端口
    server_name netdisk.domain.com;     # 访问的域名

    location / {
        ## 一些其余配置
        proxy_pass http://localhost:2222;   #核心语句:把2222端口上的网盘服务代理到80端口
    }
    ##### 一些其余配置
}

blog_admin_com.conf

server{
    listen 80;                          # http默认端口
    server_name blog.domain.com;        # 访问的域名

    location / {
        ## 一些其余配置
        proxy_pass http://localhost:3333;   #核心语句:把3333端口上的网盘服务代理到80端口
    }
    ##### 一些其余配置
}

之后重启 nginx 服务就好了。

禁止ip访问

有时候不希望他人可以通过 IP 直接访问到我们的服务器(一般是恶意攻击),我们可以在总配置文件/etc/nginx/nginx.conf中添加语句

server {
    listen 80 default;      # default参数表示这个是默认虚拟主机
    return 403;
}

也可以把这些流量导入到自己的网站,做下面的跳转操作:

server { 
    listen 80 default; 
    rewrite ^(.*) http://www.domain.com permanent; 
}

设置404页面

server{
  listen 80;
  server_name www.domain.com;
  error_page 404 /404.html;
}