最近遇到的一个小问题,记录了一下解决过程,写出来分享给大家。

背景

因为前段时间买了腾讯云3年的云服务器,准备偶尔写点后台代码放上去。正好最近也在计划写个小程序,用这个云服务器作为后台。但是微信小程序必须要求使用已经备案的域名和80端口,但是只有一台云服务器,一个80端口,如果我想用这台云服务器作为多个小程序的后台,那就不能满足需求了。

想着要是能够将多个子域名都解析到我的云服务器上,然后再通过不同的子域名映射到我云服务器的不同端口,这样,对外看起来是多个子域名并且是80端口,但是其实背后只有一台云服务器。

本来也就是想想,正好有个好朋友最近也遇到了这个需求,就直接准备搞一下,找找具体的解决方法。

解决方案

刚开始的想法是这样的,在我的云服务器上装个Tomcat,然后将Tomcat监听端口从8080改为80。然后自己写个Java Web的程序,接受所有发到80端口的请求,然后再获得请求的子域名,根据不同的子域名转发请求到不同的内部服务的其他端口。但是感觉自己写,可能没法很好地处理,造成性能很低,遂作罢。

然后又上网找了一下其他方案,然后发现了nginx。nginx是一个高性能的HTTP反向代理服务器,关于它的介绍,这里不再赘述,大家可以自行搜索资料了解。这里的nginx服务器可以通过配置,监听80端口,并且可以将80端口的请求根据不同的子域名转发到不同的内部端口,正好满足了我的需求,所以选定了nginx来实现。

具体实施

下面来实战演示整个过程。

演示环境

云服务器使用的是Ubuntu16.04

安装nginx服务器

使用下面的命令安装nginx。

sudo apt install nginx
配置nginx服务器

在安装完nginx服务器以后,nginx的配置文件在/etc/nginx/nginx.conf,然后我么看到这个配置文件中有这样的一段内容。

