我只有一台服务器,但我想在这台服务器上运行多个项目,怎么办?

总不能靠加端口区分吧?

百度和Google是个好东西,于是我找到了答案,使用nginx。

通过nginx,我可以给我的一台服务器配置两个域名,然后通过不同的域名访问我的两个项目。

实现方式

大概流程是这么玩的,你在服务器配置好nginx,让nginx监听80(http端口)和443(https端口),然后在nginx配置文件写明转发到哪里。

比如我有一个博客系统,还有一个邮件系统。

为了区分开,我给了这两个项目分别两个域名:blog.tandk.commail.tandk.com

是的,这两个域名都是同属一个主域名tandk.com下的,以我上面的例子来说,你只要在域名服务商那里购买一个叫tandk.com的域名,就可以通过配置,无需购买获得上面两个域名。

具体的配置过程其实也挺简单,我只在腾讯云配过,其他的平台应该大同小异,如果你不大了解,可以看看我的这篇文章:《腾讯云配置多个域名前缀》

回到nginx,两个域名有了,我要配置nginx的配置文件,要告诉nginx,当我访问blog.tandk.com时,转发到内网的8080端口,当我访问mail.tandk.com时,转发到内网的8181端口。

再配好ssl证书,就可以正常访问了。

ssl证书可以让你用https访问你的域名,如果你觉得http可以满足的话,那么不需要ssl也行。

具体实现

思路有了,接下来便是一步一步完成。

看到标题会点进来的,我就当你对docker有一定了解了,这里就不提怎么安装docker了。

我们直接用docker安装nginx:

# 安装
docker pull nginx # 安装后查看docker镜像
docker images

安装就只需要一个命令,连安装包都不用自己找,这就是我用docker的原因。

建目录用于存放nginx配置文件、证书文件:

mkdir /opt/docker/nginx/conf.d -p
mkdir /opt/docker/nginx/cert -p

nginx的ssl证书长这个样子,两个都要,中间打码的是你的域名:

把他们俩放到服务器的/opt/docker/nginx/cert目录下。

查看内网的ip,记录下来,等下写配置文件要用:

# linux查看内网ip
ifconfig

接下来说说配置文件的一点注意事项。

了解docker的都知道,docker容器启动后,容器内部有自己的文件系统,配置文件也在里面。

因此我们需要把配置文件挂载到外部,就是我们的linux服务器上。

这样我们每次需要修改nginx的配置文件的时候,只要修改挂载到外部的文件,容器内的文件也会相应改变,能省很多功夫。

强烈建议挂载文件!!!不然的话会有很多坑,自身的血泪说出这句话。

要挂载文件,首先需要启动nginx,进去容器内部查看配置文件在哪里,并将其复制出来:

# 启动nginx
docker run --name nginx -p 80:80 -d nginx # 进入docker的nginx容器
docker exec -it nginx bash

确定进入容器内部后,用下面两个命令查找nginx的配置文件在哪:

# 查找nginx配置文件default.conf
# 这个在/etc/nginx/conf.d/default.conf
find / -name "default.conf" # 查找nginx配置文件nginx.conf
# 这个在/etc/nginx/nginx.conf
find / -name "nginx.conf"
# 注:两者不在同一目录下。

接下来退出容器(进入容器内部只是确认一下配置文件的位置而已):

exit

使用docker的cp命令把这两个配置文件复制到刚刚建好的目录下:

# 把docker内的default.conf复制到外部
docker cp nginx:/etc/nginx/conf.d/default.conf /opt/docker/nginx/conf.d/default.conf # 把docker内的nginx.conf复制到外部
docker cp nginx:/etc/nginx/nginx.conf /opt/docker/nginx/conf.d/nginx.conf

保险起见,这个时候先不修改容器外部的配置文件,先挂载文件启动docker,启动成功了,确定没问题了,再去修改配置文件。

首先停掉之前的容器并删除:

# 停止容器
docker stop nginx # 删除容器
docker rm -f nginx

带着挂载文件的命令启动nginx:

# 挂载
docker run --name nginx -p 80:80 -p 443:443 -v /opt/docker/nginx/conf.d/nginx.conf:/etc/nginx/nginx.conf -v /opt/docker/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /opt/docker/nginx/cert:/etc/nginx -d nginx

-p命令表示容器内部和外部监听的端口,这部分不细说。

-v表示挂载的文件,-v [该文件在容器外部的位置]:[该文件在容器内部的位置]

使用下面的命令查看是否启动成功:

# 查看正在运行的容器
docker ps # 查看全部容器,包括没有启动的容器
# 如果上面的命令出现的列表没有nginx,使用这个命令
docker ps -a # 如果确定启动失败了,查看日志定位失败的原因
docker logs nginx

