<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: DD</title>
    <description>The latest articles on DEV Community by DD (@kevin_tan).</description>
    <link>https://dev.to/kevin_tan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3362768%2F75a9b249-178f-41d3-81fd-08d27499432d.png</url>
      <title>DEV Community: DD</title>
      <link>https://dev.to/kevin_tan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kevin_tan"/>
    <language>en</language>
    <item>
      <title>NetCore中Singleton、Transient、Scoped举例分析三种模式的区别</title>
      <dc:creator>DD</dc:creator>
      <pubDate>Tue, 26 May 2026 13:49:17 +0000</pubDate>
      <link>https://dev.to/kevin_tan/netcorezhong-singleton-transient-scopedju-li-fen-xi-san-chong-mo-shi-de-qu-bie-5889</link>
      <guid>https://dev.to/kevin_tan/netcorezhong-singleton-transient-scopedju-li-fen-xi-san-chong-mo-shi-de-qu-bie-5889</guid>
      <description>&lt;p&gt;在 ASP.NET Core 的依赖注入（Dependency Injection, DI）容器中，&lt;strong&gt;Singleton、Transient 和 Scoped&lt;/strong&gt; 是三种核心生命周期管理方式，用来控制服务实例的创建与共享规则。&lt;/p&gt;

&lt;p&gt;理解这三种模式，是掌握 ASP.NET Core 架构设计的关键基础。&lt;/p&gt;

&lt;h1&gt;
  
  
  一、代码示例
&lt;/h1&gt;

&lt;p&gt;下面用一个简单的示例来说明它们之间的区别：&lt;/p&gt;

&lt;h2&gt;
  
  
  1. 控制器调用
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ApiController&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"api/[controller]"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ControllerBase&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IServiceProvider&lt;/span&gt; &lt;span class="n"&gt;_serviceProvider&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;TestController&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IServiceProvider&lt;/span&gt; &lt;span class="n"&gt;serviceProvider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_serviceProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serviceProvider&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"======= 收到 API 请求 ======="&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;my1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_serviceProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IMyService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;my2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_serviceProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IMyService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

            &lt;span class="n"&gt;my1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DoSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;my2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DoSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"======= 结束 API 请求 =======\n\n"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. 服务定义
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IMyService&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;DoSomething&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IMyService&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_instanceId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;_instanceId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shared&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;999&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"[MyService-构造函数] 实例 Id 为: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_instanceId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;DoSomething&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"[MyService-方法调用] 实例 Id 为: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;_instanceId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. 注册方式
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 使用 Singleton 生命周期的示例&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddSingleton&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IMyService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// 使用 Scoped 生命周期的示例&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddScoped&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IMyService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// 使用 Transient 生命周期的示例&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddTransient&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IMyService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  二、运行结果
&lt;/h1&gt;

&lt;p&gt;现在，我们来看看它们在不同的场景中的行为：&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Singleton（单例）
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**********第一次调用API**********&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;收到&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;178&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;178&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;178&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;结束&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;

&lt;span class="c1"&gt;//**********第二次调用API**********&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;收到&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;178&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;178&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;结束&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;

&lt;span class="c1"&gt;//**********第三次调用API**********&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;收到&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;178&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;178&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;结束&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全局只创建一个实例&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;整个应用程序生命周期内共享&lt;/li&gt;
&lt;li&gt;所有请求都使用同一个对象&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 特点：&lt;strong&gt;全局唯一&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Scoped （作用域）
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**********第一次调用API**********&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;收到&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;438&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;438&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;438&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;结束&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;

&lt;span class="c1"&gt;//**********第二次调用API**********&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;收到&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;674&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;674&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;674&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;结束&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;

&lt;span class="c1"&gt;//**********第三次调用API**********&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;收到&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;365&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;365&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;365&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;结束&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;在&lt;strong&gt;同一个请求（Scope）内共享一个实例&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;不同请求之间是不同实例&lt;/li&gt;
&lt;li&gt;常见于 Web API 请求生命周期&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 特点：&lt;strong&gt;请求内单例，请求间隔离&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.Transient（瞬态）
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//**********第一次调用API**********&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;收到&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;794&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;794&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;182&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;182&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;结束&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;

