V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Ghkitg
V2EX  ›  程序员

需要一个 Ubuntu 的 VPS 多域名架设 Apache 及使用 LE 证书最简便方法

  •  
  •   Ghkitg · 2017-11-14 12:42:02 +08:00 · 1471 次点击
    这是一个创建于 2348 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    双十一买了几个域名和一台 VPS ( Ubuntu 的)的主机,打算把域名都放在 VPS 上,建立好 Nginx 的,Apache 和 LE 证书。 看了一下相关教程都是比较复杂的,自已对于 Linux 的不熟悉,因为抱持着 “是只做一次的事情” 的心态,于是不想折腾和学习, 想要做一个伸手党...相信各位前辈也有相关经验,集成了一些简便快捷的方法,在这虚心学习。

    这个时候前辈可能会说教程得到知识也不比在这里得到的差,甚至给你的也是一些教程。所以这里先说一下,教程可能是给特定人群的,可能会添加一些奇怪的东西,教程可能不是最新的,会导致一些意外问题......但是前辈给出的方法是经验的精华,也可能是针对我的理解而给出的一些建议,这对于我在许多不完整的教程中学习来得更好。

    一些背景和理解(一些我对这些事情的做法和流程的理解)

    虽然作为伸手党,但 “人没有付出就什么也得不到,要想得到什么就必须付出同等的代价” 于是我省下一些实行教程的时间写下一些理解,希望前辈更能了解我的需求。

    背景

    简单地说就是在多个域名也可以指向我的一台 VPS,它们都是用 LE 证书并能够自动续期,因为域名和 VPS 都有 5 年时间,所以希望这个自动续期是穏定的。在访问每个域名下,都能自动从 HTTP 跳到 HTTPS。而这些域名后端都是用了 Apache,PHP。当然 Go 和 NodeJS 也可能会有。

    建置

    sudo apt-get update
    sudo apt-get install apache2
    sudo apt-get install nginx
    sudo apt-get -y install git
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get install python-certbot-apache
    

    多域名

    在我得到的资讯下,Nginx 和 Apache 都有各自的多域名设置

    以下是设置 Nginx 的静态内容服务和 Proxy 到 Apache HTTPS.

    Nginx 是这样的( default.conf )

    server
    {
        listen 80;
        listen [::]:80;
        listen 443;
        listen [::]:443;
        
        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
        ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    	ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
        server_name example.com;
        rewrite ^/(.*) https://www.example.com/$1 permanent;
        root /home/www/example.com;
        index index.html index.php;
    }
    
    server
    {
        listen 80;
        listen [::]:80;
        listen 443;
        listen [::]:443;
    
        server_name example2.com;
        location / {
    
              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_set_header        X-Forwarded-Proto $scheme;
              proxy_pass              http://localhost:81;
              proxy_read_timeout      90;
              proxy_redirect          http://localhost:81 https://localhost:81;
              }
    }
    

    Apache 是这样的( httpd-vhosts.conf)

    <VirtualHost *:81>
        DocumentRoot "/home/www/example2.com"
        ServerName www.example2.com
    </VirtualHost>
    
    <VirtualHost *:82>
        DocumentRoot "/home/www/example3.com"
        ServerName www.example3.com
    </VirtualHost>
    
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
    

    www 目录

    sudo mkdir -p /home/www/example.com
    sudo mkdir -p /home/www/example2.com
    sudo mkdir -p /home/www/example3.com
    sudo chown -R $USER:$USER /var/www/example.com
    sudo chown -R $USER:$USER /var/www/example2.com
    sudo chown -R $USER:$USER /var/www/example3.com
    sudo chmod -R 755 /var/www
    

    LE 证书

    sudo certbot --nginx -d example.com
    sudo certbot --apache -d example2.com -d example3.com
    

    证书自动续期

    sudo crontab -e
    30 12 * * * /usr/bin/certbot renew --quiet
    
    第 1 条附言  ·  2017-11-14 13:44:57 +08:00
    更正:www 目录的 var 应是 home
    datou
        1
    datou  
       2017-11-14 15:24:09 +08:00
    caddy 搞定一切
    momocraft
        2
    momocraft  
       2017-11-14 16:28:55 +08:00
    如果你用 docker: 我用的申请证书的 image: https://github.com/adferrand/docker-letsencrypt-dns 可以自动申请 /更新证书,并在更新后重启别的容器 (如 nginx) 。我觉得对于会用 docker 的人是个不错的方案 (nginx 一个容器,证书申请一个容器,每服务的 content server 一个容器)。

    另外五年不用动这个期待可能有点高,LE 的 API 都未必能五年不变,我觉得有过期监视就行了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2793 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 12:31 · PVG 20:31 · LAX 05:31 · JFK 08:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.