当nginx启动成功后,我们只需要修改配置文件,就可以实现多个域名和https访问的需求啦。

nginx的配置文件有两个,nginx.confdefault.conf

点开看nginx.conf的话,会发现里面引入了default.conf的内容,也就是说这是一个文件分成两个文件来写。

我们只需要修改default.conf的内容即可达到我们的目的。

这里粘一下linux编辑文本的命令:

# 打开文件
vim 文件名 # 进入默认不可编辑,需要按下i后才可以编辑 # 编辑完成后,需要按esc退出编辑状态 # 退出并保存
:wq # 退出不保存
:q!

修改default.conf的内容为如下,需根据你的情况做出改变

server {
listen 80; #侦听80端口
listen 443 ssl; #侦听443端口,用于SSL
server_name tandk.com www.tandk.com; # 自己的域名
# 注意证书文件名字和位置,是从/etc/nginx/下开始算起的
ssl_certificate 1_tandk.com_bundle.crt;
ssl_certificate_key 2_tandk.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on; client_max_body_size 1024m; location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 这里写的是我的腾讯云内网地址,不知道为啥,不能用127.0.0.1...
proxy_pass http://xx.xx.xx.xx:8090;
}
}

这上面便配好了一个域名的https和http访问,假如你想多配一个域名,拿我上面的blog.tandk.commail.tandk.com来举例,每个域名要加多一个server:

server {
listen 80; #侦听80端口
listen 443 ssl; #侦听443端口,用于SSL
server_name blog.tandk.com; # 自己的域名
# 注意证书文件位置,是从/etc/nginx/下开始算起的
ssl_certificate 1_blog.tandk.com_bundle.crt;
ssl_certificate_key 2_blog.tandk.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on; client_max_body_size 1024m; location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 这里写的是我的腾讯云内网地址,不知道为啥,不能用127.0.0.1...
proxy_pass http://xx.xx.xx.xx:8080;
}
} server {
listen 80; #侦听80端口
listen 443 ssl; #侦听443端口,用于SSL
server_name mail.tandk.com; # 自己的域名
# 注意证书文件位置,是从/etc/nginx/下开始算起的
ssl_certificate 1_mail.tandk.com_bundle.crt;
ssl_certificate_key 2_mail.tandk.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on; client_max_body_size 1024m; location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 这里写的是我的腾讯云内网地址,不知道为啥,不能用127.0.0.1...
proxy_pass http://xx.xx.xx.xx:8181;
}
}

配置完毕后,保存、停止容器再重启:

# 停止nginx
docker stop nginx # 启动容器
docker start nginx # 查看是否启动成功
docker ps

打开浏览器,分别用http和https访问你配置的域名,来确认是否成功。

查看https是否生效,可以按下面的截图来查看:

关于ssl证书的坑

如果你细心点,看我上面的配置文件会发现,两个server,随着域名的不同,ssl证书的名字也不一样了。

对的,对于每一个不同的子域名,我都需要去申请一个ssl证书。

对于mail.tandk.com,我需要去申请一个ssl证书,对于blog.tandk.com,我还需要去申请一个新的ssl证书。

那么能不能申请一个通配的证书去适配一个主域名下的所有子域名呢。

有的,花钱。

别的平台我不太清楚,腾讯云有那种证书,比如你可以申请一个*.tandk.com的证书,那样你所有子域名就都能用这个证书了。

但是我看了一下这种证书一年要花1600,像我这种穷逼还是算了,反正申请一个免费证书也花不了多少时间。

给你看看有钱人家和穷逼的区别:

我(穷逼),一个子域名一个证书:



有钱人家,一个通配证书配所有子域名:

腾讯云对于免费的证书限制是这样的:

  • 免费证书不能通配。就是上面说的,虽然同属于tandk.com这个主域名,但是我每多一个子域名,比如blog.tandk.com,就需要再去申请一个专属于blog.tandk.com的ssl证书。

  • 一个主域名只能申请20张ssl证书。

  • 证书吊销后,还会在15个月内,占用这20个证书的名额。

好家伙,这是逼着我们去买通配证书啊,不过想了想,免费证书对我这种自己玩一玩的其实够用了。

20个项目,我是用不了那么多的,而且要真要那么多,我也多买几个服务器和域名了,腾讯还是良心的。(腾讯快给广告费!)

以上,参考自下面的内容:

《docker安装nginx并配置https》

《docker上启动nginx,并配置修改nginx的配置文件》

《一台服务器通过nginx配置多个域名(80端口)》

感谢各位大佬的无私教程!

