国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

清新脫俗的 Web 服務(wù)器 Caddy

raledong / 979人閱讀

摘要:清新脫俗的服務(wù)器作為新興服務(wù)器,提供了很多簡(jiǎn)單易用的功能而沒(méi)有歷史的包袱,其默認(rèn)支持并且能幫你自動(dòng)配置,對(duì)于都有很好的支持。

清新脫俗的 Web 服務(wù)器 Caddy 從屬于筆者的服務(wù)端應(yīng)用程序開(kāi)發(fā)與系統(tǒng)架構(gòu),我司之前一直使用 Nginx,不過(guò)其配置包括一些特性支持相較于 Caddy 略顯復(fù)雜,可以參考筆者的 Nginx 基本配置備忘。

清新脫俗的 Web 服務(wù)器 Caddy

作為新興 Web 服務(wù)器,Caddy 提供了很多簡(jiǎn)單易用的功能而沒(méi)有歷史的包袱,其默認(rèn)支持并且能幫你自動(dòng)配置 HTTP/2、HTTPS,對(duì)于 IPV6、WebSockets 都有很好的支持。基于 Go 編寫(xiě)的 Caddy 天生對(duì)于多核具有很好的支持,并且其豐富的插件系統(tǒng)提供了文件管理、文件上傳、基于 MarkDown 的博客系統(tǒng)等等開(kāi)箱即用的擴(kuò)展功能。
我們可以在官方下載界面選擇你需要的插件功能定制個(gè)性化二進(jìn)制文件,下載完畢之后即可以使用caddy命令直接運(yùn)行。其默認(rèn)監(jiān)聽(tīng) 2015 端口,在瀏覽器中打開(kāi) http://localhost:2015 即可以查看其運(yùn)行情況。我們也可以通過(guò)-conf參數(shù)指定配置文件:

$ caddy -conf="/path/to/Caddyfile"

下文我們會(huì)詳細(xì)介紹 Caddyfile 的配置語(yǔ)法,Caddy 的一大特性在于其使用所謂指令(Directives)來(lái)描述功能進(jìn)行配置,相較于 Nginx 或者 Apache 其配置會(huì)簡(jiǎn)化很多。如果我們希望支持多配置文件,可以使用import指令:

import config/common.conf

或者引入整個(gè)文件夾:

