mirror of
https://github.com/wahyd4/wahyd4.github.com.git
synced 2026-08-09 05:15:56 +10:00
Site updated: 2017-09-19 17:52:10
This commit is contained in:
+152
-183
@@ -272,6 +272,157 @@
|
||||
|
||||
|
||||
|
||||
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
|
||||
|
||||
|
||||
|
||||
<div class="post-block">
|
||||
<link itemprop="mainEntityOfPage" href="http://toozhao.com/2017/09/19/caddy/">
|
||||
|
||||
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
|
||||
<meta itemprop="name" content="Junv">
|
||||
<meta itemprop="description" content="">
|
||||
<meta itemprop="image" content="http://7ktsrz.com1.z0.glb.clouddn.com/libr.jpg?imageView2/1/w/200/h/200/q/90|imageslim">
|
||||
</span>
|
||||
|
||||
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
|
||||
<meta itemprop="name" content="大染志">
|
||||
</span>
|
||||
|
||||
|
||||
<header class="post-header">
|
||||
|
||||
|
||||
|
||||
<h1 class="post-title" itemprop="name headline">
|
||||
|
||||
<a class="post-title-link" href="/2017/09/19/caddy/" itemprop="url">快速上手更简单的 Web 服务器 —— Caddy</a></h1>
|
||||
|
||||
|
||||
<div class="post-meta">
|
||||
<span class="post-time">
|
||||
|
||||
<span class="post-meta-item-icon">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
</span>
|
||||
|
||||
<span class="post-meta-item-text">发表于</span>
|
||||
|
||||
<time title="创建于" itemprop="dateCreated datePublished" datetime="2017-09-19T16:23:53+08:00">
|
||||
2017-09-19
|
||||
</time>
|
||||
|
||||
|
||||
|
||||
<span class="post-meta-divider">|</span>
|
||||
|
||||
|
||||
|
||||
<span class="post-meta-item-icon">
|
||||
<i class="fa fa-calendar-check-o"></i>
|
||||
</span>
|
||||
|
||||
<span class="post-meta-item-text">更新于:</span>
|
||||
|
||||
<time title="更新于" itemprop="dateModified" datetime="2017-09-19T17:50:51+08:00">
|
||||
2017-09-19
|
||||
</time>
|
||||
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="post-body" itemprop="articleBody">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<p><img src="https://wx2.sinaimg.cn/mw1024/49fcaea6gy1fjp0hua3q1j20yp0l7dzc.jpg" alt="Caddy"></p>
|
||||
<p>说到Web 服务器,我们大多想到的是 Apache 这个老前辈和如日中天的Nginx,但是这里今天我将要分享的是 Web 服务器和反向代理服务器的新秀 Caddy。在我们拥有了这么强大的 Nginx 以后我们为什么还需要 Caddy?<br>我认为 Caddy 之所以可以占有一席之地是因为它的两大法宝:<code>配置简单</code> 和 <code>自动启用 HTTPS</code>。下面带下面快速上手这个软件。</p>
|
||||
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>Caddy 提醒定制化的下载,可以自由选择各种插件和平台。请前往: <a href="https://caddyserver.com/download" target="_blank" rel="external">https://caddyserver.com/download</a> 下载。 也可以使用这个一键安装脚本:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl https://getcaddy.com | bash</div></pre></td></tr></table></figure></p>
|
||||
<p>完成之后,我们可以尝试执行下<code>caddy -version</code>。 当你看到有有类似:<code>Caddy 0.10.9</code>,即表示安装成功。</p>
|
||||
<h2 id="Hello-World"><a href="#Hello-World" class="headerlink" title="Hello World"></a>Hello World</h2><p>在命令行里面直接输入<code>caddy</code>,然后打开浏览器输入: <code>http://ip:2015</code>。 看到什么了吗? 你得到了一个404页面。Caddy 已经成功运行了。相比与其他浏览器需要各种配置文件才能运行相比,这就是 Caddy 的简单之处,不需要任何配置文件即可运行。当然当我们需要各种高级功能的时候,配置文件还是必不可少的。</p>
|
||||
<p>默认情况下,Caddy 运行在<code>2015</code> 端口。我们可以可以 Caddy 强大的命令行工具来自定义运行端口。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">caddy -p 80</div></pre></td></tr></table></figure></p>
|
||||
<p>在无配置文件的情况下,Caddy 默认是映射当前程序执行的目录所有文件。因此我们可以快速创建一个文件:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">echo</span> <span class="string">"<h1>Hello Caddy</h1>"</span> >> index.html</div></pre></td></tr></table></figure></p>
|
||||
<p>再次刷新浏览器,刚才我们写的 <code>Hello Caddy</code> 已经出现在页面上了</p>
|
||||
<h2 id="强大的配置文件"><a href="#强大的配置文件" class="headerlink" title="强大的配置文件"></a>强大的配置文件</h2><p>Caddy 各种强大的功能还得需要 Caddyfile 体现。我们可以在任意目录放置我们的配置文件,通过命令行<code>caddy -conf</code> 即可指定</p>
|
||||
<h3 id="Host-目录下的网页"><a href="#Host-目录下的网页" class="headerlink" title="Host 目录下的网页"></a>Host 目录下的网页</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">0.0.0.0:8080 {</div><div class="line"> root /usr/local/www/</div><div class="line">}</div></pre></td></tr></table></figure>
|
||||
<p>这里简单解释下,<code>0.0.0.0</code> 表示我们将网站绑定至可以访问到本机的任意一个 IP;<code>8080</code>表示我们将网站暴露在8080端口; <code>root</code> 参数则表示网站的根节点。这就是最简单的一个Host 网站的配置。</p>
|
||||
<p>当前我们可以对网站添加更多的配置。比如设置响应过期时间,启用 gzip, 指定各种日志的输出端。</p>
|
||||
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">0.0.0.0:8080 {</div><div class="line"> root /usr/<span class="built_in">local</span>/www/</div><div class="line"> timeouts 30s</div><div class="line"> gzip</div><div class="line"> <span class="built_in">log</span> /var/<span class="built_in">log</span>/caddy/access.log</div><div class="line"> errors /var/<span class="built_in">log</span>/caddy/error.log</div><div class="line">}</div></pre></td></tr></table></figure>
|
||||
<h3 id="配置反向代理"><a href="#配置反向代理" class="headerlink" title="配置反向代理"></a>配置反向代理</h3><p>什么时候你会需要反向代理呢?想象你有一个前后端分离的程序。前端是通过 JS 发送 Ajax 请求后端 API。默认情况下前端程序占用一个端口,后端占用一个另外端口。我们会遇到两个问题: CORS(跨域请求)和额外的 Options 请求。 这个时候我们就可以使用反向代理让前端和后端共享一个端口。</p>
|
||||
<p>那怎么做呢,在 Caddy 里面也特别简单,假设我们的前端就是上面的那样,而我们的后面之前都运行在:<code>http://ip:4000</code> 下面。而且我们的 后端 API URL 里面都有 <code>/api</code></p>
|
||||
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">0.0.0.0:8080/api {</div><div class="line"> proxy / 127.0.0.0:4000/api {</div><div class="line"> transparent</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
|
||||
<p>这里的配置的意思是说,当浏览器收到所有包含<code>:8080/api</code> 的请求都会自动转发到<code>127.0.0.1:4000/api</code> 这个地址,而<code>:8080/api</code> 后面的地址会自动转发下去,而<code>transparent</code> 这个设置保证了我们的转发不会在浏览器生成任何额外的<code>301</code> 或者<code>302</code>请求。</p>
|
||||
<h2 id="自动-HTTPS"><a href="#自动-HTTPS" class="headerlink" title="自动 HTTPS"></a>自动 HTTPS</h2><p>Caddy 另外一个亮点就是,可以为已经<code>绑定域名</code>的在<code>公网</code>运行的服务器自动从 Let’s Encrypt生成和下载 HTTPS 证书,让你的网站支持 HTTPS 协议访问,保证网站数据传输的安全。很简单,你所需的仅仅是将绑定的 IP 改成域名。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">xxx.com {</div><div class="line"> root /usr/<span class="built_in">local</span>/www/</div><div class="line">}</div></pre></td></tr></table></figure></p>
|
||||
<p>再次运行Caddy,按照提示输入你的 Email 之后。Caddy 会自动帮你获取并启用 HTTPS 证书。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">root@ss2:~<span class="comment"># caddy -conf Caddyfile</span></div><div class="line">Activating privacy features...</div><div class="line">Your sites will be served over HTTPS automatically using Let<span class="string">'s Encrypt.</span></div><div class="line"><span class="string">By continuing, you agree to the Let'</span>s Encrypt Subscriber Agreement at:</div><div class="line"> https://acme-v01.api.letsencrypt.org/terms</div><div class="line">Please enter your email address so you can recover your account <span class="keyword">if</span> needed.</div><div class="line">You can leave it blank, but you<span class="string">'ll lose the ability to recover your account.</span></div><div class="line"><span class="string">Email address: xxxx@gmail.com</span></div><div class="line"><span class="string"> done.</span></div><div class="line"><span class="string">https://xxx.com</span></div><div class="line"><span class="string">http://xxx.com</span></div></pre></td></tr></table></figure></p>
|
||||
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>通过上面的例子,我们可以看出 Caddy的快速上手能力和超级实用的 HTTPS 功能。除此之前 Caddy 还提供一大堆的插件供我们使用。比如直接访问 Markdown 文件、Host Git 仓库的文件、将自身 Metric 数据传到 Prometheus 等等。快去试试吧!</p>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<footer class="post-footer">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="post-eof"></div>
|
||||
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</article>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
|
||||
|
||||
|
||||
@@ -1805,188 +1956,6 @@
|
||||
|
||||
|
||||
|
||||
<footer class="post-footer">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="post-eof"></div>
|
||||
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</article>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
|
||||
|
||||
|
||||
|
||||
<div class="post-block">
|
||||
<link itemprop="mainEntityOfPage" href="http://toozhao.com/2013/11/05/run-jetty-7,-8-with-gradle/">
|
||||
|
||||
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
|
||||
<meta itemprop="name" content="Junv">
|
||||
<meta itemprop="description" content="">
|
||||
<meta itemprop="image" content="http://7ktsrz.com1.z0.glb.clouddn.com/libr.jpg?imageView2/1/w/200/h/200/q/90|imageslim">
|
||||
</span>
|
||||
|
||||
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
|
||||
<meta itemprop="name" content="大染志">
|
||||
</span>
|
||||
|
||||
|
||||
<header class="post-header">
|
||||
|
||||
|
||||
|
||||
<h1 class="post-title" itemprop="name headline">
|
||||
|
||||
<a class="post-title-link" href="/2013/11/05/run-jetty-7,-8-with-gradle/" itemprop="url">使用Gradle 运行jetty 7, 8</a></h1>
|
||||
|
||||
|
||||
<div class="post-meta">
|
||||
<span class="post-time">
|
||||
|
||||
<span class="post-meta-item-icon">
|
||||
<i class="fa fa-calendar-o"></i>
|
||||
</span>
|
||||
|
||||
<span class="post-meta-item-text">发表于</span>
|
||||
|
||||
<time title="创建于" itemprop="dateCreated datePublished" datetime="2013-11-05T17:02:58+08:00">
|
||||
2013-11-05
|
||||
</time>
|
||||
|
||||
|
||||
|
||||
<span class="post-meta-divider">|</span>
|
||||
|
||||
|
||||
|
||||
<span class="post-meta-item-icon">
|
||||
<i class="fa fa-calendar-check-o"></i>
|
||||
</span>
|
||||
|
||||
<span class="post-meta-item-text">更新于:</span>
|
||||
|
||||
<time title="更新于" itemprop="dateModified" datetime="2014-09-28T16:22:49+08:00">
|
||||
2014-09-28
|
||||
</time>
|
||||
|
||||
</span>
|
||||
|
||||
|
||||
<span class="post-category" >
|
||||
|
||||
<span class="post-meta-divider">|</span>
|
||||
|
||||
<span class="post-meta-item-icon">
|
||||
<i class="fa fa-folder-o"></i>
|
||||
</span>
|
||||
|
||||
<span class="post-meta-item-text">分类于</span>
|
||||
|
||||
|
||||
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
|
||||
<a href="/categories/gradle/" itemprop="url" rel="index">
|
||||
<span itemprop="name">gradle</span>
|
||||
</a>
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
,
|
||||
|
||||
|
||||
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
|
||||
<a href="/categories/gradle/java/" itemprop="url" rel="index">
|
||||
<span itemprop="name">java</span>
|
||||
</a>
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="post-body" itemprop="articleBody">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<p>为什么我有这个需求呢? 作为一个使用Gradle的新手,今天在尝试将我之前的一个小应用从maven转向 gradle的时候,发现官方的jetty gradle plugin 不能正常运行我的应用,抛出的异常是: </p>
|
||||
<blockquote>
|
||||
<p>java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext()Ljavax/servlet/ServletContext;</p>
|
||||
</blockquote>
|
||||
<p>经过搜索后发现,这是因为 jetty容器中的 servlet API 不是3.0 版本的缘故,继续查证,发现 目前gradle 官方的jetty plugin 版本只支持jetty 6,而 jetty 6 里面的servlet 的版本是2.5。这是从一个Gradle的核心developer那里得到的答案。 </p>
|
||||
<blockquote>
|
||||
<p>Gradle’s Jetty plugin is outdated and only supports Jetty 6. </p>
|
||||
</blockquote>
|
||||
<p>因此我只能转而向其他途径去解决这个问题,最终发现了Cargo,其官方网站中对Cargo 的解释是: </p>
|
||||
<blockquote>
|
||||
<p>Cargo is a thin wrapper that allows you to manipulate Java EE containers in a standard way. </p>
|
||||
</blockquote>
|
||||
<p>简单讲Cargo是一个包装器,让你可以很简单的将你的应用使用类似的配置部署在各种应用服务器上运行。这里我们将使用cargo-gradle-plugin来解决问题: </p>
|
||||
<p>首先应用插件,在你的build.gradle中添加对plugin的导入和添加依赖。<br><figure class="highlight groovy"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">apply <span class="string">plugin:</span> <span class="string">'cargo'</span></div><div class="line"></div><div class="line">buildscript {</div><div class="line"> repositories {</div><div class="line"> mavenCentral()</div><div class="line"> }</div><div class="line"></div><div class="line"> dependencies {</div><div class="line"> classpath <span class="string">'org.gradle.api.plugins:gradle-cargo-plugin:0.6.1'</span></div><div class="line"> }</div><div class="line">}</div><div class="line"></div><div class="line">dependencies {</div><div class="line"> <span class="keyword">def</span> cargoVersion = <span class="string">'1.3.3'</span></div><div class="line"> cargo <span class="string">"org.codehaus.cargo:cargo-core-uberjar:$cargoVersion"</span>,</div><div class="line"> <span class="string">"org.codehaus.cargo:cargo-ant:$cargoVersion"</span></div><div class="line">}</div></pre></td></tr></table></figure></p>
|
||||
<p>其次是就是cargo的详细配置了,如,选择你希望运行的WEB 容器,部署的应用和端口等。下面是我的配置:<br><figure class="highlight groovy"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line">cargo {</div><div class="line"> containerId = <span class="string">'jetty8x'</span></div><div class="line"> port = <span class="number">8080</span></div><div class="line"></div><div class="line"> deployable {</div><div class="line"> file = file(<span class="string">'build/libs/MessagePushX-0.0.1-SNAPSHOT.war'</span>)</div><div class="line"> context = <span class="string">'/'</span></div><div class="line"> }</div><div class="line"></div><div class="line"> local {</div><div class="line"> installer {</div><div class="line"> installUrl = <span class="string">'http://mirrors.yun-idc.com/eclipse//jetty/stable-8/dist/jetty-distribution-8.1.13.v20130916.tar.gz'</span></div><div class="line"> downloadDir = file(<span class="string">"$buildDir/download"</span>)</div><div class="line"> extractDir = file(<span class="string">"$buildDir/extract"</span>)</div><div class="line"> }</div><div class="line"> <span class="comment">// homeDir = file('/Users/twer/Documents/lib/jetty-8.1')</span></div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure></p>
|
||||
<p><strong>containerId</strong>这是选择运行的容器ID,ID可以在Cargo的官方网站找到。基本上主流的java 服务器都支持,Tomcat, Jboss, Jetty等。<br><strong>port</strong> 应用运行的端口<br><strong>deployable</strong> 填入你希望运行的WAR包的地址,可以一次部署多个war包,如果部署多个就需要多个deployable节点。<br><strong>local</strong> 这里是你的配置你的WEB 容器的地址,你可以选择installer从远程下载,cargo会自动帮你解压,安装,运行;另外一种是homeDir 填写本地的WEB容器所在的文件夹。 </p>
|
||||
<p>当这一切都完成后,你就可以使用 Gradle cargoRunLocal来运行你的应用了。<br>我今天测试过 Jetty 7,Jetty 8,Tomcat 7这些都是可以正常运行的,另外一个不能正常运行的是 Jetty 9,报的错误是,没有设置jetty.home 的值。但是我们有Jetty 8,应该能满足你的需要了吧,当然最希望的还是Gradle 官方升级jetty plugin的版本吧!</p>
|
||||
<p><strong> 附录:</strong><br><a href="http://cargo.codehaus.org/" target="_blank" rel="external">Cargo</a><br><a href="https://github.com/bmuschko/gradle-cargo-plugin" target="_blank" rel="external">Cargo-gradle-plugin</a><br><a href="https://github.com/wahyd4/maven-to-gradle-sample" target="_blank" rel="external">我的示例地址</a> </p>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<footer class="post-footer">
|
||||
|
||||
|
||||
@@ -2059,7 +2028,7 @@
|
||||
|
||||
<a href="/archives/">
|
||||
|
||||
<span class="site-state-item-count">305</span>
|
||||
<span class="site-state-item-count">306</span>
|
||||
<span class="site-state-item-name">日志</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user