http {#......include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}

说明nginx的默认配置文件中包含加载了这两个目录下的配置文件,所以我们可以在/etc/nginx/conf.d/这个目录下创建以.conf结尾的文件,在里面配置我们的个性化配置就ok了。

所以我们在/etc/nginx/conf.d/这个目录下使用vi创建a.confb.conf来分别表示我们需要解析映射的两个子域名。然后在这两个文件中分别写入下面的内容。

server {listen       80;server_name  a.codekong.cn;location / {proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;proxy_set_header X-NginX-Proxy true;proxy_pass http://127.0.0.1:3000/;proxy_redirect off;}
}

其实我们需要关注的就两行内容,下面这一行是表示你要映射处理的子域名,我这里是a.codekong.cn

server_name  a.codekong.cn;

还有就是下面这行用来表示你将这个子域名的请求转发到服务器的哪个端口进行处理,这里是3000这个端口。

proxy_pass http://127.0.0.1:3000/;

同样的,我们再配置一下将b.codekong.cn的请求转发到服务器内部的4000这个端口,配置文件如下:

server {listen       80;server_name  b.codekong.cn;location / {proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;proxy_set_header X-NginX-Proxy true;proxy_pass http://127.0.0.1:4000/;proxy_redirect off;}
}

这样就配置好了。

配置域名解析

下面我们开始配置子域名的解析,分别添加a.codekong.cnb.codekong.cn两个子域名的解析到我自己的云服务器,入下图所示:

我这里解析配置完后缓存会在10分钟后失效,也就是域名解析会在10分钟后生效,大家依据自己的配置来定。

安装NodeJS

到上面这一步其实我们就已经成功了,但是我们下面可以使用NodeJs写一段程序来验证一下,所以必须先按照下面的命令按照NodeJs。

sudo apt install nodejs
sudo apt install nodejs-legacy
sudo apt install npm

执行完上面的命令就安装好了Node环境,为我们下一步测试做好了准备。

测试验证

我们使用Node来写一段最简单的程序来验证一下,程序如下:

var http = require('http');http.createServer(function (request, response) {response.writeHead(200, {'Content-Type': 'text/plain'});response.end('Hello World I am from A server\n');
}).listen(3000);// 终端打印如下信息
console.log('Server running at http://127.0.0.1:3000/');
var http = require('http');http.createServer(function (request, response) {response.writeHead(200, {'Content-Type': 'text/plain'});response.end('Hello World I am from B server\n');
}).listen(4000);// 终端打印如下信息
console.log('Server running at http://127.0.0.1:4000/');

然后我们先使用下面的命令启动nginx监听80端口

sudo service nginx start

然后我们再使用Node启动我们上面的那段测试代码

node servera.js

然后访问http://a.codekong.cn就可以看到浏览器输出响应了。然后测试一下另一个子域名也是可以正常响应的。
到这里,我们就已经成功使用nginx实现了单主机多域名映射了。

遇到的问题

整个的探索过程中也遇到了一下问题,这里记录一下。
1. nginx启动失败,报下面的错误信息

Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

这个最可能的原因是80端口被其他程序占用了,可以使用下面的命令查看占用80端口的程序的名称和PID

sudo lsof -i:80

然后输出下面的信息

COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
apache2 18472     root    3u  IPv4 12682582      0t0  TCP *:http (LISTEN)
apache2 18475 www-data    3u  IPv4 12682582      0t0  TCP *:http (LISTEN)
apache2 18476 www-data    3u  IPv4 12682582      0t0  TCP *:http (LISTEN)

可以看出我这里是apache占用了80端口,所以可以使用命令吧apache停止了即可,也可以使用下面的命令直接把进程杀死

sudo kill -9 [进程PID]
  1. nginx报启动失败
    这次端口没被占用,报错依然是下面的信息
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

看不出原因就按错误提示使用下面的命令查看详细的报错信息

sudo systemctl status nginx.service

输出信息如下:

nginx.service - A high performance web server and a reverse proxy serverLoaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)Active: failed (Result: exit-code) since Wed 2018-09-12 01:07:34 CST; 16s agoProcess: 18137 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)Process: 18616 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)Process: 22450 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)Main PID: 22563 (code=exited, status=0/SUCCESS)Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: Starting A high performance web server and a reverse proxy server...
Sep 12 01:07:34 VM-163-140-ubuntu nginx[22450]: nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
Sep 12 01:07:34 VM-163-140-ubuntu nginx[22450]: nginx: configuration file /etc/nginx/nginx.conf test failed
Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: nginx.service: Control process exited, code=exited status=1
Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: Failed to start A high performance web server and a reverse proxy server.
Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: nginx.service: Unit entered failed state.
Sep 12 01:07:34 VM-163-140-ubuntu systemd[1]: nginx.service: Failed with result 'exit-code'.

然后在错误信息里面看到了下面这句

nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)

第一反应是IPV6的问题,想起来因为上次在云服务器上安装docker,IPV6存在问题,直接把云服务器的IPV6禁用了,而nginx是默认同时支持IPV4和IPV6协议的,所以我禁用了IPV6就会报错,所以处理办法是禁用掉nginx的IPV6。

但是nginx的IPV6配置在哪里修改呢,看一下我们最开始展示的/etc/nginx/nginx.conf这个配置文件中的下面这样