import ../vhosts/*
Reference

新興的web服務(wù)器caddy

站點(diǎn)配置

典型的 Caddyfile 配置文件如下所示:

localhost

gzip
browse
websocket /echo cat
ext    .html
log    /var/log/access.log
proxy  /api 127.0.0.1:7005
header /api Access-Control-Allow-Origin *

每個(gè) Caddyfile 的第一行必須描述其服務(wù)的地址:

localhost:2020

之后的每一行都是官方提供的指令,譬如我們需要為服務(wù)器添加 gzip 壓縮支持,只需要直接添加一個(gè)指令:

localhost:2020
gzip

我們可以使用bind指令來(lái)指定當(dāng)前服務(wù)器綁定的地址:

bind host
bind 127.0.0.1
虛擬主機(jī)

如果我們需要配置獨(dú)立的虛擬主機(jī),需要將配置信息移動(dòng)到站點(diǎn)名之后的大括號(hào)內(nèi):

mysite.com {
    root /www/mysite.com
}

sub.mysite.com {
    root /www/sub.mysite.com
    gzip
    log ../access.log
}

注意,左括號(hào)必須與站點(diǎn)名位于同一行,而右括號(hào)則是必須單起一行。對(duì)于共享相同配置的站點(diǎn),我們可以用逗號(hào)來(lái)聲明多個(gè)站點(diǎn):

localhost:2020, https://site.com, http://mysite.com {
    ...
}

當(dāng) Caddy 檢測(cè)到站點(diǎn)名符合下列條件時(shí)會(huì)自動(dòng)使用 Let"s Encrypt 腳本來(lái)為站點(diǎn)添加 HTTPS 支持,并且自動(dòng)監(jiān)聽(tīng) 80 與 443 端口:

主機(jī)名不可為空并且沒(méi)有 localhost 與 IP 地址

端口號(hào)未明確指定為 80

Scheme 未明確指定為 http

TLS 未被關(guān)閉

未指明證書(shū)

緩存設(shè)置

我們可以通過(guò) expires 指令來(lái)設(shè)置相較于請(qǐng)求時(shí)間的過(guò)期頭,其基本語(yǔ)法為:

expires {
    match regex duration
}

regex 是用于匹配請(qǐng)求文件的正則表達(dá)式,而 duration 則是 0y0m0d0h0i0s 格式的描述時(shí)長(zhǎng)的表達(dá)式,常用的匹配語(yǔ)法為:

expires {
    match some/path/.*.css$ 1y # expires
    css files in some/path after one year
    match .js$ 1m # expires
    js files after 30 days
    match .png$ 1d # expires
    png files after one day
    match .jpg$ 1h # expires
    jpg files after one hour
    match .pdf$ 1i # expires
    pdf file after one minute
    match .txt$ 1s # expires
    txt files after one second
    match .html$ 5i30s # expires
    html files after 5 minutes 30 seconds
}
反向代理

proxy 指令提供了基本的反向代理功能,其支持 Health Checks 以及 Failovers,并且支持對(duì)于 WebSocket 的反向代理。其基本語(yǔ)法為:

proxy from to 

from 即是請(qǐng)求匹配的基本路徑,to 則是請(qǐng)求轉(zhuǎn)發(fā)到的端點(diǎn)地址。我們也可以使用更復(fù)雜的配置:

proxy from to... {
    policy random | least_conn | round_robin | ip_hash
    fail_timeout duration
    max_fails integer
    try_duration duration
    try_interval duration
    health_check path
    health_check_interval interval_duration
    health_check_timeout timeout_duration
    header_upstream name value
    header_downstream name value
    keepalive number
    without prefix
    except ignored_paths...
    upstream to
    insecure_skip_verify
    preset
}

將所有發(fā)往 /api 的請(qǐng)求轉(zhuǎn)發(fā)到后端系統(tǒng):

proxy /api localhost:9005

使用隨機(jī)策略將所有請(qǐng)求負(fù)載均衡到三個(gè)后端服務(wù)器:

proxy / web1.local:80 web2.local:90 web3.local:100

使用循環(huán)機(jī)制:

proxy / web1.local:80 web2.local:90 web3.local:100 {    
    policy round_robin
}

添加健康檢查并且透明轉(zhuǎn)發(fā)主機(jī)名、地址與上游:

proxy / web1.local:80 web2.local:90 web3.local:100 {    
        policy round_robin    
        health_check /health    
        transparent
}

轉(zhuǎn)發(fā) WebSocket 請(qǐng)求:

proxy /stream localhost:8080 {    
    websocket
}

避免對(duì)于部分靜態(tài)請(qǐng)求的轉(zhuǎn)發(fā):

proxy / backend:1234 {    
    except /static /robots.txt
}
WebSocket

Caddy 內(nèi)建支持 WebSocket 連接,其允許客戶端發(fā)起 WebSocket 連接的時(shí)候客戶端執(zhí)行某個(gè)簡(jiǎn)單的指令,其基本語(yǔ)法如下:

websocket [path] command

我們可以在客戶端內(nèi)構(gòu)建簡(jiǎn)單的 WebSocket 客戶端請(qǐng)求:

if (window.WebSocket != undefined) {
  var connection = new WebSocket("ws://localhost:2015/echo");
  connection.onmessage = wsMessage;

  connection.onopen = wsOpen;

  function wsOpen(event) {
    connection.send("Hello World");
  }
  function wsMessage(event) {
    console.log(event.data);
  }
}
function wsMessage(event) {
  console.log(event.data);
}

然后在服務(wù)端接收該請(qǐng)求并且將客戶端輸入的內(nèi)容返回:

var readline = require("readline");
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
});

rl.on("line", function(line){
    console.log(line);
})

最后 Caddy 文件配置如下:

websocket /echo "node tmp.js"
文件上傳

我們可以使用 Caddy 提供的擴(kuò)展指令 upload 來(lái)搭建簡(jiǎn)單的文件上傳服務(wù)器:

upload path {
    to                  "directory"
    yes_without_tls
    filenames_form      none|NFC|NFD
    filenames_in        u0000–uff00 [u0000–uff00| …]
    hmac_keys_in        keyID_0=base64(binary) [keyID_n=base64(binary) | …]
    timestamp_tolerance 0..32
    silent_auth_errors
}

直接添加如下配置:

upload /web/path {
    to "/var/tmp"
}

然后使用 curl 上傳文件:

# HTTP PUT
curl 
  -T /etc/os-release 
  https://127.0.0.1/web/path/from-release

或者同時(shí)上傳多個(gè)文件:

# HTTP POST
curl 
  -F gitconfig=@.gitconfig 
  -F id_ed25519.pub=@.ssh/id_ed25519.pub 
  https://127.0.0.1/web/path/

我們也可以使用指令來(lái)移動(dòng)或者刪除這些文件:

# MOVE is "mv"
curl -X MOVE 
  -H "Destination: /web/path/to-release" 
  https://127.0.0.1/web/path/from-release

# DELETE is "rm -r"
curl -X DELETE 
  https://127.0.0.1/web/path/to-release
訪問(wèn)控制 權(quán)限認(rèn)證 Basic Auth

Caddy 內(nèi)建支持 HTTP Basic Authentication,能夠強(qiáng)制用戶使用指定的用戶名與密碼訪問(wèn)某些目錄或者文件。其基本配置語(yǔ)法如下:

basicauth username password {
    resources
}

如果我們希望為 /secret 目錄下所有文件添加權(quán)限認(rèn)證:

basicauth /secret Bob hiccup

也可以指明某些文件:

basicauth "Mary Lou" milkshakes {
    /notes-for-mary-lou.txt
    /marylou-files
    /another-file.txt
}
JWT

jwt 指令是 Caddy 的擴(kuò)展功能,我們需要在官網(wǎng)上選擇添加該功能并且獲取編譯后的版本,其基本語(yǔ)法為:

jwt path
// 或者
jwt {
    path  resource
    allow claim value
    deny  claim value
}

譬如我們預(yù)設(shè)了兩個(gè)令牌:user: someonerole: member ,我們的配置項(xiàng)如下:

jwt {
    path  /protected
    deny  role member
    allow user someone
}

該中間件會(huì)拒絕所有 role: member 的訪問(wèn),除了用戶名為 someone 的用戶。而另一個(gè) role: admin 或者 role: foo 的用戶則可以正常訪問(wèn)。我們可以通過(guò)三種方式來(lái)提交令牌:

Method Format
Authorization Header Authorization: Bearer token
Cookie "jwt_token": token
URL Query Parameter /protected?token=token
跨域請(qǐng)求

我們可以使用 cors 指令來(lái)為服務(wù)器添加跨域請(qǐng)求的能力:

cors / {
    origin            http://allowedSite.com
    origin            http://anotherSite.org https://anotherSite.org
    methods           POST,PUT
    allow_credentials false
    max_age           3600
    allowed_headers   X-Custom-Header,X-Foobar
    exposed_headers   X-Something-Special,SomethingElse
}

我們也可以添加 JSONP 的支持:

jsonp /api/status

譬如某個(gè)端點(diǎn)返回類似于{"status":"ok"}這樣的 JSON 響應(yīng),請(qǐng)求格式如下:

$ wget "http://example.com/api/status?callback=func3022933"

其會(huì)返回如下格式的響應(yīng):

func3022933({"status":"ok"});
地址過(guò)濾

我們可以使用 ipfilter 指令來(lái)基于用戶的 IP 來(lái)允許或者限制用戶訪問(wèn),其基本語(yǔ)法為:

ipfilter paths... {
    rule       block | allow
    ip         list or/and range of IPs...
    country    countries ISO codes...
    database   db_path
    blockpage  block_page
    strict
}

僅允許某個(gè) IP 訪問(wèn):

ipfilter / {
    rule allow
    ip   93.168.247.245
}

禁止兩段 IP 地址與某個(gè)具體的 IP 訪問(wèn),并且向他們返回默認(rèn)界面:

ipfilter / {
    rule       block
    ip         192.168.0.0/16 2E80::20:F8FF:FE31:77CF/16 5.23.4.24
    blockpage  /local/data/default.html
}

僅允許來(lái)自法國(guó)的視野固定 IP 地址的客戶端訪問(wèn):

ipfilter / {
    rule      allow
    country   FR
    database  /local/data/GeoLite2-Country.mmdb
    ip        99.23.4.24 2E80::20::FEF1:91C4
}

僅支持來(lái)自美國(guó)與日本的客戶端訪問(wèn):

ipfilter / {
    rule      allow
    country   US JP
    database  /local/data/GeoLite2-Country.mmdb
}

禁止來(lái)自美國(guó)與日本的客戶端對(duì)于 /notglobal 與 /secret 的訪問(wèn),直接返回默認(rèn)地址:

ipfilter /notglobal /secret {
    rule       block
    country    US JP
    database   /local/data/GeoLite2-Country.mmdb
    blockpage  /local/data/default.html
}
請(qǐng)求限流

我們可以使用 ratelimit 這個(gè)擴(kuò)展指令來(lái)為資源添加請(qǐng)求限流的功能,對(duì)于單資源可以使用如下指令:

ratelimit path rate burst unit
// 限制客戶端每秒最多對(duì)于 /r 資源發(fā)起兩個(gè)請(qǐng)求,突發(fā)上限最多為 3 個(gè)
ratelimit /r 2 3 second

對(duì)于多資源可以使用如下指令:

ratelimit rate burst unit {
    resources
}
// 限制對(duì)于資源文件的訪問(wèn)時(shí)長(zhǎng)為 2 分鐘
ratelimit 2 2 minute {
    /foo.html
    /dir
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/35830.html

相關(guān)文章

  • 清新脫俗 Web 務(wù)器 Caddy

    摘要:清新脫俗的服務(wù)器作為新興服務(wù)器,提供了很多簡(jiǎn)單易用的功能而沒(méi)有歷史的包袱,其默認(rèn)支持并且能幫你自動(dòng)配置,對(duì)于都有很好的支持。 清新脫俗的 Web 服務(wù)器 Caddy 從屬于筆者的服務(wù)端應(yīng)用程序開(kāi)發(fā)與系統(tǒng)架構(gòu),我司之前一直使用 Nginx,不過(guò)其配置包括一些特性支持相較于 Caddy 略顯復(fù)雜,可以參考筆者的 Nginx 基本配置備忘。 showImg(https://segmentf...

    alphahans 評(píng)論0 收藏0
  • 新興web務(wù)器caddy

    摘要:是一個(gè)像或的服務(wù)器。得益于的特性,只是一個(gè)小小的二進(jìn)制文件,沒(méi)有依賴,很好部署。我們來(lái)試試在當(dāng)前目錄創(chuàng)建這樣一個(gè)叫的文件這次,我們改變了端口,并且啟用了自動(dòng)壓縮數(shù)據(jù)。據(jù)說(shuō)全世界四分之一的站點(diǎn)都是搭建的,而公認(rèn)是世界上最好的語(yǔ)言。 caddy 是一個(gè)像 Apache, nginx, 或 lighttpd 的web服務(wù)器。你要問(wèn)nginx已經(jīng)很好了,為什么要用caddy呢? 我覺(jué)得cadd...

    CollinPeng 評(píng)論0 收藏0
  • 簡(jiǎn)單粗暴Caddy Server

    摘要:本文最早發(fā)表于本人博客簡(jiǎn)單粗暴的在上一篇的極簡(jiǎn)的開(kāi)發(fā)環(huán)境實(shí)踐中提到是利用系統(tǒng)后臺(tái)啟用的來(lái)提供服務(wù)的,這個(gè)是個(gè)今天玩了一下,非常贊,當(dāng)然簡(jiǎn)單粗暴是有點(diǎn)標(biāo)題黨了。 本文最早發(fā)表于本人博客: 簡(jiǎn)單粗暴的Caddy Server 在上一篇的《Mac極簡(jiǎn)的開(kāi)發(fā)環(huán)境Laravel Valet實(shí)踐》中提到Valet是利用系統(tǒng)后臺(tái)啟用的Caddy來(lái)提供web服務(wù)的,這個(gè)Caddy是個(gè)web serve...

    TANKING 評(píng)論0 收藏0
  • [小清新] 一段 node 腳本生成風(fēng)格優(yōu)雅 Directory Tree

    摘要:使用文本輸出的話,在不同設(shè)備編輯器下內(nèi)容排版容易混亂。解決方案由于但不限于上述種種原因,自己寫(xiě)了一個(gè)小腳本,可以順利地實(shí)現(xiàn)目錄樹(shù)的生成。結(jié)果被輸出為片段,通過(guò)附加樣式,效果遠(yuǎn)好于前幾種的方式。這個(gè)我打算下一步弄下,可行的話再把代碼出來(lái)。 showImg(https://segmentfault.com/img/remote/1460000016585362?w=640&h=360); ...

    worldligang 評(píng)論0 收藏0
  • [小清新] 一段 node 腳本生成風(fēng)格優(yōu)雅 Directory Tree

    摘要:使用文本輸出的話,在不同設(shè)備編輯器下內(nèi)容排版容易混亂。解決方案由于但不限于上述種種原因,自己寫(xiě)了一個(gè)小腳本,可以順利地實(shí)現(xiàn)目錄樹(shù)的生成。結(jié)果被輸出為片段,通過(guò)附加樣式,效果遠(yuǎn)好于前幾種的方式。這個(gè)我打算下一步弄下,可行的話再把代碼出來(lái)。 showImg(https://segmentfault.com/img/remote/1460000016585362?w=640&h=360); ...

    kyanag 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

raledong

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<