<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>博客</title><description>主页</description><link>https://3cqscbr.club/</link><language>zh_CN</language><item><title>ssl证书认证与安装</title><link>https://3cqscbr.club/posts/sslcertificate/sslcertificate/</link><guid isPermaLink="true">https://3cqscbr.club/posts/sslcertificate/sslcertificate/</guid><description>服务器认证和部署ssl证书</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;前两天突然发现服务器的SSL证书过期了，acme的自动更新也没成功运行，费了不少劲也踩了不少坑，以下简记let&apos;s encrypt + win-acme的认证与更新。&lt;/p&gt;
&lt;p&gt;windows server 2012 + nginx==1.28.0 + win-acme==2.2.9.1701&lt;/p&gt;
&lt;h1&gt;准备工作&lt;/h1&gt;
&lt;h2&gt;win-acme&lt;/h2&gt;
&lt;p&gt;&amp;lt;span id=&quot;win-acme&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;win-acme应该算windows上比较好用的，官网及说明文档见&lt;a href=&quot;https://www.win-acme.com&quot;&gt;https://www.win-acme.com&lt;/a&gt;，下载页见&lt;a href=&quot;https://github.com/win-acme/win-acme/releases/&quot;&gt;https://github.com/win-acme/win-acme/releases/&lt;/a&gt;，版本根据自己需求选择，trimmed是精简版（无法安装插件），一般pluggable就行，其他形如 &lt;code&gt;plugin.validation.dns.*.v.*.*.*.zip&lt;/code&gt;的是对应dns的插件（需配合pluggable版本使用），有需要的可以下载对应压缩包，并把压缩包内容解压到win-acme的根目录即可。&lt;/p&gt;
&lt;p&gt;以下默认解压后程序根目录为C:/win-acme。&lt;/p&gt;
&lt;h1&gt;两种认证模式示例&lt;/h1&gt;
&lt;p&gt;ssl证书认证的核心即将域名与服务器进行绑定以防止被劫持。以下简介两种不同的认证模式。&lt;/p&gt;
&lt;h2&gt;文件认证&lt;/h2&gt;
&lt;p&gt;文件认证的基本模式为，win-acme在本地创建一个文件，然后让认证服务器从指定域名访问该文件，比对文件内容是否一致。
基于此逻辑，需要完成的有以下几步&lt;/p&gt;
&lt;h3&gt;配置服务器&lt;/h3&gt;
&lt;p&gt;&amp;lt;span id=&quot;nginx-conf&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;以nginx为例，要让服务器从相应域名能够访问到文件，首先要配置好nginx.conf&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# snippets/acme-challenge.conf
location ^~ /.well-known/acme-challenge/ {  # 请将该block置于最前，以避免被其他规则覆盖
    default_type &quot;text/plain&quot;;
    try_files $uri =404;    # 查找请求的文件，找不到返回404
    expires -1;             # 禁止缓存验证文件（避免验证失败）
    add_header Cache-Control &quot;no-store, no-cache, must-revalidate&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# nginx.conf
server {
    listen 80;              # 服务器认证默认走80端口
    server_name abc.com;    # 域名

    root C:/certificates/abc.com/;              # 临时访问文件的本地位置
    include snippets/acme_challenge.conf;       # 引入认证模块

    location / {                                # 自动跳转https
        return 302 https://abc.com$request_uri;
    }  
    ...                                         # 其他配置，如日志、流量等
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然，把认证模块抽象出来再通过include进行复用并非必要，如果只有一个域名，直接在server block里写location规则就行&lt;/p&gt;
&lt;p&gt;外部访问 &lt;code&gt;http://abc.com/.well-known/acme-challenge/xxx&lt;/code&gt; 时会指向 &lt;code&gt;C:\certificates\abc.com\.well-known\acme-challenge\xxx&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;确认相应权限&lt;/h3&gt;
&lt;p&gt;这个坑比较容易踩，主要是让win-acme和nginx拥有相应必要权限。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;目录&lt;/th&gt;
&lt;th&gt;权限&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;证书存放目录&lt;/td&gt;
&lt;td&gt;写入权限 + nginx 读取权限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;验证目录&lt;/td&gt;
&lt;td&gt;修改权限 + nginx/everyone读取权限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;win-acme程序目录&lt;/td&gt;
&lt;td&gt;执行权限 + 运行账户写入权限&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;手动运行时当前登录用户有相应权限即可。&lt;/li&gt;
&lt;li&gt;如果要作为计划任务运行，可以考虑用SYSTEM用户或专门的服务账户，并确保该账户拥有相应权限。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;运行WACS（Windows ACME Simple）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;TUI
&lt;code&gt;&amp;lt;span id=&quot;wacs-tui&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;选择认证模式
&lt;img src=&quot;pic%5Cwacs-filesystem-1.png&quot; alt=&quot;wacs-filesystem-1&quot; title=&quot;选择认证模式&quot; /&gt;
&lt;code&gt;[M] Create Certificate (full options)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;手动选择配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何输入域名
&lt;img src=&quot;pic%5Cwacs-filesystem-2.png&quot; alt=&quot;wacs-filesystem-2&quot; title=&quot;如何输入域名&quot; /&gt;
&lt;code&gt;[2] Manual Input&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;手动输入模式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入域名
&lt;img src=&quot;pic%5Cwacs-filesystem-3.png&quot; alt=&quot;wacs-filesystem-3&quot; title=&quot;输入域名&quot; /&gt;
&lt;code&gt;abc.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;此处替换为你的实际域名&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择证书条目数
&lt;img src=&quot;pic%5Cwacs-filesystem-4.png&quot; alt=&quot;wacs-filesystem-4&quot; title=&quot;选择证书条目数&quot; /&gt;
&lt;code&gt;[4] Single certificate&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;单证书（可选按域名/按主机）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何确认域名所有权
&lt;img src=&quot;pic%5Cwacs-filesystem-5.png&quot; alt=&quot;wacs-filesystem-5&quot; title=&quot;如何确认域名所有权&quot; /&gt;
&lt;code&gt;[1] [http] Save verification files on (network) path&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;将验证文件保存至（网络）路径&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入验证文件存放位置
&lt;img src=&quot;pic%5Cwacs-filesystem-6.png&quot; alt=&quot;wacs-filesystem-6&quot; title=&quot;输入验证文件存放位置&quot; /&gt;
&lt;code&gt;C:\certificates\abc.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;此处替换为你的实际临时存放文件夹，即 &lt;a href=&quot;#nginx-conf&quot;&gt;配置服务器&lt;/a&gt;中的root路径&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;是否复制web.config到认证目录下
&lt;img src=&quot;pic%5Cwacs-filesystem-7.png&quot; alt=&quot;wacs-filesystem-7&quot; title=&quot;是否复制web.config到认证目录下&quot; /&gt;
&lt;code&gt;n&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这个一般是IIS配置才需要的模块，非IIS的直接选否即可。因为WACS认证时let&apos;s encrypt服务器会访问 &lt;code&gt;http://abc.com/.well-known/acme-challenge/{token}&lt;/code&gt;，而IIS可能会阻止未知扩展名的文件访问，或者对静态文件设置MIME类型导致未定义类型请求被过滤，web.config 就是为了确保 .well-known/acme-challenge 下的文件可以被外部访问，且返回正确的MIME type，以避免被IIS拦截请求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确认加密类型
&lt;img src=&quot;pic%5Cwacs-filesystem-8.png&quot; alt=&quot;wacs-filesystem-8&quot; title=&quot;确认加密类型&quot; /&gt;
&lt;code&gt;[2] RSA key&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;使用默认RSA即可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何存储证书
&lt;img src=&quot;pic%5Cwacs-filesystem-9.png&quot; alt=&quot;wacs-filesystem-9&quot; title=&quot;如何存储证书&quot; /&gt;
&lt;code&gt;[2] PEM encoded files (Apache, nginx, etc.)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;前面用的nginx，所以这里也使用nginx支持的PEM类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;存储证书位置
&lt;img src=&quot;pic%5Cwacs-filesystem-10.png&quot; alt=&quot;wacs-filesystem-10&quot; title=&quot;存储证书位置&quot; /&gt;
&lt;code&gt;D:\certificated\abc.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;此处替换为你的本地存储位置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;是否对PEM文件加密
&lt;img src=&quot;pic%5Cwacs-filesystem-11.png&quot; alt=&quot;wacs-filesystem-11&quot; title=&quot;是否对pem文件加密&quot; /&gt;
&lt;code&gt;[1] None&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;其他证书存储位置
&lt;img src=&quot;pic%5Cwacs-filesystem-12.png&quot; alt=&quot;wacs-filesystem-12&quot; title=&quot;其他证书存储位置&quot; /&gt;
&lt;code&gt;[5] No (additional) storage steps&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;无需其他存储&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;是否更新服务器配置
&lt;img src=&quot;pic%5Cwacs-filesystem-13.png&quot; alt=&quot;wacs-filesystem-13&quot; title=&quot;其他安装步骤&quot; /&gt;
&lt;code&gt;[3] No (additional) installation steps&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;无需其他安装步骤，如果有需要，比如重启nginx服务器可以自己编写脚本，然后选择 &lt;code&gt;[2] Start external script or program&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;其他细节
&lt;img src=&quot;pic%5Cwacs-filesystem-14.png&quot; alt=&quot;wacs-filesystem-14&quot; title=&quot;其他细节&quot; /&gt;
打开并确认协议条款，并输入邮箱&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;认证成功&lt;/p&gt;
&lt;p&gt;认证成功后可以确认nginx.conf的配置&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 443 ssl;
    server_name abc.com;

    ssl_certificate D:/certificates/abc.com/abc.com-chain.pem;     # 证书路径
    ssl_certificate_key D:/certificates/abc.com/abc.com-key.pem;   # 私钥路径

    root ...   # 其他
    ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后重启nginx服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nginx -t
nginx -s reload
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外wacs一般会把自动更新写进任务计划程序，可以通过 &lt;code&gt;taskschd.msc&lt;/code&gt;找到。也可在主界面选择 &lt;code&gt;[R] Run Renewals&lt;/code&gt; - &lt;code&gt;[S] Run *all* renewals (force)&lt;/code&gt;来强制更新&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;认证失败&lt;/p&gt;
&lt;p&gt;根据提示信息确认失败原因，修正后重试。&lt;/p&gt;
&lt;p&gt;注意, 未经备案的域名可能导致let&apos;s encrypt在访问时被部分dns服务商拦截，此类报错相对隐蔽，可能需要用 &lt;code&gt;--verbose&lt;/code&gt;的详细日志才能发现真正原因&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CLI&lt;/p&gt;
&lt;p&gt;命令行参数用法详参&lt;a href=&quot;https://www.win-acme.com/reference/cli&quot;&gt;https://www.win-acme.com/reference/cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下给出上述步骤的命令行参数写法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wacs.exe --source manual --host &quot;abc.com&quot; ^
--validation filesystem --webroot &quot;C:\certificates\abc.com&quot; ^
--store pemfiles --pemfilespath &quot;D:\certificated\abc.com&quot; ^
--verbose &amp;gt;&amp;gt; res.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;linux请使用反斜杠 &lt;code&gt;\&lt;/code&gt;换行（不会有人用linux还来看wacs的流程吧，不会吧，不会吧）&lt;/p&gt;
&lt;p&gt;最后一行 &lt;code&gt;--verbose&lt;/code&gt;启用详细日志输出，&lt;code&gt;&amp;gt;&amp;gt; &lt;/code&gt;将结果静默追加输出至当前文件夹的res.log文件，方便检查。如无需追加直接使用 &lt;code&gt;&amp;gt;&lt;/code&gt;覆盖输出。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;DNS认证&lt;/h2&gt;
&lt;p&gt;DNS认证的基本模式为，在DNS记录中添加一条TXT记录，let&apos;s encrypt检查该记录是否存在且正确。
部分常见的DNS服务商（如Cloudflare, Aliyun等）可以通过下载对应的插件来进行认证（见&lt;a href=&quot;#win-acme&quot;&gt;win-acme&lt;/a&gt;）
以下简介通用做法，需要dns服务商提供api接口&lt;/p&gt;
&lt;h3&gt;编写脚本&lt;/h3&gt;
&lt;p&gt;wacs需要两个接口，一为创建一条dns记录，二为删除该条dns记录，具体可用参数占位符详见&lt;a href=&quot;https://www.win-acme.com/reference/plugins/validation/dns/script&quot;&gt;https://www.win-acme.com/reference/plugins/validation/dns/script&lt;/a&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数名&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;th&gt;释义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;{Identifier}&lt;/td&gt;
&lt;td&gt;sub.abc.com&lt;/td&gt;
&lt;td&gt;待验证的主机名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{RecordName}&lt;/td&gt;
&lt;td&gt;_acme-challenge.sub.abc.com&lt;/td&gt;
&lt;td&gt;完整TXT记录名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{ZoneName}&lt;/td&gt;
&lt;td&gt;abc.com&lt;/td&gt;
&lt;td&gt;可注册域名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{NodeName}&lt;/td&gt;
&lt;td&gt;_acme-challenge.sub&lt;/td&gt;
&lt;td&gt;记录节点名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{Token}&lt;/td&gt;
&lt;td&gt;DGyRejmCefe7v4NfDGDKfA&lt;/td&gt;
&lt;td&gt;ACME 要求添加到 TXT 记录的内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{vault://json/mysecret}&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Vault中存储的内容（比如 API Key 或密码）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;wacs在调用脚本时，根据状态码确认脚本是否成功运行，以下仅示例。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# C:/win-acme/CustomScript/dns.bat
C:\Python311\python.exe &quot;C:\win-acme\CustomizeScripts\dns.py&quot; %*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如使用虚拟环境，以anaconda为例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CALL &quot;D:\Anaconda3\condabin\conda.bat&quot; activate myenv
python &quot;C:\win-acme\CustomizeScripts\dns.py&quot; %*
CALL conda deactivate
echo Done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;python脚本，具体api响应结构和请求参数，请参考dns服务商提供的文档&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# C:/win-acme/CustomScript/dns.py
# requirements: requests, dnspython
# python &amp;gt;= 3.6 (typehint, f-string)
# python &amp;gt;= 3.11 (StrEnum)
import requests
import sys
from enum import IntEnum, StrEnum
import time
import logging
import dns.resolver

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
fmt = logging.Formatter(&quot;%(asctime)s - %(levelname)s - %(message)s&quot;,datefmt=&quot;%Y-%m-%d %H:%M:%S&quot;)
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(fmt)
logger.addHandler(stream_handler)

API_KEY = &quot;YOUR_API_KEY&quot;
BASE = &quot;https://www.sample.com/api&quot;
TIMEOUT_MIN = 10

class VERSION(IntEnum):
    DEFAULT = 1

class TYPE(StrEnum):
    XML = &quot;xml&quot;
    JSON = &quot;json&quot;

class ACTION(StrEnum):
    ADD_DNS_RECORD = &quot;dnsAddRecord&quot;
    LIST_DNS_RECORDS = &quot;dnsListRecords&quot;
    DELETE_DNS_RECORD = &quot;dnsDeleteRecord&quot;
  
class RRTYPE(StrEnum):
    A = &quot;A&quot;
    AAAA = &quot;AAAA&quot;
    CNAME = &quot;CNAME&quot;
    MX = &quot;MX&quot;
    TXT = &quot;TXT&quot;
    SRV = &quot;SRV&quot;
    CAA = &quot;CAA&quot;
  
def wait_for_dns_propagation(txt_record_name: str, expected_value: str,timeout: int = 60*10, interval: int = 30):
    start = time.time()
    while True:
        try:
            answers = dns.resolver.resolve(txt_record_name, &apos;TXT&apos;)
            for rdata in answers:
                for txt_string in rdata.strings:
                    try:
                        decoded_value = txt_string.decode()
                        if decoded_value == expected_value:
                            logger.info(f&quot;TXT记录生效: {txt_record_name} = {expected_value}&quot;)
                            return True
                    except Exception as e:
                        logger.error(f&quot;无法解码字符串:{e}&quot;)
                        continue
        except Exception as e:
            logger.warning(f&quot;查询DNS失败: {e}, 等待{interval}s后重试&quot;)
            time.sleep(interval)
        elapsed = time.time() - start
        if elapsed &amp;gt; timeout:
            logger.error(f&quot;等待 TXT 记录超时: {txt_record_name}&quot;)
            return False

def add(domain: str, txt_value: str, rrhost: str):
    url = f&quot;{BASE}/{ACTION.ADD_DNS_RECORD}?version={VERSION.DEFAULT}&amp;amp;type={TYPE.JSON}&amp;amp;key={API_KEY}&amp;amp;domain={domain}&amp;amp;rrtype={RRTYPE.TXT}&amp;amp;rrhost={rrhost}&amp;amp;rrvalue={txt_value}&amp;amp;rrttl=3600&quot;
    r = requests.get(url)
    if r.status_code != 200:
        logger.error(f&quot;添加DNS记录失败: {r.text}&quot;)
        sys.exit(1)
    logger.info(r.text)
    logger.info(f&quot;等待DNS记录生效...{TIMEOUT_MIN}分钟&quot;)
    res = wait_for_dns_propagation(rrhost, txt_value, timeout=60*TIMEOUT_MIN, interval=30)
    if res:
        sys.exit(0)
    else:
        logger.error(&quot;DNS记录超时未生效, 请检查是否成功添加，如有必要可上调最大等待时长&quot;)
        sys.exit(1)

def delete(domain: str, rec_id: str):
    url = f&quot;{BASE}/{ACTION.DELETE_DNS_RECORD}?version={VERSION.DEFAULT}&amp;amp;type={TYPE.JSON}&amp;amp;key={API_KEY}&amp;amp;domain={domain}&amp;amp;rrid={rec_id}&quot;
    r = requests.get(url)
    logger.info(r.text)
    sys.exit(0 if r.status_code == 200 else 1)

def get_txt_record_id(domain: str, txt_value: str):
    url = f&quot;{BASE}/{ACTION.LIST_DNS_RECORDS}?version={VERSION.DEFAULT}&amp;amp;type={TYPE.JSON}&amp;amp;key={API_KEY}&amp;amp;domain={domain}&quot;
    r = requests.get(url)
    logger.info(r.text)
    data = r.json()
    reply = data.get(&quot;reply&quot;, None)
    if reply:
        resource_records = reply.get(&quot;resource_record&quot;, None)
        if resource_records:
            for rec in resource_records:
                if rec.get(&quot;type&quot;) == RRTYPE.TXT and rec.get(&quot;value&quot;) == txt_value:
                    return rec.get(&quot;record_id&quot;)
            logger.error(&quot;未找到一致的TXT记录&quot;)
        else:
            logger.error(&quot;未找到记录&quot;)
    else:
        logger.error(&quot;请求失败&quot;)
    return None

def main():
    action = sys.argv[1]
    domain = sys.argv[2]
    txt_value = sys.argv[3]
    rrhost = sys.argv[4] if len(sys.argv) &amp;gt; 4 else &quot;_acme-challenge&quot;
    if action == &quot;add&quot;:
        add(domain, txt_value, rrhost)
    elif action == &quot;delete&quot;:
        rec_id = get_txt_record_id(domain, txt_value)
        if rec_id:
            delete(domain, rec_id)
        else:
            logger.warning(&quot;没有需要删除的记录&quot;)
            sys.exit(0)
    else:
        raise ValueError(&quot;未知操作&quot;)
  
  
if __name__ == &quot;__main__&quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;运行WACS（Windows ACME Simple）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;TUI&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;前置准备
前四步同前，详见&lt;a href=&quot;#wacs-tui&quot;&gt;文件认证&lt;/a&gt;部分&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如何确认域名所有权
&lt;img src=&quot;pic%5Cwacs-dns01-1.png&quot; alt=&quot;wacs-dns01-1&quot; title=&quot;如何确认域名所有权&quot; /&gt;
&lt;code&gt;[8] [dns] Create verification records with your own script&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;用脚本创建认证记录&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;脚本路径
&lt;img src=&quot;pic%5Cwacs-dns01-2.png&quot; alt=&quot;wacs-dns01-2&quot; title=&quot;脚本路径&quot; /&gt;
&lt;code&gt;C:/win-acme/CustomScript/dns.bat&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;此处更改为你的脚本文件路径&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除认证记录
&lt;img src=&quot;pic%5Cwacs-dns01-3.png&quot; alt=&quot;wacs-dns01-3&quot; title=&quot;删除认证记录&quot; /&gt;
&lt;code&gt;[1] Using the same script&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;按需求选择&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;脚本参数（创建记录）
&lt;img src=&quot;pic%5Cwacs-dns01-4.png&quot; alt=&quot;wacs-dns01-4&quot; title=&quot;脚本参数（创建记录）&quot; /&gt;
&lt;code&gt;add {ZoneName} {Token} {RecordName}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;此处按照你的脚本设置传递参数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;脚本参数（删除记录）
&lt;img src=&quot;pic%5Cwacs-dns01-5.png&quot; alt=&quot;wacs-dns01-5&quot; title=&quot;脚本参数（删除记录）&quot; /&gt;
&lt;code&gt;delete {ZoneName} {Token}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;此处按照你的脚本设置传递参数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;并发设置
&lt;img src=&quot;pic%5Cwacs-dns01-6.png&quot; alt=&quot;wacs-dns01-6&quot; title=&quot;并发设置&quot; /&gt;
&lt;code&gt;[1] Run everything one by one&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;一般选串行即可，避免dns服务商出现http429等问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后续设置&lt;/p&gt;
&lt;p&gt;后续同前，详见&lt;a href=&quot;#wacs-tui&quot;&gt;文件认证&lt;/a&gt;部分&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CLI&lt;/p&gt;
&lt;p&gt;命令行参数用法详参&lt;a href=&quot;https://www.win-acme.com/reference/cli&quot;&gt;https://www.win-acme.com/reference/cli&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下给出上一个步骤的命令行参数写法&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wacs.exe --source manual --host &quot;abc.com&quot; ^
--validationmode dns-01 --validation script --dnsscript &quot;C:\win-acme\CustomizeScripts\dns.bat&quot; ^
--dnscreatescriptarguments &quot;add {ZoneName} {Token} {RecordName}&quot; ^
--dnsdeletescriptarguments &quot;delete {ZoneName} {Token}&quot; ^
--store pemfiles --pemfilespath &quot;D:\certificated\abc.com&quot; ^
--verbose &amp;gt;&amp;gt; res.log
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vault使用&lt;/p&gt;
&lt;p&gt;出于安全性考虑，以及避免脚本硬编码API_KEY，可以使用Vault，如&lt;a href=&quot;https://github.com/hashicorp/vault&quot;&gt;https://github.com/hashicorp/vault&lt;/a&gt;，同样注意权限问题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;存储key&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;vault kv put secret/winacme_dns api_key=&quot;YOUR_REAL_DNS_API_KEY&quot; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;注意：vault中token有过期时间，合理设计有效期或自动更新。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;修改脚本接收的参数（sys.argv）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改wacs使用&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;TUI中修改参数，注意参数顺序与脚本对应
&lt;code&gt;add {ZoneName} {Token} {vault://json/secret/winacme_dns:api_key} {RecordName}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;delete {ZoneName} {Token} {vault://json/secret/winacme_dns:api_key}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;或CLI使用中修改相应传参&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
--dnscreatescriptarguments &quot;add {ZoneName} {Token} {vault://json/secret/winacme_dns:api_key} {RecordName}&quot; ^ 
--dnsdeletescriptarguments &quot;delete {ZoneName} {Token} {vault://json/secret/winacme_dns:api_key}&quot; ^ 
...
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;h2&gt;限额提醒&lt;/h2&gt;
&lt;p&gt;Let&apos;s encrypt的申请有rate limit，如果仅在脚本或设置调试阶段，可以考虑使用 &lt;code&gt;--baseuri https://acme-staging-v02.api.letsencrypt.org/&lt;/code&gt;参数，待调试成功后再进入生产环境。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;限额&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;同主域名证书申请限额&lt;/td&gt;
&lt;td&gt;50/周/主域名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;同域名集证书申请份数限额&lt;/td&gt;
&lt;td&gt;5/周/域名集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;同账户申请证书份数限额&lt;/td&gt;
&lt;td&gt;300/3小时/账户&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;同账户同域名集验证失败次数限额&lt;/td&gt;
&lt;td&gt;5/小时/域名集/账户&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;主域名指 &lt;code&gt;sub1.example.com&lt;/code&gt;、&lt;code&gt;sub2.example.com&lt;/code&gt; → &lt;code&gt;example.com&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;域名集指申请的证书所生效的域名集合，如 &lt;code&gt;{example.com, sub.example.com}&lt;/code&gt;&lt;/p&gt;
</content:encoded></item><item><title>windows日常使用</title><link>https://3cqscbr.club/posts/dailyuse/antibadware/</link><guid isPermaLink="true">https://3cqscbr.club/posts/dailyuse/antibadware/</guid><description>一些小工具，同时简单记录下如何处理各式各样的流氓软件</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;现在软件的流氓行径实在是令人作呕，用户体验就像逼着人在巧克力味的屎和屎味的巧克力之间做选择，简单开一篇记录一下如何处理流氓软件以及常用的小工具，以后重装电脑之类的可以对照着进行配置。&lt;/p&gt;
&lt;h1&gt;常用工具&lt;/h1&gt;
&lt;h2&gt;Geek Uninstaller&lt;/h2&gt;
&lt;p&gt;查看并管理已安装软件的工具，作为控制面板 - 程序和功能 - 卸载程序的替代手段，体积小巧，无需安装，界面简洁，可以在卸载软件时可以扫描并清理注册表及其他残留。&lt;/p&gt;
&lt;p&gt;官网为&lt;a href=&quot;https://geekuninstaller.com/&quot;&gt;https://geekuninstaller.com/&lt;/a&gt;，个人版免费。&lt;/p&gt;
&lt;h2&gt;WinDirStat&lt;/h2&gt;
&lt;p&gt;快速查看磁盘使用情况和清理的工具，可以非常直观地显示磁盘占用情况，体积小巧，无需安装，界面简洁。&lt;/p&gt;
&lt;p&gt;官方下载方式在&lt;a href=&quot;https://github.com/windirstat/windirstat&quot;&gt;https://github.com/windirstat/windirstat&lt;/a&gt;，也可以在&lt;a href=&quot;https://sourceforge.net/projects/windirstat/files/&quot;&gt;SourceForge&lt;/a&gt;上下载&lt;/p&gt;
&lt;h2&gt;ContextMenuManager&lt;/h2&gt;
&lt;p&gt;windows右键管理器，体积小巧，界面简洁，可以自定义右键列表&lt;/p&gt;
&lt;p&gt;官方下载方式在&lt;a href=&quot;https://github.com/BluePointLilac/ContextMenuManager&quot;&gt;https://github.com/BluePointLilac/ContextMenuManager&lt;/a&gt;，也可以在&lt;a href=&quot;https://gitee.com/BluePointLilac/ContextMenuManager&quot;&gt;gitee&lt;/a&gt;上下载。&lt;/p&gt;
&lt;h2&gt;Everything&lt;/h2&gt;
&lt;p&gt;windows的文件搜索工具，体积小巧，界面简洁，建立索引之后可以快速搜索文件&lt;/p&gt;
&lt;p&gt;官网为&lt;a href=&quot;https://www.voidtools.com/zh-cn/&quot;&gt;https://www.voidtools.com/zh-cn/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Snipaste&lt;/h2&gt;
&lt;p&gt;windows的截屏工具，体积小巧，界面简洁，操作简单，&lt;/p&gt;
&lt;p&gt;官网为&lt;a href=&quot;https://zh.snipaste.com/&quot;&gt;https://zh.snipaste.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;缺点是无法长截图，无法自动OCR，作者摆烂了十年，但不更新的软件就是好软件？（划掉）&lt;/p&gt;
&lt;p&gt;可以考虑使用&lt;a href=&quot;https://pixpin.cn/&quot;&gt;PixPin&lt;/a&gt;替代，基础功能 + 长截图 + ocr识别 + 轻录屏 截至目前均无需付费。&lt;/p&gt;
&lt;h2&gt;Office Tool Plus&lt;/h2&gt;
&lt;p&gt;windows下快速配置office的工具，界面简洁，操作简单。&lt;/p&gt;
&lt;p&gt;官网为&lt;a href=&quot;https://www.officetool.plus/zh-cn/&quot;&gt;https://www.officetool.plus/zh-cn/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注意激活时，KMS主机填写合适的地址。如&lt;a href=&quot;https://kms.loli.beer&quot;&gt;kms.loli.beer&lt;/a&gt;等，详细地址可参考&lt;a href=&quot;https://monitor.yerong.org/kms/&quot;&gt;https://monitor.yerong.org/kms/&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;流氓软件&lt;/h1&gt;
&lt;h2&gt;百度网盘&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;自动添加右键菜单&lt;/p&gt;
&lt;p&gt;百度网盘每次启动时会自动添加右键菜单，甚至有时直接清理了注册表条目，下次启动还会自动添加。&lt;/p&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用ContextMenuManager把相关条目关闭。如果下次打开百度网盘后在菜单里再次出现，考虑关闭后点击边上的设置图标⚙ - 处理GUID - 锁定GUID。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;智能看图&lt;/p&gt;
&lt;p&gt;百度网盘附带一个“智能看图”软件，图标与windows默认的图片浏览器“照片”类似，一不小心就会中招，还可能修改默认看图方式&lt;/p&gt;
&lt;p&gt;解决方法：&amp;lt;span id=&quot;ReplaceModules&quot;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开百度网盘的安装文件夹
可以使用geek uninstaller - 百度网盘 - 右键 - 安装文件夹, 或者是： 开始菜单 - 百度网盘 - 右键 - 更多 - 打开文件位置，找到百度网盘的开始菜单链接文件，选中 - 右键 - 打开文件所在位置&lt;/li&gt;
&lt;li&gt;找到其中的module文件夹，将ImageViewer文件夹删除，同时新建一个空白的txt文本文件，将其重命名为ImageViewer（不带txt）占位。（也可通过修改文件夹权限来达到同样效果）&lt;/li&gt;
&lt;li&gt;在ContextMenuManager里清理相关条目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;随用随关，防止百度把个人电脑当中转服务器，消耗硬盘、带宽，可能被运营商因为PCDN原因限速&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重要或敏感信息添加为加密压缩包之后上传，甚至可以改后缀&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;搜狗输入法&lt;/h2&gt;
&lt;p&gt;各种逆天操作包括但不限于，自动修改pdf默认打开方式，弹窗，无用组件。&lt;/p&gt;
&lt;p&gt;可选操作&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;禁止联网&lt;/p&gt;
&lt;p&gt;可以考虑使用脚本&lt;a href=&quot;https://github.com/yongxin-ms/DisableSogouNetwork&quot;&gt;https://github.com/yongxin-ms/DisableSogouNetwork&lt;/a&gt;，将所有搜狗输入法程序添加到防火墙策略中禁止联网。&lt;/p&gt;
&lt;p&gt;脚本使用方法详见仓库说明，需要注意，如果日常有使用clash等代理软件，在搜狗输入法的设置中注意修改代理。&lt;/p&gt;
&lt;p&gt;使用管理员身份运行run.ps1文件方法：&lt;/p&gt;
&lt;p&gt;在开始菜单中找到windows powershell - 右键 - 更多 - 以管理员身份运行，然后转到脚本run.ps1所在文件夹，再允许。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd D:\DisableSogouNetwork  # 此处修改为你的目录
.\run.ps1
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除无用组件&lt;/p&gt;
&lt;p&gt;找到搜狗输入法安装文件夹，打开其中的Components文件夹，例如 &lt;code&gt;C:\Software\SogouInput\Components&lt;/code&gt;，将不需要的功能全部删除并替换成同名的空白文件占位，操作&lt;a href=&quot;#ReplaceModules&quot;&gt;同前&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改其他设置&lt;/p&gt;
&lt;p&gt;搜狗输入法自己的设置里把所有不需要的东西全部关掉。&lt;/p&gt;
&lt;p&gt;有一个被恶心到的点是，搜狗输入法会占用 &lt;code&gt;ctrl + ,&lt;/code&gt;作为快速转换到该输入法的快捷键，然而众所周知这也是vscode里调设置的快捷键，这种冲突就会导致vscode内无法用快捷键快速调出设置。&lt;/p&gt;
&lt;p&gt;解决方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设置 - 设备 - 输入 - 高级键盘设置 - 语言栏选项 - 高级键设置 - 选中 &lt;code&gt;切换到中文(简体，中国) - 搜狗拼音输入法&lt;/code&gt; - 更改按键顺序 - 取消勾选 &lt;code&gt;启用按键顺序&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;终极解决方案，换用windows自带输入法&lt;/p&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;h2&gt;右键在当前位置以管理员身份打开cmd&lt;/h2&gt;
&lt;p&gt;图形化操作，省去以管理员身份运行cmd + cd xxxxx的步骤，直接在目录处右键完成以下步骤&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;win + R - regedit - 打开注册表编辑器 - 找到 &lt;code&gt;HKEY_CLASSES_ROOT\Directory\shell\&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;新建项，起名 &lt;code&gt;OpenCmdHere&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改默认值为 &lt;code&gt;Open Terminal&lt;/code&gt;（右键菜单中的显示名）&lt;/li&gt;
&lt;li&gt;新建字符串值 &lt;code&gt;cmd.exe&lt;/code&gt;（指定程序图标，由于cmd.exe在系统的PATH下故可直接使用）&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;OpenCmdHere&lt;/code&gt;下新建项 &lt;code&gt;command&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改默认值为 &lt;code&gt;PowerShell -WindowStyle Hidden -Command &quot;Start-Process cmd.exe -ArgumentList &apos;/s /k pushd \&quot;%V\&quot;&apos; -Verb RunAs&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;静默启动powershell，执行命令启动cmd.exe，传递参数列表/s用于解析命令，/k使命令处理器保持运行，pushd &quot;%V\表示切换到指定目录由%V传入，-Verb RunAs表示以管理员身份运行&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>无题</title><link>https://3cqscbr.club/posts/notitle/notitle1/no-title-1/</link><guid isPermaLink="true">https://3cqscbr.club/posts/notitle/notitle1/no-title-1/</guid><description>不知所云</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;  点开网易云音乐听歌识曲时推送了年度的听歌报告，这种老套的模板几下上滑也就看完了，顺手搜前任账号瞥了一眼，好像是开始了新的感情，挺好的，祝幸福，以后我大概也不会再有这么无聊地“灵光一现”了，哈哈。过去的自然已是过去式，没有故事里的那些狗血情节，也不必嘴硬为自己去辩驳些什么，对方是很好的人，终究是我的问题更多一些。&lt;/p&gt;
&lt;p&gt;  也是有个机会能静下心来剖析和反思自己，我应该算是比较典型的讨好型人格+一点点回避，一是很希望能做些什么让对方开心，本质是“我必须要做些什么，别人才会爱我”这种潜意识。二是非常害怕冲突，对于任何对方可能在表达冲突的话语都会很在意，纠结自己是不是做错了什么。三是遇到问题只想着逃避。这种性格的养成和成长经历关系很大，我也无意简单地把所有问题往原生家庭一推，然后双手一摊直接开摆，只是回头想想自己一直是这种状态罢了，可能后来被前任治愈了不少，虽然可能只是稍好了些许甚至现在变本加厉，无论如何还是很感谢的。&lt;/p&gt;
&lt;p&gt;  最后提分手的原因也很简单，我觉得我没有能力给到对方想要的东西，这么说有些武断、自私，而且不负责任，但确实是真实的想法。作为男性虽然无法做到感同身受，但对于女性随着年龄增长而逐渐增加的年龄焦虑多少还是能理解些许。站在男生的角度，当前途不明，一无所有的时候，突然要决定婚姻、未来等各式各样的问题，这真的是一件很恐怖的事情。我觉得我没有办法做出任何虚假的承诺，那与其纠缠不清一地鸡毛，不如早做决断，我来做那个先提分手和已读不回的恶人总比把女生几年青春拖过去的好。仔细想想，无论家庭还是性格、品质，我都不是一个合格的结婚对象，单亲家庭是经典的减分项，品质方面又缺少上进心，性格上遇到问题宁愿选择逃避，缩回自己的小房间里。不结婚对我来说可能是一个更好的选择，至少在没能把自己的问题想明白之前，还是不要去害人的好。&lt;/p&gt;
&lt;p&gt;  岁末转瞬即至，摆了整一年，也算是讨好型人格严重内耗压抑太久的反噬吧。这一年里常常会半夜发呆，思考人生的意义到底是什么？&lt;/p&gt;
&lt;p&gt;  其实这个问题很早以前就开始有了，最早大概是初中的时候，学业压力也不小，学累了偶尔就会思考我为什么要努力学习？可惜苦思无果，最后只能用青春期懵懂的小脑瓜，借鉴读过的才子佳人小说，想象出一个“另一半”，为了对方而好好学习，反正得出一个结论催眠自己好好学习就行，至于是否正确，是否要合乎逻辑，那也是无所谓了。也算从小就是个“情种”，倒是显得很不孝了。&lt;/p&gt;
&lt;p&gt;  随着年龄增长，时间的流速仿佛越来越快。一般理解是经典力学的时空观，时间是一个“背景”，一条长长的直线自顾自地延伸向前。但唯心而论，我真切感受到时间的流逝并非源于秒针的滴滴答答，而是更多个不经意的瞬间，是小朋友的称呼从哥哥变成了叔叔，是熬通宵之后听到珠颈斑鸠叫声看到它站在阳台边的恍惚，是故地重游时的风景不再，是努力回忆时却发现记忆的一片模糊……&lt;/p&gt;
&lt;p&gt;  前段时间身份证临近过期去街道服务中心补办，路过之前念书的小学还在，小学边上当初哥哥上的“五中”已经不在了。我有记忆以来，以区命名的中学就那么几所，“一中”还在，不过好像这几年在前排梯队里越来越差，之前初中时一起坐地铁去补课认识的同学，就是这个学校初中部的，后来好像考去了隔壁，话说我自己高中的成绩这些年好像也越来越差了，哈哈。“二中”则是多年前就已搬走而且更名，倒算得上几所里关系最密切的学校，毕竟和老校长的纠葛倒是不少，后来好像调到一中去了，近况则不太清楚。“三中”虽然离得不远，但从未没走到门口去过，好像高中生物老师调过去当副校长了。“四中”在我小学时住的地方附近，可以说是千年王八万年龟，虽然一直倒数但一直还在。五中应该是撤了，现在成了一中初中部的分校区。&lt;/p&gt;
&lt;p&gt;  变的不止是地，还有人，2025年死了很多人，（说到这个不得不提经典王冕死了父亲，划掉），三年的阴霾仿佛仍未远去，影响力最大的应该是杨振宁的离世，以前好奇老人住的小院会在南区哪里，应该是找了地址，但可惜最后也没去过。印象最深的是裘锡圭先生的去世，算是专业里当代的祖师爷，南裘北李终究还是谢幕了，失明了依然坚持治学令人敬佩，不过最震撼我的的还是没有蔬菜吃的那段聊天记录，毕竟我多少沾个不学无术。最漂亮的当属何晴，毕竟是女儿国国王，最是人间留不住，但能够给人留下过美好的印象也是存在过的证明。最意外的当属方大同，虽然了解不多，但印象里也算年轻人，小时候周日晚上要坐一个多小时的公交去上外语课，往返加起来快三个小时，公交的平板电视上这时段就放着方大同版红豆的MV，那时候也不会坐车刷手机，昏暗的车厢左右摇晃，人也昏昏沉沉，独特的歌声在心里留下浅浅淡淡的痕迹。&lt;/p&gt;
&lt;p&gt;  当然，就像方大同一样，人不是老了才会死的，而是随时随地都会死。去年小姑父也意外去世了，是因为车祸，小姑父是很好很好的人，一手焊工的手艺赚得不少，多的钱还寄回老家女儿那里去。记得小时候去他们家，说是家其实就是大城市里租的便宜农村二层自建房，一层有厨房，也算摩托车库，楼梯下帘子一拉就是厕所。门边的洗手池边经常有小虫子，我喜欢拿喷壶装满水兑点洗手液去喷虫子，虫子却紧紧贴在门框上一动也不动。一楼到二楼的楼梯很陡，不开灯也比较黑，我总是担心自己滚下去，好在从没摔过。小时候家里不敢玩电脑，小姑父这里有一台比较老的笔记本，虽然没有网，但总会拿出来让我玩，单机的斗地主我也玩得滋滋有味，不过比较奇怪的是那个斗地主的bgm是张明敏的《我的中国心》。小姑父经常带我去附近杂货铺买各种好吃的，不过我从小就不好意思花别人的钱，每次临走之前都要往我兜里硬塞两百块钱让我自己买，不过我拼命推脱，基本没拿过。现在回想起来，小姑父其实是个情商很高的人，察言观色的本领也是一流。从小四处搬家，升学又是筛下了一批又一批的同龄人，小姑父算是我原子化的城市家庭中重新体会家族温情的窗口。&lt;/p&gt;
&lt;p&gt;  祖辈过世都很早。最近的是奶奶，八十多岁身体依旧很硬朗，同样是因为车祸，奶奶走了之后就再也没回过老家。再之前是外婆，我最后一次看她是初中，自己坐火车去的，到火车站时离发车还有好久，外婆便带着我在海边闲逛，虽然我一直不听她话，但那次倒没有什么不愉快，不知道是不是冥冥中早有预料。后来外婆去世，我妈和她关系一直不好，也不知道是回不去还是不想回去，最后是元旦假期我爸带着我回去的，小孩子哪能明白什么生死，不知道我爸为什么哭，全程只是当个走流程的NPC。外婆之前是爷爷，至于外公则是从我出生就没见过。&lt;/p&gt;
&lt;p&gt;  写着写着，泪水就止不住地往下掉，明明还有很多话想写，尽管知道这样的结尾属实潦草，但实在是没法继续写下去。最近越来越容易哭了，也不知道是好是坏，如何是好。&lt;/p&gt;
&lt;p&gt;  但是，聪明的，你告诉我，人生的意义又是什么呢？&lt;/p&gt;
</content:encoded></item><item><title>Windows Server服务器nginx配置</title><link>https://3cqscbr.club/posts/nginxforwinserver/nginx-for-winserver/</link><guid isPermaLink="true">https://3cqscbr.club/posts/nginxforwinserver/nginx-for-winserver/</guid><description>用nginx来处理服务器各式端口需求</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;  众所周知，想在Windows Server服务器端部署一个网页让别人访问，其实非常简单，只需新建一个index.html，在里面写一些你想展示的文本，然后用IIS部署即可，而且IIS算是微软做的Windows专精，图形界面非常方便。然而一旦需求稍微复杂一些，比如想部署多个应用，或者在不同访问间实现跳转等等，IIS用图形界面来回操作又费时又不直观，当然直接改web.config的话当我没说（不是）。&lt;/p&gt;
&lt;p&gt;  因此我把目光投向了nginx，它的优点在于只要编辑nginx.conf就能解决90%问题，完全由代码块来控制逻辑清晰，此外，还有高性能、低占用、跨平台、稳定性等多项优点。正好最近刚把服务器服务的部署从IIS转成了nginx，趁经验还在脑子里热乎着赶紧留个档，一是方便以后使用，二来以资同好。&lt;/p&gt;
&lt;p&gt;  当然，现在很多问题拿去问AI大部分也可以解决，但想把AI用好还是得对相关领域有基础的了解，否则人工智能可能就跟个人工智障一样。AI给的代码不亲自扫一遍多半会被坑，而且使用AI还有隐私等各种问题，所以这篇博客也有其存在的意义，菜鸡的经验也许更能指导菜鸡，而且至少也是自己存在过的证明。&lt;/p&gt;
&lt;p&gt;  闲言少叙，正文开始，右侧目录，按需跳转。&lt;/p&gt;
&lt;h1&gt;安装nginx&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;点击&lt;a href=&quot;https://nginx.org/en/download.html&quot;&gt;https://nginx.org/en/download.html&lt;/a&gt;自动跳转至官网，Stable version中选择nginx/Windows-1.xx.x即可，以下均以1.26.0为例。
如有其他版本需求，请使用魔法访问&lt;a href=&quot;https://github.com/nginx/nginx/releases&quot;&gt;https://github.com/nginx/nginx/releases&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;将zip解压至需要的路径，以下均以D:\nginx为例&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;配置nginx.conf&lt;/h1&gt;
&lt;p&gt;nginx.conf是配置nginx的核心，其位于根目录\conf下。
nginx.conf的全部语法可详参其官方文档&lt;a href=&quot;https://nginx.org/en/docs/&quot;&gt;https://nginx.org/en/docs/&lt;/a&gt;，以下仅列举比较常用可能用到的部分。&lt;/p&gt;
&lt;h2&gt;结构简介&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 全局设定
......
# events 块
events {

}
# http 块
http {
    # http全局设定
    ......
    # server块
    server {
        # server 配置
        ......
        # location块，
        location [PATTERN] {

        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;格式说明&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;参数类型&lt;/th&gt;
&lt;th&gt;可用空间&lt;/th&gt;
&lt;th&gt;默认设置&lt;/th&gt;
&lt;th&gt;注释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error_log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt; &lt;code&gt;[level]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main&lt;/code&gt; &lt;code&gt;http&lt;/code&gt; &lt;code&gt;mail&lt;/code&gt; &lt;code&gt;stream&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;error_log logs/error.log error;&lt;/td&gt;
&lt;td&gt;配置日志。path指定日志的路径和名称，level指定日志记录级别，记录当前等级及以上的日志，从低到高为 &lt;code&gt;debug&lt;/code&gt;、 &lt;code&gt;info&lt;/code&gt;、 &lt;code&gt;notice&lt;/code&gt;、 &lt;code&gt;warn&lt;/code&gt;、 &lt;code&gt;error&lt;/code&gt;、 &lt;code&gt;crit&lt;/code&gt;、 &lt;code&gt;alert&lt;/code&gt;、 &lt;code&gt;emerg&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;error_log&lt;/code&gt;表示可以设置的指令&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file&lt;/code&gt; &lt;code&gt;[level]&lt;/code&gt;表示必须设置 &lt;code&gt;file&lt;/code&gt;参数，&lt;code&gt;[level]&lt;/code&gt;表示 &lt;code&gt;level&lt;/code&gt;参数为可选配参数。&lt;code&gt;number&lt;/code&gt;/&lt;code&gt;auto&lt;/code&gt;则表示必须在 &lt;code&gt;number&lt;/code&gt;和 &lt;code&gt;auto&lt;/code&gt;中二选一。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt; &lt;code&gt;http&lt;/code&gt; &lt;code&gt;mail&lt;/code&gt; &lt;code&gt;stream&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;表示该指令可以在这些部分中正常使用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;error_log logs/error.log error;&lt;/code&gt;表示当不设置该指令时，nginx的默认设置，&lt;code&gt;-&lt;/code&gt;表示没有默认设置，无法默认配置，或者简单理解看情况来&lt;/li&gt;
&lt;li&gt;&lt;code&gt;注释&lt;/code&gt;对该指令的作用和使用方法进行简要说明。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;需要注意&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在语法上nginx每条语句结束有分号 &lt;code&gt;;&lt;/code&gt;，而块结构的结尾不需要。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;合理使用 &lt;code&gt;#&lt;/code&gt;号对nginx.conf进行注释。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下以实际应用的nginx.conf文档为例，分块进行说明，在每一块下对当前使用到的指令进行详解。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不代表该指令只能运用于该块中，指令的适用空间请参照其“可用空间”栏。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;全局部分&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;worker_processes  auto;
error_log  logs/error.log  warn;
pid        logs/nginx.pid;
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;参数类型&lt;/th&gt;
&lt;th&gt;可用空间&lt;/th&gt;
&lt;th&gt;默认设置&lt;/th&gt;
&lt;th&gt;注释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;worker_processes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;/&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;worker_processes 1;&lt;/td&gt;
&lt;td&gt;指定工作进程数。最优数值取决于CPU核心数、存储数据的硬盘数、负载模式等。不清楚可以使用auto，自动检测可用的CPU核心数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error_log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt; &lt;code&gt;[level]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main&lt;/code&gt; &lt;code&gt;http&lt;/code&gt; &lt;code&gt;mail&lt;/code&gt; &lt;code&gt;stream&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;error_log logs/error.log error;&lt;/td&gt;
&lt;td&gt;配置日志。path指定日志的路径和名称，level指定日志记录级别，记录当前等级及以上的日志，从低到高为 &lt;code&gt;debug&lt;/code&gt;、 &lt;code&gt;info&lt;/code&gt;、 &lt;code&gt;notice&lt;/code&gt;、 &lt;code&gt;warn&lt;/code&gt;、 &lt;code&gt;error&lt;/code&gt;、 &lt;code&gt;crit&lt;/code&gt;、 &lt;code&gt;alert&lt;/code&gt;、 &lt;code&gt;emerg&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pid logs/nginx.pid;&lt;/td&gt;
&lt;td&gt;指定文件存储主进程的ID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意，&lt;code&gt;file&lt;/code&gt;默认使用Nginx根目录的相对路径，使用绝对路径，需要在前面加上 &lt;code&gt;/&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;events块&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;events{
    worker_connections  2048;
    multi_accept        on;
    use                 epoll;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;参数类型&lt;/th&gt;
&lt;th&gt;可用空间&lt;/th&gt;
&lt;th&gt;默认设置&lt;/th&gt;
&lt;th&gt;注释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;worker_connections&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;worker_connections 512;&lt;/td&gt;
&lt;td&gt;设置由所有连接的最大数量，包含与客户端的连接，以及与代理服务器等的连接等。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;multi_accept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;on&lt;/code&gt;/&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;multi_accept off;&lt;/td&gt;
&lt;td&gt;同时接受一个新的连接/同时接受所有新的连接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;use&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;method&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;指定要连接处理方法。nginx 默认会使用最高效的方法。可选类型有 &lt;code&gt;selelct&lt;/code&gt;、&lt;code&gt;poll&lt;/code&gt;、 &lt;code&gt;kqueue&lt;/code&gt;、 &lt;code&gt;epoll&lt;/code&gt;、 &lt;code&gt;resig&lt;/code&gt;、 &lt;code&gt;/dev/poll&lt;/code&gt;、 &lt;code&gt;eventport&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;http块&lt;/h2&gt;
&lt;p&gt;写在http块下，server块外的，相当于http的全局设定，对http块下的所有server生效。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    sendfile_max_chunk  100k;
    send_timeout    75;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    client_max_body_size 100M;

    # 日志格式
    log_format  main  &apos;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &apos;
                      &apos;$status $body_bytes_sent &quot;$http_referer&quot; &apos;
                      &apos;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&apos;;

    access_log  logs/access.log  main;


    # 防CC攻击
    limit_req_zone $binary_remote_addr zone=cc:10m rate=10r/s;

    # 防止中文出现乱码
    charset utf-8;

    server{}
    server{}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;参数类型&lt;/th&gt;
&lt;th&gt;可用空间&lt;/th&gt;
&lt;th&gt;默认设置&lt;/th&gt;
&lt;th&gt;注释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;/&lt;code&gt;mask&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;any&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;导入其他配置文件，如include mime.types导入文件扩展名和文件类型的映射，其中mime.types是相对路径，其与nginx.conf在同目录下&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;default_type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mime-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;default_type text/plain;&lt;/td&gt;
&lt;td&gt;定义响应的默认类型，可以使用 &lt;code&gt;types&lt;/code&gt;句法块设置类型的映射&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sendfile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;on&lt;/code&gt;/&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sendfile off;&lt;/td&gt;
&lt;td&gt;开启/关闭高效率传输文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sendfile_max_chunk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;serverlocation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sendfile_max_chunk 2m;&lt;/td&gt;
&lt;td&gt;设置单个sendfile()调用中可以传输的最大数据量。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;send_timeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;send_timeout 60s;&lt;/td&gt;
&lt;td&gt;设置向客户端发送响应的超时时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcp_nopush&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;on&lt;/code&gt;/&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tcp_nopush off;&lt;/td&gt;
&lt;td&gt;启用或禁用FreeBSD上的TCP_NOPUSH(或Linux上的TCP_CORK)，仅启用sendfile时生效，启用后会以完整数据包发送文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tcp_nodelay&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;on&lt;/code&gt;/&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tcp_nodelay on;&lt;/td&gt;
&lt;td&gt;启用或禁用TCP_NODELAY，在连接进入keep-alive时，或在SSL连接、无缓冲代理、WebSocket代理时生效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;keepalive_timeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;timeout&lt;/code&gt; &lt;code&gt;[header_timeout]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;keepalive_timeout 75s;&lt;/td&gt;
&lt;td&gt;第一个timeout参数设置长连接超时时间，第二个可选参数是给响应头设置超时时间，在部分浏览器中生效&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;client_max_body_size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;size&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;client_max_body_size 1m;&lt;/td&gt;
&lt;td&gt;设置客户端请求正文允许的最大值,如果有文件传输服务请注意调整&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;log_format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt; &lt;code&gt;[escape=default/json/none]&lt;/code&gt; &lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;log_format combined &quot;...&quot;;&lt;/td&gt;
&lt;td&gt;自定义一个日志格式，后续使用name引用该格式。可选参数escape指定文件格式，default默认纯文本，string指定输出内容格式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;access_log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;path&lt;/code&gt; &lt;code&gt;[format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt; &lt;code&gt;limit_except&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;access_log logs/access.log combined;&lt;/td&gt;
&lt;td&gt;设置日志的路径、格式、配置。format可以引用log_format的name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;access_log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;设置特殊参数off会取消当前级别的所有access_log&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limit_req_zone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;key zone=name:size rate=rate [sync]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;设置处理请求的共享参数，$binary_remote_addr zone=cc:10m rate=10r/s表示所有状态存在名为cc的1mbit的空间里，每秒最多处理10个请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;char_set&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;charset&lt;/code&gt;/&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;charset off;&lt;/td&gt;
&lt;td&gt;将指定的字符集添加到“Content-Type”响应头字段&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;下表展示 &lt;code&gt;log_format&lt;/code&gt;的 &lt;code&gt;string&lt;/code&gt;参数编写中可能用到的参数。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量名&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$bytes_sent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;发送到客户端的字节数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$connection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;连接序列号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$connection_requests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当前通过连接发出的请求数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$msec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;日志写入时间（秒），精确到毫秒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$pipe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;是否为管道化请求，&quot;p&quot;/&quot;-&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$request_length&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;请求长度（包括请求行、标头和请求正文）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$request_time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;请求处理时间（秒），精确到毫秒，指从客户端读取第一个字节到将最后一个字节发送到客户端后写入日志之间经过的时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;响应状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$time_iso8601&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ISO 8601标准格式的当地时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$time_local&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通用日志格式的本地时间&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;server块&lt;/h2&gt;
&lt;p&gt;大体与http块一致，以下用两个例子来说明，第一个是正常截取80端口请求，第二个是对443的https请求反向代理至本地8000端口。重复指令和参数不再赘述。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
        listen 80;
        server_name your_server_name;

        root E:/yourWebsite;
        index index.html;

        error_page 404 /404.html
        error_page 500 502 503 /50x.html
  
  
        # 防护措施
  
        # 超出部分429 Too Many Requests 
        limit_req zone=cc burst=20 nodelay;

        # 禁止恶意请求方法，禁止恶意访问
        location ~ /(\.|git|svn|log|tmp|backup|config|database|ini|bat|cmd|sh|bak)$ {
            deny all;
            return 403;
        }
  
        # 图片类使用30天内缓存，不写入日志
        location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot)$ {
            expires 30d;
            add_header Cache-Control &quot;public, max-age=2592000&quot;;
            access_log off;
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;server {
        listen 443 ssl;
        server_name your_server_name;
  
        # 证书路径
        ssl_certificate      C:/certifications/LetsEncrypt-Certs/full-chain.pem;
        ssl_certificate_key  C:/certifications/LetsEncrypt-Certs/private_key.pem;
  
        # ssl安全配置
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_session_timeout 10m;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        add_header Strict-Transport-Security &quot;max-age=31536000; includeSubDomains&quot; always;

        # 反向代理
  
        # 放开文件上传大小限制（Seafile大文件上传必备）
        client_max_body_size 10G;
        # 禁用缓存（避免Seafile动态内容缓存异常）
        proxy_buffering off;

        location / {
            proxy_pass         http://127.0.0.1:8000;   # 反向代理至本地8000端口
            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_connect_timeout 3600;
            proxy_read_timeout 3600;
            proxy_send_timeout 3600;
            proxy_http_version 1.1;
        }
   

        # 防护措施
        limit_req zone=cc burst=20 nodelay;

        # # 禁止恶意请求
        location ~ /(\.|git|svn|log|tmp|backup|config|database|ini|bat|cmd|sh|bak)$ {
            deny all;
            return 403;
        }
        if ($request_method !~ ^(GET|POST|HEAD)$) {
            return 405;
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用的基本参数为 &lt;code&gt;listen&lt;/code&gt;、&lt;code&gt;server_name&lt;/code&gt;、&lt;code&gt;root&lt;/code&gt;、&lt;code&gt;index&lt;/code&gt;，详解如下&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;可用空间&lt;/th&gt;
&lt;th&gt;默认设置&lt;/th&gt;
&lt;th&gt;注释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;address[:port]&lt;/code&gt; &lt;code&gt;[default_server]&lt;/code&gt; &lt;code&gt;[ssl]&lt;/code&gt; &lt;code&gt;[http2/quic]&lt;/code&gt; &lt;code&gt;[proxy_protocol]&lt;/code&gt; &lt;code&gt;[setfib=number]&lt;/code&gt; &lt;code&gt;[fastopen=number]&lt;/code&gt; &lt;code&gt;[backlog=number]&lt;/code&gt; &lt;code&gt;[rcvbuf=size]&lt;/code&gt; &lt;code&gt;[sndbuf=size]&lt;/code&gt; &lt;code&gt;[accept_filter=filter]&lt;/code&gt; &lt;code&gt;[deferred]&lt;/code&gt; &lt;code&gt;[bind]&lt;/code&gt; &lt;code&gt;[ipv6only=on/off]&lt;/code&gt; &lt;code&gt;[reuseport]&lt;/code&gt; &lt;code&gt;[so_keepalive=on/off/[keepidle]:[keepintvl]:[keepcnt]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;listen *:80 / *:8000;&lt;/td&gt;
&lt;td&gt;设置监听地址，如listen 127.0.0.1:8000;/listen 127.0.0.1;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;port&lt;/code&gt; &lt;code&gt;[default_server]&lt;/code&gt; &lt;code&gt;[ssl]&lt;/code&gt; &lt;code&gt;[http2/quic]&lt;/code&gt; &lt;code&gt;[proxy_protocol]&lt;/code&gt; &lt;code&gt;[setfib=number]&lt;/code&gt; &lt;code&gt;[fastopen=number]&lt;/code&gt; &lt;code&gt;[backlog=number]&lt;/code&gt; &lt;code&gt;[rcvbuf=size]&lt;/code&gt; &lt;code&gt;[sndbuf=size]&lt;/code&gt; &lt;code&gt;[accept_filter=filter]&lt;/code&gt; &lt;code&gt;[deferred]&lt;/code&gt; &lt;code&gt;[bind]&lt;/code&gt; &lt;code&gt;[ipv6only=on/off]&lt;/code&gt; &lt;code&gt;[reuseport]&lt;/code&gt; &lt;code&gt;[so_keepalive=on/off/[keepidle]:[keepintvl]:[keepcnt]]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;listen *:80 / *:8000;&lt;/td&gt;
&lt;td&gt;设置监听端口，如listen 8000;/listen *:8000;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server_name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;server_name &quot;&quot;;&lt;/td&gt;
&lt;td&gt;基于基于请求头的&quot;HOST&quot;字段捕获服务器名称，可捕获多个。详参&lt;a href=&quot;https://nginx.org/en/docs/http/ngx_http_core_module.html#listen&quot;&gt;官方说明&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;root&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;root html;&lt;/td&gt;
&lt;td&gt;设置请求的根目录，path中可以包含除 &lt;code&gt;$document_root&lt;/code&gt;和 &lt;code&gt;$realpath_root&lt;/code&gt;之外的各种变量。如location /i/{root /data/w3;}，请求为/i/top.gif时，将发送/data/w3/i/top.gif&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;error_page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;code ...&lt;/code&gt; &lt;code&gt;[=[response]]&lt;/code&gt; &lt;code&gt;uri&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;根据错误设置对应错误页&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;index&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt;  &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;index index.html;&lt;/td&gt;
&lt;td&gt;设置作为主页的网页，实际是将所有 &lt;code&gt;&quot;/&quot;&lt;/code&gt;的请求转到了index下&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;return&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;code&lt;/code&gt; &lt;code&gt;[text]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;停止处理并返回指定代码及响应正文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;return&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[code]&lt;/code&gt; &lt;code&gt;URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;指定重定向URL（301、302、303、307、308），可以指定为本地URI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;limit_req&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zone=name [burst=number] [nodelay/delay=number]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;根据设置的name共享区进行判定，当请求频率超出共享区的rate限制时，按照delay设置处理burst数量的请求，超出burst部分返回429&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;add_header&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt; &lt;code&gt;value&lt;/code&gt; &lt;code&gt;[always]&lt;/code&gt;;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;响应为200,201,204,206,301,302,303,304,307,308时将指定字段添加到响应头，always为无论响应代码必然添加&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;接收https时SSL常用参数如下，其中SSL证书为必备项。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;参数类型&lt;/th&gt;
&lt;th&gt;可用空间&lt;/th&gt;
&lt;th&gt;默认设置&lt;/th&gt;
&lt;th&gt;注释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ssl_certificate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;设置符合该server块的ssl证书(PEM格式，full-chain)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ssl_certificate_key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;设置符合该server块的ssl证书（PEM格式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ssl_protocols&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[SSLv2]&lt;/code&gt; &lt;code&gt;[SSLv3]&lt;/code&gt; &lt;code&gt;[TLSv1]&lt;/code&gt; &lt;code&gt;[TLSv1.1]&lt;/code&gt; &lt;code&gt;[TLSv1.2]&lt;/code&gt; &lt;code&gt;[TLSv1.3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ssl_protocols TLSv1.2 TLSv1.3;&lt;/td&gt;
&lt;td&gt;启用指定协议&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ssl_session_timeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ssl_session_timeout 5m;&lt;/td&gt;
&lt;td&gt;设置客户端可以复用会话参数的时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ssl_session_cache&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;off&lt;/code&gt;/&lt;code&gt;none&lt;/code&gt;/&lt;code&gt;[builtin[:size]]&lt;/code&gt; &lt;code&gt;[shared:name:size]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ssl_session_cache none;&lt;/td&gt;
&lt;td&gt;设置存储会话的缓存的大小&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ssl_session_tickets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;on&lt;/code&gt;/&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ssl_session_tickets on;&lt;/td&gt;
&lt;td&gt;通过 TLS 会话票证启用或禁用会话复用&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;proxy常用参数如下，常见于反向代理。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;参数类型&lt;/th&gt;
&lt;th&gt;可用空间&lt;/th&gt;
&lt;th&gt;默认设置&lt;/th&gt;
&lt;th&gt;注释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;proxy_pass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;URL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt; &lt;code&gt;limit_except&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;设置代理服务器的协议和地址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;proxy_set_header&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;field&lt;/code&gt; &lt;code&gt;value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;proxy_set_header Host $proxy_host; proxy_set_header Connection close;&lt;/td&gt;
&lt;td&gt;设置或者重新设置传递给代理服务器的请求头&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;proxy_connect_timeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;proxy_connect_timeout 60s;&lt;/td&gt;
&lt;td&gt;设置和代理服务器连接超时时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;proxy_read_timeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;proxy_read_timeout 60s;&lt;/td&gt;
&lt;td&gt;设置和代理服务器两个成功相应之间的超时时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;proxy_send_timeout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;proxy_send_timeout 60s;&lt;/td&gt;
&lt;td&gt;设置和代理服务器发送请求的超时时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;proxy_http_version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.0&lt;/code&gt;/&lt;code&gt;1.1&lt;/code&gt;/&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;proxy_http_version 1.0;&lt;/td&gt;
&lt;td&gt;设置代理使用的 HTTP 协议版本&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;注意，server块的匹配是有优先级差异的，即精准域名匹配 &amp;gt;&amp;gt; &lt;code&gt;*&lt;/code&gt;开头的通配 &amp;gt;&amp;gt; &lt;code&gt;*&lt;/code&gt;结尾的通配 &amp;gt;&amp;gt; 正则匹配 &amp;gt;&amp;gt; 默认兜底。同优先级下，以配置文件中的先后顺序为准。
举例来说：&lt;code&gt;server_name example.com;&lt;/code&gt; &amp;gt;&amp;gt; &lt;code&gt;server_name *.example.com;&lt;/code&gt; &amp;gt;&amp;gt; &lt;code&gt;server_name example.*;&lt;/code&gt; &amp;gt;&amp;gt; &lt;code&gt;server_name ~^.*\.example\.com$;&lt;/code&gt; &amp;gt;&amp;gt; &lt;code&gt;server_name _;&lt;/code&gt;。
如果要设置兜底的server块，可以考虑 &lt;code&gt;server_name _;&lt;/code&gt;同时 &lt;code&gt;listen&lt;/code&gt;处添加 &lt;code&gt;default_server&lt;/code&gt;参数，强制兜底。
如需学习正则，可参考&lt;a href=&quot;https://github.com/ziishaned/learn-regex&quot;&gt;learn regex&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;location块&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;        location ~ /(\.|git|svn|log|tmp|backup|config|database|ini|bat|cmd|sh|bak)$ {
            deny all;
            return 403;
        }
        location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot)$ {
            # 缓存静态资源30天
            expires 30d;
            add_header Cache-Control &quot;public, max-age=2592000&quot;;
            # 关闭日志
            access_log off;
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;参数类型&lt;/th&gt;
&lt;th&gt;可用空间&lt;/th&gt;
&lt;th&gt;默认设置&lt;/th&gt;
&lt;th&gt;注释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deny&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;address&lt;/code&gt;/&lt;code&gt;CIDR&lt;/code&gt;/&lt;code&gt;unix:&lt;/code&gt;/ &lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt; &lt;code&gt;limit_except&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;拒绝指定网络或地址的访问。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;allow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;address&lt;/code&gt;/&lt;code&gt;CIDR&lt;/code&gt;/&lt;code&gt;unix:&lt;/code&gt;/ &lt;code&gt;all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt; &lt;code&gt;limit_except&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;允许指定网络或地址的访问。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;expires&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[modified]&lt;/code&gt; &lt;code&gt;time&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;expires off;&lt;/td&gt;
&lt;td&gt;启用或禁用对响应头中 &lt;code&gt;Expires&lt;/code&gt;和 &lt;code&gt;Cache-Control&lt;/code&gt;的添加修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;expires&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;epoch&lt;/code&gt;/&lt;code&gt;max&lt;/code&gt;/&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http&lt;/code&gt; &lt;code&gt;server&lt;/code&gt; &lt;code&gt;location&lt;/code&gt; &lt;code&gt;if in location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;expires off;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;nginx相关命令&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;D:
cd D:/nginx
nginx -c /yourPath/yourSite/nginx.conf
nginx -t
start nginx
nginx -s stop
nginx -s reload
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;D:   cd D:/nginx切换到D盘下的nginx目录（nginx.exe所在目录）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nginx -c /yourPath/yourSite/nginx.conf设置一个新的路径配置你的nginx.conf，如不设置，默认为/conf/nginx.conf&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nginx -t校验配置文件语法是否正确，正确则输出如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nginx: the configuration file /yourPath/yourSite/nginx.conf syntax is ok
nginx: configuration file /yourPath/yourSite/nginx.conf test is successful
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;start nginx校验通过后，启动nginx服务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nginx -s
stop表示迅速停止，quit表示优雅地停止，reload表示优雅地停止并重新加载配置文件&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;p&gt;  以上仅为菜鸟的经验，注意根据需求配置server块，对不同请求进行截取，调试时合理利用日志文件。&lt;/p&gt;
&lt;p&gt;  另外，这篇文章中提到的ssl证书如何免费申请、设置和续约，后续有时间再专门写一篇吧。&lt;/p&gt;
</content:encoded></item><item><title>Voice Chatter 下载及使用说明</title><link>https://3cqscbr.club/posts/voicechatter/voice-chatter/</link><guid isPermaLink="true">https://3cqscbr.club/posts/voicechatter/voice-chatter/</guid><description>互联网拾遗，实用工具下载</description><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;下载说明&lt;/h1&gt;
&lt;p&gt;项目原网页见&lt;a href=&quot;http://voicechatter.net&quot;&gt;http://voicechatter.net&lt;/a&gt;，目前已失效，可通过&lt;a href=&quot;https://web.archive.org/web/20121124022625/http://voicechatter.org/downloads.php&quot;&gt;webArchieve&lt;/a&gt;访问历史版本。&lt;/p&gt;
&lt;p&gt;备份、源码及下载链接可见&lt;a href=&quot;https://sourceforge.net/projects/voicechatter/&quot;&gt;此链接&lt;/a&gt;。&lt;/p&gt;
&lt;h3&gt;Voice Chatter (Client)&lt;/h3&gt;
&lt;p&gt;voiceChatter客户端下载&lt;a href=&quot;https://sourceforge.net/projects/voicechatter/files/VoiceChatter%20Client/1.5.0/VoiceChatter-win32-1.5.0.exe/download&quot;&gt;点此&lt;/a&gt;，备用链接1&lt;a href=&quot;dl/VoiceChatter-win32-1.5.0.exe&quot;&gt;点此&lt;/a&gt;，备用链接2&lt;a href=&quot;https://web.archive.org/web/20121124022625/http://voicechatter.net/files/VoiceChatter-win32-1.5.0.exe&quot;&gt;点此&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后更新：2011年11月19日&lt;/p&gt;
&lt;h3&gt;Voice Chatter (Server)&lt;/h3&gt;
&lt;p&gt;voiceChatter服务器端下载&lt;a href=&quot;https://sourceforge.net/projects/voicechatter/files/VoiceChatter%20Server/1.5.0/VoiceChatterServer-win32-1.5.0.zip&quot;&gt;点此&lt;/a&gt;，备用链接1&lt;a href=&quot;dl/VoiceChatterServer-win32-1.5.0.exe&quot;&gt;点此&lt;/a&gt;，备用链接2&lt;a href=&quot;https://web.archive.org/web/20121124022625/http://voicechatter.net/files/VoiceChatterServer-win32-1.5.0.zip&quot;&gt;点此&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后更新：2011年11月19日&lt;/p&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h1&gt;使用方法&lt;/h1&gt;
&lt;h2&gt;服务器端&lt;/h2&gt;
&lt;h3&gt;VoiceChatterServer软件设置&lt;/h3&gt;
&lt;p&gt;服务器端安装并打开VoiceChatterServer.exe&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;指定通信使用的端口，直接回车即使用默认使用UDP通信，默认使用7878端口&amp;lt;span id=&quot;port&quot;&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Config file path is ./. file is vchatserver.conf
This appears to be a new server. Some information is needed in order to configure the servers.
Answer the following questions:
Enter the UDP port that will be used for this server.
Leaving this blank will default the port to 7878:
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;输入管理员密码，最长32位&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Enter an admin password (max length is 32)
: yourPassword1
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;为服务器指定密码（访客密码），最长32位，直接回车即不设置密码&amp;lt;span id=&quot;GuestPassword&quot;&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Enter a password for the server, or leave blank for no password (max length is 32)
: yourPaaword2
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;为服务器命名&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Enter a name for the server
: yourServerName
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;指定服务器允许链接的最大客户端数量&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Enter a limit to the number of clients that can be in the server at the same time,
or leave this blank or enter 0 to have no limit
: yourLimit
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;输入所需的语音编解码器频段，从1到3语音质量从差到好&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Enter the desired voice codec band (value between 1 and 3)
  (1) Narrow Band - 8KHz (worst quality)
  (2) Wide Band - 16KHz (good quality)
  (3) Ultra-wide Band - 32KHz (best quality)
: yourChoice
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;输入所需的语音编解码器质量，从0到10语音质量从差到好，语音质量越好，用的带宽越多&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Enter the desired voice codec quality. This is a value between 0 and 10,
0 being the worst quality, 10 being the best quality.
Note that the better the quality the more bandwidth it will use.
: yourChoice 
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;是否启用远程管理？（似乎即使这里关闭了，在客户端依然可以通过输入管理员密码以启用）
如果启用了则后会使用到TCP。&amp;lt;span id=&quot;TCP&quot;&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Should the remote admin interface be enabled? 
Enabling this will bind a TCP socket to the same port as the port entered above
that will allow the use of Voicechatter&apos;s remote admin interface.
If you do not know what this means, it is perfectly safe to answer &apos;no&apos;
(y/n): yourChoice
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;是否启用IPv6？（一般不开就行）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Should IPv6 functionality be enabled? 
Turning this on may make the server unreachable if your os is not configured for proper IPv6 support.
If you don&apos;t know what any of this means, or if you are not sure that your OS or network will support IPv6,
answer &apos;no&apos; to this question.
(y/n): yourChoice
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;服务器端设置完成，出现如下字样&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Configuration is now complete, starting server...
YYYY/MM/DD HH:MM:SS: Starting server version 1.5.0...
Starting server
Checking for inactive clients
READ: 0 bytes/10 sec(0.00 kB/s，0.00 kb/s)
SEND: 0 bytes/10 sec(0.00 KB/s，0.00 kb/s)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;br&amp;gt;&lt;/p&gt;
&lt;h3&gt;防火墙设置&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;按下Win，搜索防火墙，或按照如下顺序点击 控制面板 - 系统和安全 - Windows Defender 防火墙 - 高级设置。
打开 &lt;strong&gt;高级安全 Windows防火墙&lt;/strong&gt;，在入站和出站规则中新建允许VoiceChatterServer.exe的规则&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;高级防火墙界面
&lt;img src=&quot;pic%5CfwDefender1.png&quot; alt=&quot;防火墙1&quot; title=&quot;界面展示&quot; /&gt;&lt;/li&gt;
&lt;li&gt;右键新建规则
&lt;img src=&quot;pic%5CfwDefender2.png&quot; alt=&quot;防火墙2&quot; title=&quot;新建规则&quot; /&gt;&lt;/li&gt;
&lt;li&gt;选择规则类型
&lt;img src=&quot;pic%5CfwDefender3.png&quot; alt=&quot;防火墙3&quot; title=&quot;规则类型&quot; /&gt;&lt;/li&gt;
&lt;li&gt;选择VoiceChatter程序所在路径
&lt;img src=&quot;pic%5CfwDefender4.png&quot; alt=&quot;防火墙4&quot; title=&quot;程序路径&quot; /&gt;&lt;/li&gt;
&lt;li&gt;指定连接匹配时的操作
&lt;img src=&quot;pic%5CfwDefender5.png&quot; alt=&quot;防火墙5&quot; title=&quot;连接操作&quot; /&gt;&lt;/li&gt;
&lt;li&gt;指定规则运用场景
&lt;img src=&quot;pic%5CfwDefender6.png&quot; alt=&quot;防火墙6&quot; title=&quot;配置文件&quot; /&gt;&lt;/li&gt;
&lt;li&gt;命名并附注
&lt;img src=&quot;pic%5CfwDefender7.png&quot; alt=&quot;防火墙7&quot; title=&quot;名称备注&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;前往云服务器的控制台为防火墙添加放行规则。
规则选择UDP，如果在&lt;a href=&quot;#TCP&quot;&gt;第8步&lt;/a&gt;选择了启用，请额外添加TCP规则
端口默认填7878，如果在&lt;a href=&quot;#port&quot;&gt;第1步&lt;/a&gt;自定义了端口，则填写你输入的端口&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;客户端&lt;/h2&gt;
&lt;p&gt;客户端下载后打开VoiceChatter.exe&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Self - Connect - New Server&lt;/p&gt;
&lt;p&gt;其中Password输入&lt;a href=&quot;#GuestPassword&quot;&gt;第3步&lt;/a&gt;设定的服务器密码，如未设置则留空即可。
&lt;img src=&quot;pic%5Csample1.png&quot; alt=&quot;Sample&quot; title=&quot;示例图1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填完信息点击connect，听到&quot;connection established&quot;提示音
&lt;img src=&quot;pic%5Csample2.png&quot; alt=&quot;Sample&quot; title=&quot;示例图2&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Self - Settings
选择你使用的麦克风、扬声器，
Talk Key指定按住说话的按键
&lt;img src=&quot;pic%5Csample3.png&quot; alt=&quot;Sample&quot; title=&quot;示例图3&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item></channel></rss>