使用docker部署nginx并配置https的更多相关文章

  1. 使用docker部署nginx+tomcat架构(3):使用docker-compose简化部署操作

    经历了之前的两篇,我们已经大体上了解了docker部署容器的过程. 使用docker部署nginx+tomcat架构 使用docker部署nginx+tomcat架构():访问mysql数据库 不过, ...

  2. docker(部署常见应用):docker部署nginx

    上回说到centos安装docker. 这次用实战,docker部署运行常见的应用. docker常用命令 参看:docker命令大全.这里不做赘述. docker部署nginx 1.docker h ...

  3. Docker部署Nginx并修改配置文件

    Docker部署Nginx并修改配置文件 一.拉取nginx镜像 docker pull nginx 二.在宿主机中创建挂载目录 mkdir -p /data/nginx/{conf,conf.d,h ...

  4. Docker部署Nginx应用(2)

    Docker部署Nginx应用(2) 1.拉取Nginx镜像 [root@localhost ~]# docker pull nginx Using default tag: latest lates ...

  5. Nginx 高级配置-https 功能

    Nginx 高级配置-https 功能 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTTPS工作过程 1>.SSL/TLS SSL(Secure Socket Lay ...

  6. 使用docker部署nginx+tomcat架构(2):访问mysql数据库

    上一篇完成了通过docker部署nginx+tomcat的基础软件架构,但是距离一个真正可用的软件架构还差得很远.其中最重要的一点是缺少数据库这个角色的存在,那么本篇就来完善这一点. 废话少说,直接进 ...

  7. Nginx中配置https中引用http的问题

    Nginx中配置https中引用http的问题 遇到问题: 今天公司要在后台增加直播入口,使用腾讯云的实时音视频,要求是必须使用https,在配置完强制跳转https候,发现后台无法上传图片,在浏览器 ...

  8. docker安装nginx并配置通过https访问

    1. 下载最新的nginx的docker image docker pull nginx:latest 创建挂载路径 2.准备nginx需要的文件 nginx的配置文件 首先是nginx.conf文件 ...

  9. docker 部署nginx 使用keepalived 部署高可用

    一.体系架构 在Keepalived + Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故 ...

随机推荐

  1. 设置 ajax 同步获取数据

    问题 在处理DataTable的render进行列表渲染的时候发现通过ajax发送请求,返回的值并不正确. {"data":"id","render& ...

  2. Charles-抓取https请求

    在未经设置之前,Charles是无法抓取https请求的,会出现unknown的标识.我们可以通过以下两步设置,解决该问题. 第一步:安装证书 https是在http的基础上加入ssl层,通过ssl来 ...

  3. 解决win10 cmd运行python弹出windows应用商店下python应用程序

    方法一: 1.我一开始下载完python后,忘记下载到哪个位置,在win10底下输入框搜索python,点击打开文件所在位置,所在位置是python快捷键的位置,直接复制进行环境配置 配置完环境变量后 ...

  4. Gitlab - 安装的社区版 Gitlab-ce,解决访问网页报502-Whoops, GitLab is taking too much time to respond的问题

    问题背景 在自己虚拟机(centos7)上装了 Gitlab-ce,就是社区版的 Gitlab,版本是 13.0+ 问题描述 浏览器访问 Gitlab 网站,报 502 问题翻译 502-Whoops ...

  5. aes加解密后续问题contentType不是application/json时候后台解析请求对象request

    一.post请求的三种content-type 1.application/x-www-form-urlencoded 主要用于如下:1.1: 最常见的POST提交数据方式.1.2:原生form默认的 ...

  6. 【第七篇】- Git 分支管理之Spring Cloud直播商城 b2b2c电子商务技术总结

    ​ Git 分支管理 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作. 有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 ...

  7. Devexpress 饼状图

    <dxc:ChartControl Name="chart"                                BorderThickness="0&q ...

  8. Java入门准备:Java开发环境的安装与卸载

    Java的三大版本 JavaSE:标准版 JavaME:嵌入式开发 JavaEE:企业级开发 JDK(Java Development Kit):Java开发者工具包 JRE(Java Runtime ...

  9. Selenium系列5-XPath路径表达式

    Xpath介绍 XPath 使用路径表达式在 XML 文档中进行导航 XPath 使用路径表达式来选取 XML 文档中的节点或者节点集.这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似. ...

  10. Hyper-V + WSL2与 VirtualBox 共存

    Hyper-V + WSL2与 VirtualBox 共存 这样的教程网上有很多,我先简单复述一下.真正麻烦的是我遇到的问题--开启 Hyper-V 后我的电脑会多出几个删不掉的虚拟显示器来,会在文章 ...