&lt;span class="c1"&gt;//**********第二次调用API**********&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;收到&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;436&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;436&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;588&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;588&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;结束&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;

&lt;span class="c1"&gt;//**********第三次调用API**********&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;收到&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;391&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;391&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;构造函数&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;182&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="err"&gt;方法调用&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="err"&gt;实例&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="err"&gt;为&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;182&lt;/span&gt;
&lt;span class="p"&gt;=======&lt;/span&gt; &lt;span class="err"&gt;结束&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="err"&gt;请求&lt;/span&gt; &lt;span class="p"&gt;=======&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;每次请求都会创建一个新实例&lt;/li&gt;
&lt;li&gt;每次解析（Resolve）都会生成新的对象&lt;/li&gt;
&lt;li&gt;不共享状态&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 特点：&lt;strong&gt;用完即弃，每次都是新的&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  三、区别总结
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Singleton&lt;/td&gt;
&lt;td&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;Scoped&lt;/td&gt;
&lt;td&gt;每个请求一次&lt;/td&gt;
&lt;td&gt;请求内共享&lt;/td&gt;
&lt;td&gt;DB上下文、业务服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transient&lt;/td&gt;
&lt;td&gt;每次解析一次&lt;/td&gt;
&lt;td&gt;不共享&lt;/td&gt;
&lt;td&gt;无状态工具类&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h1&gt;
  
  
  四、使用建议
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ✔ 推荐使用方式
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;默认优先：&lt;code&gt;Scoped&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;无状态工具：&lt;code&gt;Transient&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;全局共享且线程安全：&lt;code&gt;Singleton&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚠️ 常见坑
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;❌ 在 Singleton 中注入 Scoped（容易导致作用域失效）&lt;/li&gt;
&lt;li&gt;❌ Singleton 持有可变状态（线程安全风险）&lt;/li&gt;
&lt;li&gt;❌ 过度使用 Transient（性能浪费）&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  五、总结理解
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Singleton：整个应用只有一个&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scoped：每个请求一个&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transient：每次用都是新的&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>通过 OpenResty+ MinIO + weserv/images 搭建自己的阿里云OSS</title>
      <dc:creator>DD</dc:creator>
      <pubDate>Tue, 26 May 2026 13:46:43 +0000</pubDate>
      <link>https://dev.to/kevin_tan/tong-guo-openresty-minio-weservimages-da-jian-zi-ji-de-a-li-yun-oss-2k82</link>
      <guid>https://dev.to/kevin_tan/tong-guo-openresty-minio-weservimages-da-jian-zi-ji-de-a-li-yun-oss-2k82</guid>
      <description>&lt;p&gt;下面是一套可操作的方案，基于 &lt;strong&gt;OpenResty + MinIO + weserv/images&lt;/strong&gt; 搭建一个可自托管、支持图片处理能力的“类阿里云 OSS” 服务。整体目标是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MinIO&lt;/strong&gt; 作为对象存储（兼容 S3 API）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenResty&lt;/strong&gt; 提供反向代理、鉴权、图片处理网关&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;weserv/images&lt;/strong&gt; 提供图片缩放、裁剪、格式转换等能力（类似阿里云 OSS 图片处理）&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  1. 安装 MinIO
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; minio &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 9000:9000 &lt;span class="nt"&gt;-p&lt;/span&gt; 9001:9001 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MINIO_ROOT_USER=admin"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"MINIO_ROOT_PASSWORD=admin123"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  minio/minio server /data &lt;span class="nt"&gt;--console-address&lt;/span&gt; &lt;span class="s2"&gt;":9001"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;访问 MinIO 控制台：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;管理后台：&lt;a href="http://localhost:9001" rel="noopener noreferrer"&gt;http://localhost:9001&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;S3 接口：&lt;a href="http://localhost:9000" rel="noopener noreferrer"&gt;http://localhost:9000&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  2. 安装 weserv/images（图片处理服务）
&lt;/h1&gt;

&lt;p&gt;weserv/images 本质是一个支持 URL 参数的图片处理服务器。&lt;/p&gt;