include /etc/nginx/sites-enabled/*;

我们在这个目录下发现了一个叫default的链接文件,它的链接信息可以通过ls -al查看,信息如下:

default -> /etc/nginx/sites-available/default

然后我们打开这个文件,看到里面的内容是这样的

server {listen 80 default_server;listen [::]:80 default_server;
}

其中第二行就是对IPV6的支持,直接注释了,重新启动nginx即可。

总结

上面就是今晚的一个探索过程,记录一下,分享给有需要的人。

nginx实现单主机多域名映射相关推荐

  1. linux如何开启sni服务,Nginx开启单IP多SSL证书支持-TLS SNI support

    Nginx支持单IP多域名SSL证书需要OpenSSL支持,由于CentOS5.X系统自带的OpenSSL版本太低不支持,所以首先需要编译安装一个高版本的openssl,CentOS 6.X的系统自带 ...

  2. nginx做域名映射到指定端口(阿里云服务器、阿里域名服务)

    文章目录 前言 一.初始工作 二.准备工作 1.GCC编译器 2.安装zlib 3.安装pcre.pcre-devel 4.安装openssl 三.nginx 1.下载 2.安装nginx 三.域名映 ...

  3. Nginx网站服务与虚拟Web主机(域名、IP、端口)

    文章目录 一.Nginx概述 1.什么是Lginx 2.Nginx工作原理 3.Nginx 的模块从功能上分为如下三类 4.Nginx的模块从结构上分为核心模块.基础模块和第三方模块 二.搭建Ngin ...

  4. 本地nginx多域名映射

    前言: 工作两年多了,一直感觉技术上没有太大的长进,好多东西感觉会但是给别人讲起来的时候又感觉和没学过一样.以后希望能坚持写博客,把看过的东西都一点一滴积累下来.言归正传,今天要说的是nginx与ho ...

  5. 使用nginx实现一个主机部署多域名指向不同docker项目

    使用nginx实现一个主机部署多域名指向不同docker项目 原文:使用nginx实现一个主机部署多域名指向不同docker项目  1,安装 docker yum install docker 使用D ...

  6. Linux深入篇之一:配置Nginx Web服务器及多域名主机

    Linux深入篇之一:配置Nginx Web服务器及多域名主机 一.Nginx简介 nginx [engine x]是Igor Sysoev编写的一个HTTP和反向代理服务器,另外它也可以作为邮件代理 ...

  7. nginx端口转发+域名映射

    前段时间在Centos7下成功搭建了apache文件服务器 → 时光隧道 如上图,我只能通过IP+端口的方式来访问,现在我想提升一下逼格,通过自定义域名就可以访问,比如my.apache.com!说干 ...

  8. 远程拷贝、查看端口、vim常见快捷键、查找替换命令、grep命令、查看存储空间的命令、chkconfig命令、系统自动启动级别、主机名配置、IP地址配置、域名映射、防火墙设置

    2.1.远程拷贝 (将/export/servers/hadoop上的文件拷贝到bigdate@192.168.1.1:/export/servers/ ) scp –r /export/server ...

  9. nginx虚拟主机(基于域名虚拟主机、基于IP地址虚拟主机、基于端口虚拟主机设置)

    文章目录 Nginx支持的虚拟主机有三种 配置环境 配置DNS域名 安装环境 安装nginx 制作管理脚本 基于域名 基于端口 基于IP 基于用IP地址访问域名 Nginx支持的虚拟主机有三种 ●基于 ...

最新文章

  1. hdu 3395(费用流,二分图的最大权匹配)
  2. Traffic Flow Forecasting: Comparison of Modeling Approaches文献阅读笔记(一)
  3. fs7宽容度_《如果蜗牛有爱情》,FS7拍出电影级质感!
  4. Jmeter(二十五)Jmeter之系统函数
  5. [leetcode]687. Longest Univalue Path
  6. 核心显卡是新一代的智能图形核心
  7. Hello,Views(六)下拉框Spinner(附源码)
  8. java 银行系统_JAVA之银行系统1
  9. 小分子php蛋白,如何研究小分子抑制蛋白降解途径? - 分子生物 - 小木虫 - 学术 科研 互动社区...
  10. Wireshark实战分析之IP协议(二)
  11. 揭秘黑石、橡树等巨头的不良资产赚钱术
  12. 在windows系统下制作虚拟软驱
  13. 给new comer程序员的建议
  14. 童年辣条神话卫龙,首日破发“辣条第一股”,跌超10亿
  15. radius mysql md5_Radius认证
  16. 运用js计算个人税收
  17. 拯救者R7000ubuntu18.04解决分屏问题(NVIDIA显卡驱动安装)
  18. SaaS订阅收费模式的精髓是:预充值
  19. 进入U盘PE系统无法识别硬盘分区的原因分析和解决方法
  20. 利用clipboardJs 点击按钮复制文本

热门文章

  1. Codeforces ~ 1063C ~ Dwarves, Hats and Extrasensory Abilities (交互题,二分)
  2. Android 获取手机所有短信
  3. python数据可视化开发(2):pandas读取Excel的数据格式处理(数据读取、指定列数据、DataFrame转json、数学运算、透视表运算输出)
  4. 为什么需要虚继承,虚继承的实现原理
  5. 04-dropbear
  6. 715. Range Module
  7. SQL-视图(view)
  8. Windows下如何快速查看并导出系统详细信息(计算机名、操作系统、系统制造商、系统型号、BIOS、CPU及内存大小)
  9. MATLAB之多项式计算
  10. 订阅发布功能Java实现