<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[刘小猪--博客]]></title> 
<atom:link href="https://blog.liuxiaozhu.cn/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[]]></description>
<link>https://blog.liuxiaozhu.cn/</link>
<language>zh-cn</language>

<item>
    <title>Linux 系统安装部署 Docker 完全指南</title>
    <link>https://blog.liuxiaozhu.cn/?post=4</link>
    <description><![CDATA[<h1>Linux 系统安装部署 Docker 完全指南</h1>
<p>Docker 是目前最主流的容器化技术，基于 Linux 内核的命名空间与控制组（cgroups）实现轻量级虚拟化，让应用及其依赖打包为镜像，秒级启动、跨环境一致运行。本指南覆盖从安装、配置、运行到安全加固与故障排查的全流程。</p>
<hr />
<h2>一、Docker 核心概念</h2>
<ul>
<li><strong>镜像（Image）</strong>：只读模板，包含运行应用所需的文件系统、依赖与配置。</li>
<li><strong>容器（Container）</strong>：镜像的运行实例，拥有独立网络、进程空间与文件系统视图。</li>
<li><strong>仓库（Registry）</strong>：集中存放和分发镜像，如 Docker Hub、私有 Harbor。</li>
<li><strong>Docker Engine</strong>：运行时核心，包含 <code>dockerd</code> 守护进程与 <code>containerd</code>、<code>runc</code> 容器运行时。</li>
</ul>
<hr />
<h2>二、安装前检查</h2>
<pre><code class="language-bash"># 1. 确认内核版本需 &gt;= 3.10
uname -r

# 2. 确认发行版与架构
cat /etc/os-release
arch

# 3. 卸载旧版本（CentOS/RHEL）
sudo yum remove -y docker docker-client docker-common docker-engine docker-selinux docker-ce containerd.io podman

# 4. 卸载旧版本（Ubuntu/Debian）
sudo apt remove -y docker docker.io containerd runc</code></pre>
<hr />
<h2>三、安装方式</h2>
<h3>3.1 官方一键脚本（推荐新手快速体验）</h3>
<pre><code class="language-bash">curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh</code></pre>
<h3>3.2 通过发行版仓库安装</h3>
<h4>CentOS / RHEL / Rocky / AlmaLinux</h4>
<pre><code class="language-bash"># 安装 yum 工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker Engine 全家桶
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</code></pre>
<h4>Ubuntu / Debian</h4>
<pre><code class="language-bash"># 安装依赖
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/$(lsb_release -is | tr '[:upper:]' '[:lower:]')/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$(lsb_release -is | tr '[:upper:]' '[:lower:]') $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list

# 安装
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</code></pre>
<hr />
<h2>四、启动服务并验证</h2>
<pre><code class="language-bash"># 启动并设置开机自启
sudo systemctl enable --now docker

# 检查状态
sudo systemctl status docker

# 查看版本信息
docker version

# 运行测试容器
docker run --rm hello-world</code></pre>
<p>输出 <code>Hello from Docker!</code> 即表示安装与网络正常。</p>
<hr />
<h2>五、配置镜像加速与守护进程</h2>
<p>国内访问 Docker Hub 较慢，建议配置镜像加速。</p>
<pre><code class="language-bash">sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json &lt;&lt;'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1panel.live"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "live-restore": true
}
EOF

# 重启生效
sudo systemctl daemon-reload
sudo systemctl restart docker</code></pre>
<blockquote>
<p><code>live-restore: true</code> 允许守护进程重启时容器继续运行，生产环境强烈建议开启。</p>
</blockquote>
<hr />
<h2>六、免 sudo 运行 Docker</h2>
<pre><code class="language-bash"># 将当前用户加入 docker 组
sudo usermod -aG docker $USER

# 重新登录会话生效
newgrp docker

# 验证
docker ps</code></pre>
<blockquote>
<p>安全提示：加入 docker 组等价于获得 root 权限，共享主机需谨慎。</p>
</blockquote>
<hr />
<h2>七、常用命令速查</h2>
<pre><code class="language-bash"># 拉取与镜像
docker pull nginx:latest
docker images
docker rmi nginx:latest

# 容器生命周期
docker run -d --name web -p 80:80 nginx
docker ps          # 查看运行中的容器
docker ps -a       # 查看所有容器
docker stop web
docker rm web

# 进入容器
docker exec -it web /bin/sh

# 查看日志
docker logs -f --tail=100 web

# 复制文件
docker cp web:/var/log/nginx/error.log ./error.log
docker cp ./index.html web:/usr/share/nginx/html/index.html

# 清理未使用的资源
docker system prune -a</code></pre>
<hr />
<h2>八、数据卷与持久化</h2>
<p>容器文件系统是临时的，删除即丢失。使用数据卷（volume）持久化数据。</p>
<pre><code class="language-bash"># 创建命名卷
docker volume create nginx-data

# 运行容器并挂载卷
docker run -d --name web -p 80:80 -v nginx-data:/usr/share/nginx/html nginx

# 绑定挂载宿主机目录（适合开发）
docker run -d --name dev -p 8080:80 -v $(pwd)/html:/usr/share/nginx/html nginx

# 查看与管理卷
docker volume ls
docker volume inspect nginx-data
docker volume rm nginx-data</code></pre>
<hr />
<h2>九、网络模型</h2>
<p>Docker 默认桥接网络实现容器互联。</p>
<pre><code class="language-bash"># 查看内置网络
docker network ls

# 创建自定义网络
docker network create --driver bridge mynet

# 容器加入网络后可通过容器名互访
docker run -d --name app --network mynet nginx:alpine
docker exec -it app ping web</code></pre>
<p>驱动类型：</p>
<ul>
<li><code>bridge</code>：单机默认，隔离性好。</li>
<li><code>host</code>：使用宿主机网络栈，性能高但无隔离。</li>
<li><code>overlay</code>：Swarm 多主机互联。</li>
<li><code>macvlan</code>：容器直接获得二层物理网 IP。</li>
</ul>
<hr />
<h2>十、Dockerfile 构建自定义镜像</h2>
<p>以构建一个静态站点为例：</p>
<pre><code class="language-bash">mkdir mysite &amp;&amp; cd mysite</code></pre>
<p>创建 <code>index.html</code>：</p>
<pre><code class="language-html">&lt;h1&gt;Hello Docker&lt;/h1&gt;</code></pre>
<p>创建 <code>Dockerfile</code>：</p>
<pre><code class="language-dockerfile">FROM nginx:alpine
LABEL maintainer="you@example.com"
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]</code></pre>
<p>构建与运行：</p>
<pre><code class="language-bash">docker build -t mysite:1.0 .
docker run -d -p 8000:80 mysite:1.0</code></pre>
<p><strong>多阶段构建</strong>（减小体积）：</p>
<pre><code class="language-dockerfile"># 编译阶段
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .

# 运行阶段
FROM alpine:3.19
WORKDIR /root/
COPY --from=builder /app/myapp .
ENTRYPOINT ["./myapp"]</code></pre>
<hr />
<h2>十一、Docker Compose 多容器编排</h2>
<p>现代版本集成在 <code>docker compose</code> 命令中，无需单独安装 <code>docker-compose</code>。</p>
<pre><code class="language-bash"># 验证
docker compose version</code></pre>
<p>示例 <code>compose.yml</code> 部署 Web + 数据库：</p>
<pre><code class="language-yaml">services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db
    networks:
      - backend

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: myapp
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - backend

networks:
  backend:
    driver: bridge

volumes:
  pgdata:</code></pre>
<p>常用命令：</p>
<pre><code class="language-bash">docker compose up -d        # 后台启动
docker compose ps
docker compose logs -f web
docker compose exec db psql -U app
docker compose down -v      # 停止并删除数据卷</code></pre>
<hr />
<h2>十二、资源限制与性能</h2>
<pre><code class="language-bash"># 限制内存 512MB、CPU 1 核
docker run -d --name cgroup --memory=512m --memory-swap=512m --cpus=1 nginx

# 限制进程数
docker run --ulimit nproc=100:200 --ulimit nofile=1024:2048 nginx