&lt;h3&gt;
  
  
  创建 Dockerfile 文件
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;FROM ghcr.io/weserv/images:5.x

RUN &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/weserv_deny_ip/d'&lt;/span&gt; /etc/nginx/nginx.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  构建并运行
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; weserv/images &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;--shm-size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1gb &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;weserv weserv/images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;示例处理 URL：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8080?url=https://example.com/a.jpg&amp;amp;w=200&amp;amp;h=200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  3. 安装 OpenResty
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; openresty &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; /opt/openresty/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf &lt;span class="se"&gt;\&lt;/span&gt;
  openresty/openresty:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  4. 配置 OpenResty 作为代理（核心 OSS 功能）
&lt;/h1&gt;

&lt;p&gt;编辑文件：&lt;code&gt;/opt/openresty/conf/nginx.conf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
    listen 80&lt;span class="p"&gt;;&lt;/span&gt;
    server_name img.example.com&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c"&gt;# minio&lt;/span&gt;

    &lt;span class="c"&gt;# 图片处理&lt;/span&gt;
    location ~&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;jpg|jpeg|png|gif|webp&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$upstream&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        rewrite_by_lua_block &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;local &lt;/span&gt;args &lt;span class="o"&gt;=&lt;/span&gt; ngx.req.get_uri_args&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="nb"&gt;local &lt;/span&gt;process &lt;span class="o"&gt;=&lt;/span&gt; args[&lt;span class="s2"&gt;"x-image-process"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;not process &lt;span class="k"&gt;then&lt;/span&gt;         
                &lt;span class="nt"&gt;--&lt;/span&gt; 没有 x-image-process 参数，直接代理到 minio
                ngx.var.upstream &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"http://127.0.0.1:9000"&lt;/span&gt; .. ngx.var.uri               
            &lt;span class="k"&gt;else&lt;/span&gt;
                &lt;span class="nt"&gt;--&lt;/span&gt; 有 x-image-process 参数，直接代理到 weserv/images
                &lt;span class="nb"&gt;local &lt;/span&gt;new_query &lt;span class="o"&gt;=&lt;/span&gt; process:gsub&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"_"&lt;/span&gt;, &lt;span class="s2"&gt;"="&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:gsub&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;","&lt;/span&gt;, &lt;span class="s2"&gt;"&amp;amp;"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;               
                ngx.var.upstream &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"http://127.0.0.1:8080/?url=127.0.0.1:9000"&lt;/span&gt; .. ngx.var.uri .. &lt;span class="s2"&gt;"&amp;amp;"&lt;/span&gt; .. new_query                
            end
        &lt;span class="o"&gt;}&lt;/span&gt;
        proxy_pass &lt;span class="nv"&gt;$upstream&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

      &lt;span class="c"&gt;# 其他资源&lt;/span&gt;
    location / &lt;span class="o"&gt;{&lt;/span&gt;
        proxy_pass   http://127.0.0.1:9000&lt;span class="p"&gt;;&lt;/span&gt;        
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;重启 OpenResty：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker restart openresty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  5. 测试访问
&lt;/h1&gt;

&lt;p&gt;① 原图访问（MinIO）&lt;br&gt;
&lt;a href="http://img.example.com/path/to/img.jpg" rel="noopener noreferrer"&gt;http://img.example.com/path/to/img.jpg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;② 缩略图（weserv/images）&lt;br&gt;
&lt;a href="http://img.example.com/path/to/img.jpg?x-image-process=w_100" rel="noopener noreferrer"&gt;http://img.example.com/path/to/img.jpg?x-image-process=w_100&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;内部转发到weserv/images处理&lt;br&gt;
&lt;a href="http://127.0.0.1:8080/?url=img.example.com/path/to/img.jpg&amp;amp;w=100" rel="noopener noreferrer"&gt;http://127.0.0.1:8080/?url=img.example.com/path/to/img.jpg&amp;amp;w=100&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;等同 OSS 的：&lt;br&gt;
?x-oss-process=image/resize,w_100&lt;/p&gt;

</description>
      <category>backend</category>
      <category>docker</category>
      <category>infrastructure</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Deploying weserv/images with Docker</title>
      <dc:creator>DD</dc:creator>
      <pubDate>Fri, 28 Nov 2025 07:19:29 +0000</pubDate>
      <link>https://dev.to/kevin_tan/deploying-weservimages-with-docker-bii</link>
      <guid>https://dev.to/kevin_tan/deploying-weservimages-with-docker-bii</guid>
      <description>&lt;h1&gt;
  
  
  Dockerfile
&lt;/h1&gt;

&lt;p&gt;For self-hosted instances, you can remove those weserv_deny_ip nginx directives from your nginx.conf.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM ghcr.io/weserv/images:5.x

RUN sed -i '/weserv_deny_ip/d' /etc/nginx/nginx.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t weserv/images .
docker run -d -p 8080:80 --shm-size=1gb --name=weserv weserv/images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Links
&lt;/h1&gt;

&lt;p&gt;Website: &lt;a href="https://wsrv.nl/" rel="noopener noreferrer"&gt;https://wsrv.nl/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/weserv/images" rel="noopener noreferrer"&gt;https://github.com/weserv/images&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker: &lt;a href="https://github.com/weserv/images/tree/5.x/docker#readme" rel="noopener noreferrer"&gt;https://github.com/weserv/images/tree/5.x/docker#readme&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fix for “IP address blocked by policy” issue: &lt;a href="https://github.com/weserv/images/issues/440" rel="noopener noreferrer"&gt;https://github.com/weserv/images/issues/440&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>devops</category>
      <category>docker</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to Install the Nextcloud All-in-One on Linux</title>
      <dc:creator>DD</dc:creator>
      <pubDate>Wed, 15 Oct 2025 06:51:55 +0000</pubDate>
      <link>https://dev.to/kevin_tan/how-to-install-the-nextcloud-all-in-one-on-linux-2pco</link>
      <guid>https://dev.to/kevin_tan/how-to-install-the-nextcloud-all-in-one-on-linux-2pco</guid>
      <description>&lt;h1&gt;
  
  
  Run Nextcloud AIO
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo docker run -d \
--init \
--sig-proxy=false \
--name nextcloud-aio-mastercontainer \
--restart always \
--publish 8090:8080 \
--env APACHE_PORT=11000 \
--env APACHE_IP_BINDING=0.0.0.0 \
--env APACHE_ADDITIONAL_NETWORK="" \
--env SKIP_DOMAIN_VALIDATION=false \
--volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
--volume /var/run/docker.sock:/var/run/docker.sock:ro \
--env NEXTCLOUD_DATADIR="/mnt/ncdata" \
ghcr.io/nextcloud-releases/all-in-one:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  All-in-One setup
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44k860mq6t9r5tr0b0cu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44k860mq6t9r5tr0b0cu.png" alt=" " width="615" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9g4bgq0nfslkypwmv26f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9g4bgq0nfslkypwmv26f.png" alt=" " width="613" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjk8arswc89dc76m7pen.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjk8arswc89dc76m7pen.png" alt=" " width="608" height="907"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  About Collabora
&lt;/h1&gt;

&lt;p&gt;When opening the document, an error may occur:&lt;br&gt;
Failed to establish socket connection or socket connection closed unexpectedly. The reverse proxy might be misconfigured, please contact the administrator. For more info on proxy configuration please checkout &lt;a href="https://sdk.collaboraonline.com/docs/installation/Proxy_settings.html" rel="noopener noreferrer"&gt;https://sdk.collaboraonline.com/docs/installation/Proxy_settings.html&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
 listen       443 ssl;
 server_name  cloud.example.com;


 ssl_certificate /path/to/certificate;
 ssl_certificate_key /path/to/key;

 # Nextcloud Web Serve
 location / {
   root    /;
   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_read_timeout 90;
   proxy_pass   http://192.168.168.10:11000/;
 }

 # static files
 location ^~ /browser {
   proxy_pass http://127.0.0.1:11000;
   proxy_set_header Host $host;
 }


 # WOPI discovery URL
 location ^~ /hosting/discovery {
   proxy_pass http://127.0.0.1:11000;
   proxy_set_header Host $host;
 }


 # Capabilities
 location ^~ /hosting/capabilities {
   proxy_pass http://127.0.0.1:11000;
   proxy_set_header Host $host;
 }


 # main websocket
 location ~ ^/cool/(.*)/ws$ {
   proxy_pass http://127.0.0.1:11000;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "Upgrade";
   proxy_set_header Host $host;
   proxy_read_timeout 36000s;
 }


 # download, presentation and image upload
 location ~ ^/(c|l)ool {
   proxy_pass http://127.0.0.1:11000;
   proxy_set_header Host $host;
 }


 # Admin Console websocket
 location ^~ /cool/adminws {
   proxy_pass http://127.0.0.1:11000;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "Upgrade";
   proxy_set_header Host $host;
   proxy_read_timeout 36000s;
 }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  About OnlyOffice
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -i -t -d -p 7070:80 \
  -e JWT_ENABLED=true \
  -e JWT_SECRET=your_jwt_secret \
  --name onlyoffice-documentserver \
  onlyoffice/documentserver:9.0.4.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to setup OnlyOffice?&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/nextcloud/all-in-one/discussions/5302" rel="noopener noreferrer"&gt;https://github.com/nextcloud/all-in-one/discussions/5302&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ONLYOFFICE/Docker-DocumentServer&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/ONLYOFFICE/Docker-DocumentServer" rel="noopener noreferrer"&gt;https://github.com/ONLYOFFICE/Docker-DocumentServer&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Useful links
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;How to Install the Nextcloud All-in-One on Linux&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://nextcloud.com/blog/how-to-install-the-nextcloud-all-in-one-on-linux/" rel="noopener noreferrer"&gt;https://nextcloud.com/blog/how-to-install-the-nextcloud-all-in-one-on-linux/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reverse Proxy Documentation&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md" rel="noopener noreferrer"&gt;https://github.com/nextcloud/all-in-one/blob/main/reverse-proxy.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;all-in-one/compose.yaml&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/nextcloud/all-in-one/blob/main/compose.yaml" rel="noopener noreferrer"&gt;https://github.com/nextcloud/all-in-one/blob/main/compose.yaml&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ESXi 虚拟机安装CentOS 8</title>
      <dc:creator>DD</dc:creator>
      <pubDate>Wed, 27 Aug 2025 02:44:20 +0000</pubDate>
      <link>https://dev.to/kevin_tan/esxi-xu-ni-ji-an-zhuang-centos-8-2fk9</link>
      <guid>https://dev.to/kevin_tan/esxi-xu-ni-ji-an-zhuang-centos-8-2fk9</guid>
      <description>&lt;h1&gt;
  
  
  添加CentOS虚拟机
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. 选择创建类型
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7jha76eqe4wimtedw5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7jha76eqe4wimtedw5l.png" alt=" " width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 选择名称和客户机操作系统
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5d7qdza6vax19elqhwwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5d7qdza6vax19elqhwwx.png" alt=" " width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. 选择存储
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti4wk08kzzfangll6r9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti4wk08kzzfangll6r9c.png" alt=" " width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. 自定义设置
&lt;/h2&gt;

&lt;p&gt;虚拟硬件&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8i4oogn3nzm30kjls07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg8i4oogn3nzm30kjls07.png" alt=" " width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnwdbilyhp6utm3wg0zv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxnwdbilyhp6utm3wg0zv.png" alt=" " width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;虚拟机选项&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p8wn5kpxlkuncl2e7va.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p8wn5kpxlkuncl2e7va.png" alt=" " width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5.即将完成
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qw17lv50b3rqlk167ie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5qw17lv50b3rqlk167ie.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  安装CentOS流程
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4velfy35u6zgvqi8ag3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn4velfy35u6zgvqi8ag3.png" alt=" " width="768" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1g9yn9j5bopcz19kbeqz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1g9yn9j5bopcz19kbeqz.png" alt=" " width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jlh439a9newglk604sk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jlh439a9newglk604sk.png" alt=" " width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  根密码
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40hy7dj597vtxdycl2dr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40hy7dj597vtxdycl2dr.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;记住勾选：允许root用户使用密码进行SSH登录&lt;/p&gt;

&lt;h2&gt;
  
  
  网络和主机名
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofmri4vrhuv8b5pj77mz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fofmri4vrhuv8b5pj77mz.png" alt=" " width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  安装目的地
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmlrznis0siti3fal98u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmlrznis0siti3fal98u.png" alt=" " width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  软件选择
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fppk3mil1oawpmkdn5xvo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fppk3mil1oawpmkdn5xvo.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  开始安装
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmq54c1rfqcmwo3x02xb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmq54c1rfqcmwo3x02xb.png" alt=" " width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>在Ubuntu上安装OpenVPN客户端</title>
      <dc:creator>DD</dc:creator>
      <pubDate>Thu, 17 Jul 2025 08:30:38 +0000</pubDate>
      <link>https://dev.to/kevin_tan/zai-ubuntushang-an-zhuang-openvpnke-hu-duan-316n</link>
      <guid>https://dev.to/kevin_tan/zai-ubuntushang-an-zhuang-openvpnke-hu-duan-316n</guid>
      <description>&lt;p&gt;在 Linux 上配置 OpenVPN 客户端，通过 OpenVPN 连接到公司、服务器局域网。&lt;/p&gt;

&lt;h1&gt;
  
  
  安装 OpenVPN 客户端
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install openvpn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  启动OpenVPN客户端
&lt;/h1&gt;

&lt;p&gt;使用以下命令启动OpenVPN客户端，并指定配置文件：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo openvpn --config /etc/openvpn/client.ovpn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果提示：Enter Private Key Password，输入指定密码即可。&lt;/p&gt;

&lt;h1&gt;
  
  
  测试命令
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping google.com
ping baidu.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ubuntu</category>
      <category>openvpn</category>
      <category>linux</category>
      <category>devops</category>
    </item>
    <item>
      <title>在 CentOS 上安装 OpenVPN 客户端连接配置</title>
      <dc:creator>DD</dc:creator>
      <pubDate>Thu, 17 Jul 2025 08:30:10 +0000</pubDate>
      <link>https://dev.to/kevin_tan/zai-centos-shang-an-zhuang-openvpn-ke-hu-duan-lian-jie-pei-zhi-3e10</link>
      <guid>https://dev.to/kevin_tan/zai-centos-shang-an-zhuang-openvpn-ke-hu-duan-lian-jie-pei-zhi-3e10</guid>
      <description>&lt;p&gt;在 Linux 上配置 OpenVPN 客户端，通过 OpenVPN 连接到公司、服务器局域网。&lt;/p&gt;

&lt;h1&gt;
  
  
  安装 OpenVPN 客户端
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;yum 直接安装
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;epel-release
yum &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;openvpn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;安装完成后会在 &lt;code&gt;/etc/openvpn&lt;/code&gt; 生成对应的文件
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="c"&gt;# cd /etc/openvpn/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;openvpn&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="c"&gt;# ls&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  配置文件
&lt;/h1&gt;

&lt;p&gt;导入 客户端配置（通常是 .ovpn 文件） 和 账号密码 文件&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@localhost openvpn]# tree /etc/openvpn/
/etc/openvpn/
├── client
├── client.ovpn           &lt;span class="c"&gt;# 客户端配置文件&lt;/span&gt;
├── passwd                &lt;span class="c"&gt;# 账号密码文件&lt;/span&gt;
└── server

2 directories, 2 files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  连接测试
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;执行命令
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;openvpn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;--daemon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;--cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/etc/openvpn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;--config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;client.ovpn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;--askpass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;/etc/openvpn/passwd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;\&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nt"&gt;--log-append&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;/var/log/openvpn.log&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;命令参数说明
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--daemon           # 后台运行
--cd               # 配置文件目录路径
--config           # 配置文件名称
--askpass          # 指定账号密码文件
--log-append       # 日志文件
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;测试命令
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;google.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;参考文档&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://juejin.cn/post/6844903647004852237" rel="noopener noreferrer"&gt;Linux OpenVPN 客户端连接配置&lt;/a&gt;&lt;br&gt;
&lt;a href="https://forums.openvpn.net/viewtopic.php?t=27419" rel="noopener noreferrer"&gt;[Solved] Please enter password with the systemd-tty-ask-password-agent tool!&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
