近日新买域名给自己的个人主页安了个家,然后就有了把各个界面放到二级域名的需求,这种域名结构相信大家都接触过,比如qq.com主域名,open.qq.com则是他的二级域名,两个网页打开是不同的业务,但是同属于一家公司,并且这样也能节省域名的成本,相信自己做过站的都会考虑二级域名这种有逼格的东西。
环境
我使用的是Nodejs服务器,这个服务器本身是可以自定义监听接口的单线程服务器,所以实现二级域名的不同业务处理,我的想法是,在主机上运行多个监听不同端口的server,比如监听5001,5002,5003,然后配置Nginx文件实现逻辑的分发,然后再把域名解析成二级域名均绑定在同一主机的80端口上。下面依次为大家展示步骤。
二级域名解析
首先要有一个自己的域名(废话),然后进入域名解析的后台,我使用的是某云的,就以本站的域名为例为大家介绍。
进入后台


OK,域名这块就设置好了,大约10分钟生效,在没有配置服务器的情况下,输入这些域名都可以访问到主机的80端口,显然这还不是我们想要的,我们希望通过不同的域名,返回不同的业务逻辑。
Nginx安装
Nginx是什么东西呢?在本案例中姑且认为他是一个反向代理的工具,反向代理的概念可以自行百度,我理解就是一个服务器的交通协管员,外界来了http请求后,由这个工具决定把请求交给下属的哪个服务器处理。
安装可直接在nginx官网下载对应版本,我下载的是window版的,解压后就可以运行。这块不再累述,假定已经成功安装。
下面是解压后的目录,虽然可以直接双击nginx.exe运行nginx服务,但还是推荐用命令行工具,运行命令行工具到该目录,如果在C盘,建议给管理员权限。
tips: 在当前目录按住Shift + 右键,即可快速打开当前目录的命令行

先来简单介绍下nginx,命令行的指令:
运行nginx服务:start nginx.exe
重新加载nginx配置: nginx -s reload
关闭nginx服务:nginx -s quit
我在使用过程中用到的指令就这三个,如果有其他需求请自行百度。
Nginx配置
nginx配置文件是 yourNginxdir/conf/nginx.conf
通过文本编辑器就可以打开,里面是这样的
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pidlogs/nginx.pid;
events {
worker_connections 1024;
}
http {
include 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 logs/access.log main;
sendfileon;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
#root html;
#fastcgi_pass 127.0.0.1:9000;
#fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
#includefastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#listen 8000;
#listen somename:8080;
#server_name somename alias another.alias;
#location / {
#root html;
#index index.html index.htm;
#}
#}
# HTTPS server
#
#server {
#listen 443 ssl;
#server_name localhost;
#ssl_certificate cert.pem;
#ssl_certificate_key cert.key;
#ssl_session_cacheshared:SSL:1m;
#ssl_session_timeout 5m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#ssl_prefer_server_ciphers on;
#location / {
#root html;
#index index.html index.htm;
#}
#}
}
代码结构是酱紫的:
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server#server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
我们只需要更改http里面的server就可以实现需求,nginx还可以应用到很多别的需求上,所以建议深入了解下他的配置文件,本人接触这个时间过短,不敢混淆视听。
言归正传我贴一下更改后的代码:
http{
...
server{
listen 80;
server_name todo.ljybill.com; #访问域名
location /{
proxy_pass http://127.0.0.1:5001; #转发到的端口号
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server{
listen 80;
server_name blog.ljybill.com; #访问域名
location /{
proxy_pass http://127.0.0.1:5002; #转发到的端口号
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
由上面代码可知,server可同时定义多个,每个server对应一个二级域名,这样就配置好了各个二级域名的端口,最后别忘了执行 nginx -s reload 指令重新加载配置。
至此,二级域名从解析到服务器都已经配置好,直接访问域名就可以访问到各个端口。
总结
由于本人接触ngxinx时间也特别短,所以有不对的地方欢迎大家批评指正,写这个文章主要是因为在配置Nginx的时候查找很多博客介绍的并不清晰,希望写出个能让大家一看就懂的教程来,如果大家这篇也看的不明白可以联系我哪不明白,我会更详细的介绍下。