# 查看实时资源
docker stats</code></pre>
<hr />
<h2>十三、安全加固建议</h2>
<ul>
<li><strong>最小镜像原则</strong>：优先使用 <code>alpine</code>、<code>distroless</code>、<code>slim</code> 变体。</li>
<li><strong>非 root 用户运行容器</strong>：
<pre><code class="language-dockerfile">FROM node:20-alpine
RUN addgroup -S app &amp;&amp; adduser -S app -G app
USER app</code></pre></li>
<li><strong>不挂载危险路径</strong>：避免 <code>-v /var/run/docker.sock:/var/run/docker.sock</code>、<code>/</code>、<code>/proc</code> 等。</li>
<li><strong>只读根文件系统</strong>：<code>docker run --read-only --tmpfs /tmp nginx</code>。</li>
<li><strong>镜像扫描</strong>：集成 <code>trivy</code> 等扫描工具。</li>
<li><strong>使用 rootless 模式</strong>：让 <code>dockerd</code> 以非特权用户运行，降低内核攻击面。</li>
<li><strong>网络隔离</strong>：仅暴露必要端口，敏感服务使用内部网络，不映射宿主机端口。</li>
</ul>
<hr />
<h2>十四、故障排查</h2>
<h3>1. 服务无法启动，日志查看位置</h3>
<pre><code class="language-bash">journalctl -u docker.service --since "10 min ago"</code></pre>
<h3>2. overlay2 挂载失败</h3>
<p>确认内核模块加载：</p>
<pre><code class="language-bash">lsmod | grep overlay
modprobe overlay</code></pre>
<h3>3. 端口未放行</h3>
<pre><code class="language-bash">sudo firewall-cmd --permanent --add-port=80/tcp &amp;&amp; sudo firewall-cmd --reload
# 或
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT</code></pre>
<h3>4. 容器访问外网失败</h3>
<p>检查 <code>dockerd</code> 是否开启 IPv4 转发：</p>
<pre><code class="language-bash">sysctl net.ipv4.ip_forward</code></pre>
<h3>5. 存储目录权限或空间不足</h3>
<pre><code class="language-bash">docker system df
sudo du -sh /var/lib/docker</code></pre>
<p>迁移数据目录：</p>
<pre><code class="language-bash"># 编辑 /etc/docker/daemon.json
{
  "data-root": "/data/docker"
}
# 重启并迁移旧数据</code></pre>
<hr />
<h2>十五、卸载 Docker</h2>
<pre><code class="language-bash"># 停止服务
sudo systemctl stop docker
sudo systemctl disable docker

# 卸载包（Ubuntu/Debian）
sudo apt purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 清理数据与配置
sudo rm -rf /var/lib/docker /var/lib/containerd /etc/docker
sudo apt autoremove</code></pre>
<hr />
<h2>十六、总结</h2>
<p>Docker 让应用打包、部署与扩容变得简单一致。生产部署建议：</p>
<ol>
<li>使用官方仓库安装并保持版本可控；</li>
<li>配置镜像加速与日志轮转；</li>
<li>优先使用 <code>Dockerfile</code> + <code>compose.yml</code> 固化环境；</li>
<li>重视安全，采用最小权限与镜像扫描；</li>
<li>配合 <code>healthcheck</code>、重启策略与资源限制提升稳定性。</li>
</ol>
<p>进一步可学习 <code>docker context</code>、<code>Docker Swarm</code>、Kubernetes、Podman 与 BuildKit 等进阶主题。</p>
<blockquote>
<p>参考：<a href="https://docs.docker.com/">Docker 官方文档</a></p>
</blockquote>]]></description>
    <pubDate>Tue, 29 Sep 2026 11:35:11 +0800</pubDate>
    <dc:creator>刘小猪</dc:creator>
    <guid>https://blog.liuxiaozhu.cn/?post=4</guid>
