25-deepin-linux-wsl-nginx-installation
<h1 id="windows11-wsl-nginx">windows11 #wsl #nginx</h1><h1 id="在-deepin-linux-和-wsl-环境中安装配置-nginx-静态资源服务器">在 Deepin Linux 和 WSL 环境中安装配置 Nginx 静态资源服务器</h1>
<h2 id="概述">概述</h2>
<p>本文详细介绍了在 Deepin Linux 和 WSL (Windows Subsystem for Linux) 环境中安装 Nginx 并配置静态资源服务器的完整过程,包括常见问题的排查和解决方案。</p>
<h2 id="一在-deepin-linux-上安装-nginx">一、在 Deepin Linux 上安装 Nginx</h2>
<h3 id="11-更新系统包列表">1.1 更新系统包列表</h3>
<pre><code class="language-bash">sudo apt update
</code></pre>
<h3 id="12-安装-nginx">1.2 安装 Nginx</h3>
<pre><code class="language-bash">sudo apt install nginx -y
</code></pre>
<h3 id="13-验证安装">1.3 验证安装</h3>
<pre><code class="language-bash">nginx -v
</code></pre>
<h2 id="二配置-nginx-静态资源服务">二、配置 Nginx 静态资源服务</h2>
<h3 id="21-创建静态资源目录">2.1 创建静态资源目录</h3>
<pre><code class="language-bash">sudo mkdir -p /home/swg/static
sudo chmod 755 /home/swg/static
sudo chown -R www-data:www-data /home/swg/static
</code></pre>
<h3 id="22-创建-nginx-配置文件">2.2 创建 Nginx 配置文件</h3>
<pre><code class="language-bash">sudo nano /etc/nginx/sites-available/static_server
</code></pre>
<p>配置文件内容:</p>
<pre><code class="language-nginx">server {
listen 10001;
server_name _;
root /home/swg/static;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 7d;
add_header Cache-Control "public, max-age=604800";
}
location ~ /\. {
deny all;
}
}
</code></pre>
<h3 id="23-启用站点配置">2.3 启用站点配置</h3>
<pre><code class="language-bash">sudo ln -s /etc/nginx/sites-available/static_server /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
</code></pre>
<h3 id="24-测试并启动-nginx">2.4 测试并启动 Nginx</h3>
<pre><code class="language-bash">sudo nginx -t
sudo systemctl start nginx
sudo systemctl enable nginx
</code></pre>
<h2 id="三wsl-环境中的特殊配置">三、WSL 环境中的特殊配置</h2>
<h3 id="31-检查-wsl-网络配置">3.1 检查 WSL 网络配置</h3>
<pre><code class="language-bash">ip addr show eth0
hostname -I
</code></pre>
<h3 id="32-windows-端口转发">3.2 Windows 端口转发</h3>
<p>在 Windows PowerShell(以管理员身份运行)中:</p>
<pre><code class="language-powershell">netsh interface portproxy add v4tov4 listenport=10001 listenaddress=0.0.0.0 connectport=10001 connectaddress=$(wsl hostname -I)
</code></pre>
<h3 id="33-windows-防火墙配置">3.3 Windows 防火墙配置</h3>
<pre><code class="language-powershell">New-NetFirewallRule -DisplayName "WSL Nginx Port 10001" -Direction Inbound -LocalPort 10001 -Protocol TCP -Action Allow
</code></pre>
<h2 id="四常见问题排查">四、常见问题排查</h2>
<h3 id="41-端口未监听问题">4.1 端口未监听问题</h3>
<p>检查端口监听状态:</p>
<pre><code class="language-bash">sudo netstat -tulpn | grep :10001
</code></pre>
<p>如果端口未监听,可能的原因和解决方案:</p>
<ol>
<li>
<p><strong>Nginx 服务未启动</strong></p>
<pre><code class="language-bash">sudo systemctl status nginx
sudo systemctl start nginx
</code></pre>
</li>
<li>
<p><strong>配置文件错误</strong></p>
<pre><code class="language-bash">sudo nginx -t
</code></pre>
</li>
<li>
<p><strong>权限问题</strong></p>
<pre><code class="language-bash">sudo chown -R www-data:www-data /home/swg/static
</code></pre>
</li>
</ol>
<h3 id="44-nginx-权限拒绝问题详解">4.4 Nginx 权限拒绝问题详解</h3>
<p>当遇到以下错误时:</p>
<pre><code>2025/10/19 16:51:07 4153#4153: *1 open() "/home/swg/static/index.html" failed (13: Permission denied), client: 127.0.0.1, server: _, request: "GET /index.html HTTP/1.1", host: "localhost:10001"
</code></pre>
<h4 id="问题分析">问题分析</h4>
<p>这是典型的 Nginx 权限问题,错误代码 13 表示 Permission Denied。可能的原因包括:</p>
<ol>
<li>文件或目录权限不正确</li>
<li>目录所有权问题</li>
<li>SELinux 或 AppArmor 限制</li>
<li>Nginx 运行用户无访问权限</li>
</ol>
<h4 id="诊断步骤">诊断步骤</h4>
<ol>
<li>
<p><strong>检查当前权限和所有权</strong></p>
<pre><code class="language-bash"># 检查目录和文件权限
ls -la /home/swg/static/
# 检查 Nginx 运行用户
ps aux | grep nginx
</code></pre>
</li>
<li>
<p><strong>检查目录路径权限</strong></p>
<pre><code class="language-bash"># 检查整个路径的权限
namei -om /home/swg/static/index.html
</code></pre>
</li>
</ol>
<h4 id="解决方案">解决方案</h4>
<ol>
<li>
<p><strong>修复文件/目录权限</strong></p>
<pre><code class="language-bash"># 确保目录有正确的执行权限
sudo chmod 755 /home/swg
sudo chmod 755 /home/swg/static
# 确保文件有正确的读取权限
sudo chmod 644 /home/swg/static/*.html
sudo chmod 644 /home/swg/static/*.ico
</code></pre>
</li>
<li>
<p><strong>修复目录所有权</strong></p>
<pre><code class="language-bash"># 将目录所有权改为 Nginx 运行用户
sudo chown -R www-data:www-data /home/swg/static
# 或者如果 Nginx 以 nginx 用户运行
sudo chown -R nginx:nginx /home/swg/static
</code></pre>
</li>
<li>
<p><strong>SELinux 问题处理(如果启用)</strong></p>
<pre><code class="language-bash"># 检查 SELinux 状态
sestatus
# 如果启用,设置正确的 SELinux 上下文
sudo setsebool -P httpd_can_network_connect 1
sudo semanage fcontext -a -t httpd_sys_content_t "/home/swg/static(/.*)?"
sudo restorecon -R /home/swg/static
</code></pre>
</li>
<li>
<p><strong>AppArmor 问题处理(如果启用)</strong></p>
<pre><code class="language-bash"># 检查 AppArmor 状态
sudo apparmor_status
# 如果 Nginx 配置文件受限,可以禁用或修改配置
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
</code></pre>
</li>
<li>
<p><strong>Nginx 用户组权限</strong></p>
<pre><code class="language-bash"># 将 Nginx 用户添加到目录所有者组
sudo usermod -a -G swg www-data
# 或者
sudo usermod -a -G swg nginx
</code></pre>
</li>
</ol>
<h4 id="预防措施">预防措施</h4>
<ol>
<li>
<p><strong>创建目录时设置正确权限</strong></p>
<pre><code class="language-bash">sudo mkdir -p /home/swg/static
sudo chmod 755 /home/swg/static
sudo chown -R www-data:www-data /home/swg/static
</code></pre>
</li>
<li>
<p><strong>使用 ACL(访问控制列表)进行精细权限控制</strong></p>
<pre><code class="language-bash"># 为 Nginx 用户添加特定权限
sudo setfacl -R -m u:www-data:rwx /home/swg/static
sudo setfacl -R -m d:u:www-data:rwx /home/swg/static
</code></pre>
</li>
<li>
<p><strong>定期检查权限设置</strong></p>
<pre><code class="language-bash"># 创建脚本定期检查权限
echo '#!/bin/bash
find /home/swg/static -type f ! -perm 644 -exec chmod 644 {} \;
find /home/swg/static -type d ! -perm 755 -exec chmod 755 {} \;' > /usr/local/bin/check-nginx-permissions
chmod +x /usr/local/bin/check-nginx-permissions
</code></pre>
</li>
</ol>
<h4 id="故障排查流程图">故障排查流程图</h4>
<div class="mermaid">flowchart TD
A --> B{检查文件权限}
B -->|权限不足| C[修复文件/目录权限]
B -->|权限正常| D{检查 SELinux/AppArmor}
D -->|安全模块启用| E[设置安全上下文]
D -->|安全模块禁用| F{检查 Nginx 运行用户}
F -->|用户无访问权| G[修改用户组或所有权]
F -->|用户有访问权| H{检查目录路径权限}
H -->|路径权限问题| I[修复路径权限]
H -->|路径权限正常| J[考虑移动文件位置]
</div><h3 id="42-wsl-环境中的继承套接字问题">4.2 WSL 环境中的继承套接字问题</h3>
<p>错误日志显示:<code>using inherited sockets from "5;6;"</code></p>
<p>解决方案:</p>
<pre><code class="language-bash"># 完全停止 Nginx
sudo systemctl stop nginx
sudo service nginx stop
sudo pkill -9 nginx
# 清理 PID 和套接字文件
sudo rm -f /var/run/nginx.pid
sudo rm -f /var/run/nginx/*.pid
sudo rm -f /var/run/nginx/*.sock
# 重新启动
sudo nginx
</code></pre>
<h3 id="43-wsl-中-systemctl-不可用">4.3 WSL 中 systemctl 不可用</h3>
<p>在 WSL 环境中,systemctl 可能不可用,可以使用 service 命令:</p>
<pre><code class="language-bash">sudo service nginx status
sudo service nginx start
sudo service nginx restart
sudo service nginx stop
</code></pre>
<p>或者直接运行 nginx:</p>
<pre><code class="language-bash">sudo nginx
</code></pre>
<h2 id="五测试验证">五、测试验证</h2>
<h3 id="51-在-wsl-内部测试">5.1 在 WSL 内部测试</h3>
<pre><code class="language-bash">curl http://localhost:10001
</code></pre>
<h3 id="52-创建测试文件">5.2 创建测试文件</h3>
<pre><code class="language-bash">echo "<html><body><h1>测试页面</h1><p>Nginx 静态资源服务器工作正常!</p></body></html>" | sudo tee /home/swg/static/index.html
</code></pre>
<h3 id="53-从-windows-访问">5.3 从 Windows 访问</h3>
<p>在 Windows 浏览器中访问:</p>
<ul>
<li><code>http://localhost:10001</code></li>
<li><code>http://127.0.0.1:10001</code></li>
</ul>
<h2 id="六高级配置">六、高级配置</h2>
<h3 id="61-wsl2-网络模式优化">6.1 WSL2 网络模式优化</h3>
<p>在 Windows 用户目录下创建 <code>.wslconfig</code> 文件:</p>
<pre><code class="language-ini">
networkingMode=mirrored
dnsTunneling=true
firewall=false
autoProxy=true
</code></pre>
<p>然后重启 WSL:</p>
<pre><code class="language-powershell">wsl --shutdown
wsl
</code></pre>
<h3 id="62-nginx-性能优化">6.2 Nginx 性能优化</h3>
<p>在 Nginx 配置中添加性能优化参数:</p>
<pre><code class="language-nginx">server {
listen 10001;
server_name _;
root /home/swg/static;
index index.html index.htm;
# 启用 gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
# 缓存设置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
}
# 其他配置...
}
</code></pre>
<h2 id="七服务管理">七、服务管理</h2>
<h3 id="71-常用-nginx-命令">7.1 常用 Nginx 命令</h3>
<pre><code class="language-bash"># 启动 Nginx
sudo systemctl start nginx
# 停止 Nginx
sudo systemctl stop nginx
# 重启 Nginx
sudo systemctl restart nginx
# 重新加载配置
sudo systemctl reload nginx
# 检查状态
sudo systemctl status nginx
# 查看日志
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log
</code></pre>
<h3 id="72-防火墙配置">7.2 防火墙配置</h3>
<pre><code class="language-bash"># 允许端口通过防火墙
sudo ufw allow 10001/tcp
# 检查防火墙状态
sudo ufw status
</code></pre>
<h2 id="总结">总结</h2>
<p>在 Deepin Linux 和 WSL 环境中配置 Nginx 静态资源服务器需要注意以下几点:</p>
<ol>
<li><strong>正确安装和配置 Nginx</strong>:确保配置文件语法正确,站点已启用</li>
<li><strong>WSL 网络特殊性</strong>:可能需要额外的端口转发和防火墙配置</li>
<li><strong>进程管理</strong>:WSL 中可能需要使用不同的命令管理 Nginx 进程</li>
<li><strong>权限设置</strong>:确保 Nginx 可以访问静态资源目录</li>
<li><strong>故障排查</strong>:学会使用日志和命令行工具诊断问题</li>
</ol>
<p>按照本文的步骤,您应该能够成功在 Deepin Linux 或 WSL 环境中搭建一个功能完整的 Nginx 静态资源服务器,通过端口 10001 提供 <code>/home/swg/static</code> 目录的静态文件服务。</p><br><br>
来源:https://www.cnblogs.com/suveng/p/19151078
頁:
[1]