</item>
<item>
    <title>Linux 系统安装部署 Nginx 完全指南</title>
    <link>https://blog.liuxiaozhu.cn/?post=3</link>
    <description><![CDATA[<h1>Linux 系统安装部署 Nginx 完全指南</h1>
<p>Nginx（发音同 engine x）是一款高性能的 HTTP 和反向代理服务，同时也支持 IMAP/POP3/SMTP 协议。它以<strong>轻量、高并发、低内存</strong>著称，被广泛应用于 Web 服务器、负载均衡、静态资源服务、SSL 终结等场景。本指南将以实操方式带你从零完成 Nginx 的安装、配置、启动、优化与排错。</p>
<hr />
<h2>一、Nginx 核心特性概览</h2>
<ul>
<li><strong>事件驱动架构</strong>：基于 epoll/kqueue 的高并发模型，单机可承载数万连接。</li>
<li><strong>模块化设计</strong>：HTTP、Stream、Mail 模块灵活组合。</li>
<li><strong>反向代理与负载均衡</strong>：内置 round-robin、ip_hash、least_conn、weighted 等策略。</li>
<li><strong>高可用</strong>：支持 Master-Worker 多进程模型，热加载配置不中断服务。</li>
<li><strong>丰富的生态</strong>：OpenResty、Nginx Unit、Tengine 等衍生方案。</li>
</ul>
<hr />
<h2>二、安装方式选择</h2>
<p>Linux 上安装 Nginx 主要有三种方式：</p>
<table>
<thead>
<tr>
<th>方式</th>
<th>适用场景</th>
<th>优点</th>
<th>缺点</th>
</tr>
</thead>
<tbody>
<tr>
<td>发行版官方仓库</td>
<td>生产环境首选</td>
<td>稳定、易维护</td>
<td>版本偏旧</td>
</tr>
<tr>
<td>Nginx 官方仓库</td>
<td>需要较新版本</td>
<td>版本新、文档全</td>
<td>需额外配置源</td>
</tr>
<tr>
<td>源码编译</td>
<td>需要自定义模块/最小化</td>
<td>灵活可控</td>
<td>维护成本高</td>
</tr>
</tbody>
</table>
<hr />
<h2>三、基于发行版仓库安装</h2>
<h3>3.1 CentOS / RHEL / Rocky / AlmaLinux</h3>
<pre><code class="language-bash"># 安装 EPEL 源（Nginx 在 EPEL 中）
sudo yum install -y epel-release
sudo yum install -y nginx

# 启动并设置开机自启
sudo systemctl enable --now nginx

# 检查状态
sudo systemctl status nginx</code></pre>
<h3>3.2 Ubuntu / Debian</h3>
<pre><code class="language-bash">sudo apt update
sudo apt install -y nginx

sudo systemctl enable --now nginx
sudo systemctl status nginx</code></pre>
<blockquote>
<p>验证安装：浏览器访问 <code>http://服务器IP</code>，看到 Nginx 欢迎页即成功。</p>
</blockquote>
<hr />
<h2>四、基于 Nginx 官方仓库安装（较新版本）</h2>
<h3>CentOS/RHEL</h3>
<pre><code class="language-bash">sudo tee /etc/yum.repos.d/nginx.repo &lt;&lt;'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF

sudo yum install -y nginx</code></pre>
<h3>Ubuntu/Debian</h3>
<pre><code class="language-bash"># 添加 GPG 密钥
sudo curl -fsSL https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg &gt;/dev/null

# 添加源（以 Ubuntu 22.04 为例）
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu jammy nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

sudo apt update
sudo apt install -y nginx</code></pre>
<hr />
<h2>五、源码编译安装（进阶）</h2>
<pre><code class="language-bash"># 安装依赖
sudo yum install -y gcc pcre-devel zlib-devel openssl-devel   # CentOS
# sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev  # Ubuntu

# 下载源码
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

# 配置编译选项
./configure --prefix=/etc/nginx \
            --sbin-path=/usr/sbin/nginx \
            --conf-path=/etc/nginx/nginx.conf \
            --pid-path=/var/run/nginx.pid \
            --error-log-path=/var/log/nginx/error.log \
            --http-log-path=/var/log/nginx/access.log \
            --with-http_ssl_module \
            --with-http_v2_module \
            --with-http_gzip_static_module \
            --with-http_stub_status_module

make &amp;&amp; sudo make install

# 创建 systemd 服务
sudo tee /etc/systemd/system/nginx.service &lt;&lt;'EOF'
[Unit]
Description=nginx - high performance web server
After=network.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $(cat /var/run/nginx.pid)
ExecStop=/bin/kill -s TERM $(cat /var/run/nginx.pid)

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now nginx</code></pre>
<hr />
<h2>六、目录结构与配置文件解析</h2>
<pre><code class="language-text">/etc/nginx/
├── nginx.conf            # 主配置
├── mime.types            # MIME 类型映射
├── conf.d/               # 站点配置目录
├── sites-available/      # 站点配置（Debian 系）
├── sites-enabled/        # 启用的站点软链接
└── ssl/                  # SSL 证书目录（自建）

/var/log/nginx/           # 日志目录
├── access.log            # 访问日志
└── error.log             # 错误日志

/usr/share/nginx/html/    # 默认 Web 根目录</code></pre>
<h3>主配置 nginx.conf 示例</h3>
<pre><code class="language-nginx">user  nginx;
worker_processes  auto;            # 根据 CPU 核心自动设置
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  10240;     # 单 worker 最大并发
    use epoll;
    multi_accept  on;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;
    tcp_nopush    on;
    tcp_nodelay   on;
    keepalive_timeout  65;
    server_tokens  off;            # 隐藏版本号

    # 日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log main;

    # gzip 压缩
    gzip  on;
    gzip_min_length 1k;
    gzip_comp_level 5;
    gzip_types text/plain text/css application/json application/javascript text/xml;

    include /etc/nginx/conf.d/*.conf;
}</code></pre>
<hr />
<h2>七、配置一个站点（反向代理 + SSL）</h2>
<pre><code class="language-nginx"># /etc/nginx/conf.d/example.conf
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate     /etc/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/ssl/example.com/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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 5s;
        proxy_read_timeout   30s;
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
        root /var/www/static;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # 状态页（仅内网访问）
    location /nginx_status {
        stub_status;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}</code></pre>
<h3>负载均衡示例</h3>
<pre><code class="language-nginx">upstream backend {
    least_conn;                     # 最少连接策略
    server 10.0.0.11:8080 weight=3;
    server 10.0.0.12:8080;
    server 10.0.0.13:8080 backup;
    keepalive 32;
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}</code></pre>
<hr />
<h2>八、常用运维命令</h2>
<pre><code class="language-bash"># 语法检查（强烈推荐每次修改后执行）
sudo nginx -t

# 重新加载配置（热加载，不中断服务）
sudo nginx -s reload
# 或：sudo systemctl reload nginx

# 平滑关闭
sudo nginx -s quit

# 立即关闭
sudo nginx -s stop

# 查看版本与编译参数
nginx -V

# 实时分析访问日志
sudo tail -f /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20</code></pre>
<hr />
<h2>九、性能优化关键参数</h2>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
<th>推荐值</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>worker_processes</code></td>
<td>工作进程数</td>
<td><code>auto</code></td>
</tr>
<tr>
<td><code>worker_connections</code></td>
<td>单 worker 连接数</td>
<td>10240+</td>
</tr>
<tr>
<td><code>sendfile on;</code></td>
<td>零拷贝发送文件</td>
<td><code>on</code></td>
</tr>
<tr>
<td><code>tcp_nopush on;</code></td>
<td>等待数据包满再发送</td>
<td><code>on</code></td>
</tr>
<tr>
<td><code>keepalive_timeout</code></td>
<td>长连接超时</td>
<td>65</td>
</tr>
<tr>
<td><code>open_file_cache</code></td>
<td>文件描述符缓存</td>
<td><code>max=10000 inactive=20s;</code></td>
</tr>
<tr>
<td><code>client_max_body_size</code></td>
<td>上传最大体</td>
<td>视业务</td>
</tr>
<tr>
<td><code>gzip</code></td>
<td>压缩</td>
<td><code>on</code>, level 4-6</td>
</tr>
</tbody>
</table>
<p>系统层面配合优化：</p>
<pre><code class="language-bash"># 文件描述符上限
ulimit -n 65535
echo "* soft nofile 65535" &gt;&gt; /etc/security/limits.conf

# TCP 参数
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.ip_local_port_range="1024 65535"</code></pre>
<hr />
<h2>十、常见问题排错</h2>
<h3>1. <code>nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)</code></h3>
<p>说明 80 端口被占用：</p>
<pre><code class="language-bash">sudo lsof -i :80
sudo systemctl stop httpd   # 若 Apache 冲突</code></pre>
<h3>2. SELinux 拦截导致 502</h3>
<pre><code class="language-bash">sudo getenforce
sudo setsebool -P httpd_can_network_connect 1
# 或为特定端口
sudo semanage port -a -t http_port_t -p tcp 8080</code></pre>
<h3>3. <code>Permission denied</code> 写日志/文件</h3>
<p>确保 nginx 用户对 <code>/var/log/nginx</code> 与 Web 根目录有读写权限：</p>
<pre><code class="language-bash">sudo chown -R nginx:nginx /var/www
sudo chmod 755 /var/www</code></pre>
<h3>4. 防火墙未放行</h3>
<pre><code class="language-bash"># CentOS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

# Ubuntu
sudo ufw allow 'Nginx Full'</code></pre>
<h3>5. 413 Request Entity Too Large</h3>
<p>上传文件过大：</p>
<pre><code class="language-nginx">client_max_body_size 100m;</code></pre>
<hr />
<h2>十一、安全加固建议</h2>
<ul>
<li>关闭版本号：<code>server_tokens off;</code></li>
<li>限制请求方法：
<pre><code class="language-nginx">if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; }</code></pre></li>
<li>防止目录穿越：避免使用 <code>root</code> 配合用户输入。</li>
<li>启用 HSTS：<code>add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;</code></li>
<li>隐藏敏感路径：
<pre><code class="language-nginx">location ~ /\.\(git|svn|env) { deny all; }</code></pre></li>
<li>限制并发与速率：
<pre><code class="language-nginx">limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
location / { limit_req zone=one burst=20 nodelay; limit_conn addr 10; }</code></pre></li>
</ul>
<hr />
<h2>十二、总结</h2>
<p>至此，你已经掌握了在主流 Linux 发行版上安装、配置、优化与排错 Nginx 的完整流程。建议在生产环境使用前：</p>
<ol>
<li>始终运行 <code>nginx -t</code> 检查配置；</li>
<li>使用 Let's Encrypt 或商业 CA 部署 HTTPS；</li>
<li>监控 access/error 日志与 <code>/nginx_status</code>；</li>
<li>定期备份 <code>/etc/nginx/</code> 目录。</li>
</ol>
<p>后续可进一步探索 OpenResty（Lua 扩展）、Nginx Unit、Tengine、Ingress-Nginx（Kubernetes）等生态，构建更复杂的流量治理体系。</p>
<blockquote>
<p>参考资料：<a href="https://nginx.org/en/docs/">Nginx 官方文档</a>、各发行版官方仓库。</p>
</blockquote>]]></description>
    <pubDate>Tue, 29 Sep 2026 11:32:39 +0800</pubDate>
    <dc:creator>刘小猪</dc:creator>
    <guid>https://blog.liuxiaozhu.cn/?post=3</guid>
</item>
<item>
    <title>Linux 系统安装部署 MariaDB 数据库教程</title>
    <link>https://blog.liuxiaozhu.cn/?post=2</link>
    <description><![CDATA[<p>MariaDB 是 MySQL 的一个高性能、开源的分支，它以兼容 MySQL 著称，同时提供了更高的稳定性和功能扩展性。在 Linux 服务器环境中部署 MariaDB 是许多 Web 开发人员和运维人员的基础技能。本文将手把手教你在主流的 Linux 发行版（如 Ubuntu/Debian 和 CentOS/RHEL）上安装、初始化配置 MariaDB，并创建数据库和用户。</p>
<h2>一、环境准备</h2>
<p>本教程以 Ubuntu Server 20.04/22.04 和 CentOS 8/Stream 9 为例。操作前请确保你拥有 root 权限或 sudo 权限。</p>
<h2>二、安装 MariaDB</h2>
<h3>1. Ubuntu/Debian 系统</h3>
<p>Ubuntu 源中通常已包含 MariaDB，可直接通过 APT 包管理器安装。</p>
<pre><code>sudo apt update
sudo apt install mariadb-server mariadb-client</code></pre>
<h3>2. CentOS/RHEL 系统</h3>
<p>CentOS 可以使用 YUM/DNF 包管理器安装。较新的 RHEL 9/CentOS Stream 9 默认源已提供 MariaDB。</p>
<pre><code>sudo dnf update
sudo dnf install mariadb-server mariadb-client</code></pre>
<h2>三、启动并设置开机自启</h2>
<p>大多数现代 Linux 发行版安装完成后会自动启动 MariaDB 服务，但我们可以手动确认并设置开机自启。</p>
<pre><code># 启动服务
sudo systemctl start mariadb

# 设置开机自启
sudo systemctl enable mariadb

# 查看服务状态
sudo systemctl status mariadb</code></pre>
<h2>四、安全初始化配置</h2>
<p>MariaDB 提供了一个交互式的安全脚本，用于设置 root 密码、移除匿名用户、禁用远程 root 登录等，强烈建议执行。</p>
<pre><code>sudo mysql_secure_installation</code></pre>
<p>脚本会依次询问几个问题：</p>
<ul>
<li><strong>Set root password?</strong> 设置 root 密码。选择 Y，然后输入新密码。</li>
<li><strong>Remove anonymous users?</strong> 移除匿名用户。选择 Y。</li>
<li><strong>Disallow root login remotely?</strong> 禁止 root 远程登录。选择 Y。</li>
<li><strong>Remove test database?</strong> 移除测试数据库。选择 Y。</li>
<li><strong>Reload privilege tables now?</strong> 重新加载权限表。选择 Y。</li>
</ul>
<h2>五、连接数据库</h2>
<p>使用 mysql 客户端连接 MariaDB。如果是系统本地的 root 用户，通常可以使用 socket 认证直接登录；如果是远程用户或密码认证，则需提供密码。</p>
<pre><code># 本地 root 登录
sudo mysql -u root

# 或使用密码登录
mysql -u root -p</code></pre>
<h2>六、创建数据库和用户</h2>
<p>登录后，我们可以创建一个新的数据库和一个权限受限的应用用户。</p>
<pre><code># 创建数据库
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 创建用户，并限制其只能从 localhost 或特定 IP 访问
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'your_password';
CREATE USER 'myuser'@'192.168.1.%' IDENTIFIED BY 'your_password';

# 授予用户对该数据库的特定权限（如全部权限，生产环境建议最小化）
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'192.168.1.%';

# 刷新权限
FLUSH PRIVILEGES;</code></pre>
<h2>七、验证配置</h2>
<p>退出 root 会话，使用新创建的用户连接数据库，验证是否成功。</p>
<pre><code>mysql -u myuser -p mydb</code></pre>
<h2>八、可选：配置防火墙</h2>
<p>如果你需要远程访问 MariaDB（默认端口 3306），请确保防火墙开放该端口。但请注意，生产环境中开放数据库端口存在安全风险，建议通过 VPN 或堡垒机访问，或仅对可信 IP 开放。</p>
<pre><code># 使用 ufw 为例（Ubuntu）
sudo ufw allow 3306/tcp
sudo ufw reload

# 使用 firewalld 为例（CentOS）
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload</code></pre>
<h2>九、总结</h2>
<p>通过以上步骤，你已成功在 Linux 服务器上安装并部署了 MariaDB，完成了基本的安全加固和用户管理。接下来，你就可以在你的 Web 应用（如 PHP、Python、Java）中连接并使用这个数据库了。建议定期更新 MariaDB 包，并监控服务状态，以确保数据库的安全与稳定运行。</p>]]></description>
    <pubDate>Tue, 29 Sep 2026 00:17:16 +0800</pubDate>
    <dc:creator>刘小猪</dc:creator>
    <guid>https://blog.liuxiaozhu.cn/?post=2</guid>
</item>
</channel>
</rss>