1. Nginx 简介Nginx 是一个高性能、轻量级的 HTTP 服务器和反向代理服务器，常用于静态文件服务、负载均衡、反向代理、SSL/TLS 加密等场景。它支持高并发，具有模块化设计和灵活的配置。2. 通过 Docker-Compose 启动 Nginxversion: '3.8' services: nginx: image: nginx:latest container_name: nginx restart: always ports: - "80:80" - "443:443" volumes: - ./nginx/logs:/var/log/nginx:rw - ./nginx/cert:/etc/nginx/cert:ro - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/conf.d:/etc/nginx/conf.d:rw healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 10s timeout: 5s retries: 3 start_period: 30s3. Nginx 配置详解主配置文件（nginx.conf）# 全局配置 user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; # 日志配置 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; sendfile on; #tcp_nopush on; keepalive_timeout 65; # 压缩与缓存 gzip on; gzip_types text/plain application/json; # 包含子配置文件 include /etc/nginx/conf.d/*.conf; }子配置文件（conf.d/*.conf）http { server { listen 443 ssl; server_name _; } upstream backend { server backend1.example.com; server backend2.example.com; } location / { proxy_pass http://backend; } } # Stream 转发（TCP/UDP） stream { upstream db_backend { server db1.example.com:3306; server db2.example.com:3306; } server { listen 3306; proxy_pass db_backend; } }常见的HTTP模块配置# 传递请求头和用户信息 proxy_set_header Host $host; # 保留原始 Host 请求头 proxy_set_header X-Real-IP $remote_addr; # 保留客户端真实 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 保留转发链 proxy_set_header X-Forwarded-Proto $scheme; # 保留请求协议 (http/https) # 支持 WebSocket 等长连接 proxy_http_version 1.1; # 使用 HTTP/1.1 支持长连接 proxy_set_header Upgrade $http_upgrade; # 支持 WebSocket 升级 proxy_set_header Connection "upgrade"; # 保持长连接 # 配置传递下划线 Header underscores_in_headers on; # 允许传递下划线头部 # 增加连接和读写超时 (HTTP CODE 504) proxy_connect_timeout 120s; # 设置连接超时 proxy_read_timeout 120s; # 设置读取超时 proxy_send_timeout 120s; # 设置发送超时 client_max_body_size 1m; # 限制客户端请求体最大为 1MB (HTTP CODE 413) # 增加缓冲区大小 proxy_buffer_size 128k; # 设置初始缓冲区大小 proxy_buffers 4 256k; # 设置缓冲区数量和大小 proxy_busy_buffers_size 256k; # 设置繁忙时的缓冲区大小动态限流http { limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s; server { location /api/ { limit_req zone=api_limit burst=10 nodelay; proxy_pass http://backend_service; } } }HTTP301/HTTPS配置示例server { listen 80; server_name _; server_tokens off; # 关闭版本信息返回 return 301 https://$host$request_uri; } server { listen 443 ssl; server_name example.com; # 指定 SSL 证书和密钥路径 ssl_certificate /etc/nginx/cert/example.crt; ssl_certificate_key /etc/nginx/cert/example.key; # SSL 会话和协议配置 ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; # 加密套件和优先级配置 ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!aNULL:!MD5:!RC4'; ssl_prefer_server_ciphers on; # 启用 HSTS（仅在 HTTPS 完全启用后使用） add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; }在 Nginx 配置中，location 块用于定义 URL 路径和请求的匹配规则。以下是一些常见的 location 配置示例，包括重写、正则匹配和静态资源配置。Location 配置示例1. 基本重定向配置# 将所有 http 请求重定向到 https server { listen 80; server_name example.com; location / { return 301 https://$host$request_uri; } }用途：将所有 HTTP 请求重定向到 HTTPS。2. 静态文件服务配置server { listen 80; server_name example.com; # 为所有以 /static/ 开头的请求提供静态文件 location /static/ { root /var/www/html; # 静态文件目录 try_files $uri $uri/ =404; # 尝试查找文件，不存在返回 404 } }用途：为特定路径（如 /static/）提供静态资源服务。3. 正则匹配和动态路由server { listen 80; server_name example.com; # 匹配以 /user/ 开头且后面跟着数字的请求 location ~ ^/user/(\d+)$ { # 捕获正则匹配的数字并通过变量传递 set $user_id $1; # 转发请求到后端服务器 proxy_pass http://backend_servers/$user_id; } }用途：使用正则表达式匹配路径并将捕获的内容传递到后端。比如 /user/123 会被转发到 http://backend_servers/123。4. 禁止访问某些文件类型server { listen 80; server_name example.com; # 禁止访问 .bak 文件 location ~* \.bak$ { deny all; # 拒绝所有访问 } }用途：禁止访问特定类型的文件，如 .bak 文件。5. 静态文件 + 动态请求server { listen 80; server_name example.com; # 提供静态文件 location / { root /var/www/html; try_files $uri $uri/ /index.html; # 尝试找到文件，找不到时返回 index.html } # 处理 PHP 请求（假设 Nginx 已配置 PHP-FPM） location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; include fastcgi_params; } }用途：同时提供静态文件服务和处理动态请求（如 PHP）。6. 使用正则匹配重写 URLserver { listen 80; server_name example.com; # 将 /product/123 重写为 /product?id=123 location ~ ^/product/(\d+)$ { rewrite ^/product/(\d+)$ /product?id=$1 last; } }用途：使用正则表达式匹配 URL 并进行重写，将 /product/123 重写为 /product?id=123。7. 使用 try_files 优雅处理 404server { listen 80; server_name example.com; location / { root /var/www/html; try_files $uri $uri/ /index.php?$query_string; # 尝试静态文件，如果不存在则转到 PHP 处理 } }用途：try_files 用来优雅地处理文件不存在的情况，如果文件不存在，则转发给 PHP 或其他处理程序。8. 根据请求类型返回不同响应server { listen 80; server_name example.com; # 只允许 GET 和 POST 请求 location /api/ { if ($request_method !~ ^(GET|POST)$) { return 405; # 其他方法返回 405 Method Not Allowed } } }用途：根据请求方法返回不同的响应，例如只允许 GET 和 POST 请求。9. 缓存配置server { listen 80; server_name example.com; # 缓存图片文件 location ~* \.(jpg|jpeg|png|gif|ico)$ { expires 30d; # 设置缓存过期时间为 30 天 add_header Cache-Control "public"; } }用途：为特定类型的静态文件设置缓存头部，指定缓存时间。10. 转发到不同的后端server { listen 80; server_name example.com; # 转发到后端1 location /api/v1/ { proxy_pass http://backend_v1; } # 转发到后端2 location /api/v2/ { proxy_pass http://backend_v2; } }用途：根据路径前缀将请求转发到不同的后端服务器。总结：静态资源：location /static/ {} 用于服务静态文件。重写规则：location ~ ^/old/ { rewrite /new; } 用于 URL 重写。正则匹配：location ~ 用于路径的正则匹配和处理。请求过滤：location /api/ { if ... } 用于限制请求类型或 IP。反向代理：location /api/ { proxy_pass ... } 用于请求转发到后端服务器。这些配置可以灵活地结合使用，以满足不同的请求路由、重定向、反向代理、缓存等需求。
常见 Linux 命令详细解释以下是常见 Linux 命令及其参数的详细解释，按照使用频率排序，并附带了使用示例。1. scp（安全复制）scp（Secure Copy Protocol）用于在本地和远程主机之间进行加密传输文件。它基于 SSH 协议，因此数据传输过程中是安全的，适合在不安全的网络中传输敏感文件。语法：scp [选项] 源文件 目标文件常用选项：-r：递归复制整个目录。使用时，源文件应为目录。-P：指定远程主机的端口号（注意是大写 P）。例如，远程主机使用 2222 端口时，使用 -P 2222。-i：指定用于身份验证的私钥文件。例如，-i /path/to/private_key。-v：启用详细模式，显示 SCP 执行过程的详细信息。-C：启用压缩，在传输大量数据时有助于提高传输效率。-q：启用静默模式，不显示任何输出。-l：限制传输的带宽，单位为 Kbit/s。例如，-l 500 限制带宽为 500 Kbit/s。-B：禁止启用密码验证，强制使用密钥认证。-o：传递 SSH 配置选项，如 -o StrictHostKeyChecking=no 可以跳过 SSH 主机密钥检查。示例：scp -v -P 2222 -l 500 -i ~/.ssh/id_rsa -r ./myfolder deployer@127.0.0.1:/data使用 -l 选项限制传输带宽为 500 Kbit/s。注意事项：权限问题：如果目标路径的权限不足，可以通过 sudo 来提升权限，但是需要确保自己有远程 sudo 权限。密钥认证：使用 -i 选项时，确保私钥文件的权限是 600，否则 SSH 会拒绝使用该密钥进行连接。2. sshpass（自动输入密码的 SSH）sshpass -p "password" ssh -o StrictHostKeyChecking=no root@127.0.0.1 sh /data/custom.sh使用 sshpass 自动输入密码，登录并执行远程脚本。3. ssh（连接服务器/开启隧道-端口转发）常用选项：-L：本地端口转发。-i：指定私钥文件。ssh -L 0:3307:remote_ip:3306 user@host通过 SSH 创建本地端口转发。4. vim（文本编辑器）vim 是 Linux 系统中功能强大的文本编辑器，广泛用于文件编辑、编程和系统管理。其分为三种模式：普通模式：启动后默认进入普通模式，执行导航、删除、复制等操作。插入模式：用于文本输入，按 i 进入，按 Esc 退出。命令行模式：执行保存、退出、查找替换等命令，按 : 进入。插入模式i：在当前光标前插入。a：在当前光标后插入。o：在当前行下方新建一行并进入插入模式。保存和退出:w：保存文件。:q：退出 Vim。:wq 或 ZZ：保存并退出。:q!：强制退出（不保存修改）。:x：保存并退出（等价于 :wq）。文本操作复制、粘贴yy：复制当前行。nyy：复制当前行及其后 n 行。p：在光标后粘贴。P：在光标前粘贴。删除dd：删除当前行。ndd：删除当前行及其后 n 行。x：删除光标所在的字符。撤销和重做u：撤销上一步操作。Ctrl + r：重做上一步撤销。查找/pattern：向下查找 pattern。?pattern：向上查找 pattern。n：重复上一次查找（同方向）。N：反向重复上一次查找。替换:%s/old/new/g：将文件中所有的 old 替换为 new。:n,m s/old/new/g：将第 n 到第 m 行的 old 替换为 new。:%s/old/new/gc：替换时逐个确认。窗口操作分屏:split 或 :sp：水平分屏。:vsplit 或 :vsp：垂直分屏。Ctrl + w + w：在分屏间切换。Ctrl + w + h/j/k/l：移动到左/下/上/右的窗口。关闭窗口:q：关闭当前窗口。:only：关闭其他窗口，保留当前窗口。代码编辑功能缩进>>：将当前行向右缩进。<<：将当前行向左缩进。n>> 或 n<<：缩进当前行及其后 n 行。高亮匹配括号将光标放在括号上，按 % 可跳转到匹配的括号。代码折叠zf：根据选定范围折叠。zo：打开折叠。zc：关闭折叠。配置文件Vim 的行为可以通过配置文件 .vimrc 进行定制。以下是一个简单示例：set number " 显示行号 syntax on " 开启语法高亮 set tabstop=4 " 设置制表符宽度为 4 个空格 set expandtab " 使用空格替代 Tab set autoindent " 自动缩进高级用法打开多个文件vim file1 file2使用 :n 切换到下一个文件，:prev 切换到上一个文件。宏操作q<register>：开始录制宏，<register> 可以是任意字母。执行一系列操作后，按 q 停止录制。@<register>：执行宏。n@<register>：重复执行宏 n 次。多行注释选中多行：按 Ctrl + v 进入列模式，选择需要注释的行。插入注释符：按 Shift + i，输入注释符（如 #），然后按 Esc。示例替换文件中的字符串:%s/foo/bar/g将文件中所有的 foo 替换为 bar。删除空行:g/^$/d批量修改代码缩进:%!indent -kr5. xargs（构建和执行命令行）xargs 是一个用于构建并执行命令行的工具，通常结合管道使用。它从标准输入中读取数据（如文件列表、参数等），并将其转换为适合命令行的格式，接着执行指定的命令。xargs [选项] [命令]xargs 会从标准输入中读取数据并将其转化为命令行参数，然后执行指定的命令。常用选项：-n：指定每次执行命令时使用的参数个数。例如，xargs -n 2 表示每次使用两个参数来执行命令。-I：指定替换字符串。此选项允许你在命令中指定一个占位符（如 {}），并用输入数据替换该占位符。例如，xargs -I {} echo Hello, {} 会将标准输入的每一项替换 {}，并执行命令 echo Hello, <item>。-d：指定输入分隔符。默认情况下，xargs 使用空白字符（空格、制表符、换行符）作为分隔符，使用 -d 可以指定其他字符作为输入分隔符。-p：提示用户在执行每个命令前进行确认。例如，xargs -p rm 在执行每个 rm 命令之前都会要求用户确认。-0：与 find 命令结合使用时，使用空字符（而不是换行符）作为分隔符，以正确处理文件名中包含空格和特殊字符的情况。例如，find . -name "*.txt" -print0 | xargs -0 rm 用于删除所有 .txt 文件，正确处理文件名中包含空格的情况。示例：基本用法：echo "file1 file2 file3" | xargs rm这个命令会删除 file1、file2 和 file3 文件。xargs 会将输入的数据（文件名）传递给 rm 命令。使用 -n 每次传递指定数量的参数：echo "file1 file2 file3 file4" | xargs -n 2 rm该命令每次将两个文件作为参数传递给 rm 命令，执行 rm file1 file2 和 rm file3 file4。使用 -I 指定替换字符串：echo "file1 file2 file3" | xargs -I {} mv {} /path/to/destination/该命令将每个文件移动到 /path/to/destination/ 目录中。{} 是占位符，表示每次传递给 mv 命令的文件名。与 find 命令结合使用：find . -name "*.txt" | xargs rmfind 命令查找当前目录及其子目录下所有 .txt 文件，并将它们传递给 xargs rm 命令进行删除。处理包含空格的文件名（使用 -0）：find . -name "*.txt" -print0 | xargs -0 rm这个命令使用 -print0 和 -0 选项，确保即使文件名中包含空格或其他特殊字符，xargs 仍能正确处理文件。6. awk（文本处理工具）awk 是一种强大的文本处理工具，特别擅长按行、按字段处理文本数据。awk 可以用于筛选、格式化、统计和生成报告等任务。awk '条件 { 动作 }' 文件条件：指定处理文本的条件。动作：当条件满足时执行的操作，通常用于输出、修改或其他文本处理。常用选项：-F：指定输入字段分隔符，默认情况下是空白字符（空格或制表符）。例如，awk -F ',' 用于处理以逗号为分隔符的 CSV 文件。-v：定义变量，例如，awk -v var=value '...' 用于在 awk 脚本中传递外部变量。print：打印指定的内容或字段。NF：表示当前行的字段数。$1, $2, ... $n：表示当前行的第 1、第 2、...、第 n 个字段。示例：打印每一行的第一个字段：echo "apple orange banana" | awk '{print $1}'打印文件的第 1 和第 3 个字段：awk '{print $1, $3}' file.txt使用分隔符：echo "apple,orange,banana" | awk -F ',' '{print $2}'筛选满足条件的行：awk '$2 > 50 {print $1, $2}' file.txt计算总和：awk '{sum += $1} END {print sum}' file.txt计算文件中所有第一列的数字之和。7. grep（文本搜索）常用选项：-E：启用扩展正则表达式。-r：递归搜索目录。-i：忽略大小写。-v：反向匹配，显示不匹配的行。-l：只显示匹配的文件名。grep -i "pattern" file.txt8. sort（排序）常用选项：-n：按数字排序。-r：逆序排序。-u：去除重复的行。 也可使用uniqsort -n file.txt9. comm（比较文件）用于比较两个排序过的文件，显示它们的共同部分和差异部分。常用选项：-1：不显示文件 1 中独有的部分。-2：不显示文件 2 中独有的部分。-3：不显示两个文件共有的部分。comm file1.txt file2.txt10. tr（字符转换）常用选项：-d：删除字符。-s：压缩字符。tr 'a-z' 'A-Z' # 将小写字母转换为大写字母 tr -s '[[:space:]]' '\n' # 根据空白字符分词 #[[:space:]]：一个 POSIX 字符类，匹配所有空白字符（如空格、制表符、换行符等）。11. tar（打包与压缩）常用选项：-c：创建一个新的 tar 包。-x：解包。-v：显示处理过程。-f：指定目标文件。-z：通过 gzip 压缩或解压。-j：通过 bzip2 压缩或解压。tar -cvf 1101_log.tar 1101_log/* tar -zxvf file.tar.gz12. gzip（压缩）gzip 是一个用于压缩单个文件的工具，会删除原始文件并生成 .gz 压缩文件常用选项：-d：解压文件-r：递归压缩目录中的所有文件（每个文件单独生成 .gz 文件）-v：显示压缩过程gzip -d /tmp/test.gz13. zip 和 unzip（压缩和解压 .zip 文件）zip：用于压缩文件和目录。zip [选项] 压缩包 文件/目录常用选项：-r：递归压缩-m：不保留原文件-v：显示过程zip -r /tmp/test.zip /tmp/testdirunzip：用于解压 .zip 文件。常用选项**：-d：指定解压目录-v：显示解压过程unzip /tmp/test.zip -d ./tmp/test14. split（文件拆分）用于将大文件拆分为小文件。语法：split [选项] 文件 前缀常用选项：-a: 指定生成的小文件后缀的长度，默认为2-b: 指定每个拆分文件的大小。单位可为 b（字节）、k（千字节）、m（兆字节）。-d: 使用数字作为小文件的后缀，而不是字母，默认为字母-l: 指定每个小文件的行数，默认为1000行-n: 指定生成的小文件的数量，默认为2--verbose: 显示拆分过程的详细信息split -b 35m -d /path/to/bigfile bigfile_将 bigfile 拆分为多个 35MB 的文件。15. nohup（后台运行）**挂起信号简介：挂起信号（SIGHUP, Signal Hang Up）是当用户注销或关闭终端时，系统发送给与该终端相关进程的信号。默认情况下，进程会因接收到挂起信号而终止。nohup 命令会忽略挂起信号，使进程在终端关闭后仍然继续运行。nohup 命令 [参数] &常用选项：&：将命令放入后台运行，配合 nohup 使用。nohup.out：如果未指定输出文件，命令的标准输出和错误输出会默认重定向到 nohup.out 文件中。nohup python3 script.py > output.log 2>&1 &16. ps（进程状态）**ps 命令用于查看当前系统的进程信息，包括正在运行的程序及其状态。常用选项**：-e：显示所有进程（相当于 ps -A）。-f：显示完整格式的信息，包括 UID、PPID、C、STIME 等。-ef：组合选项，显示所有进程的详细信息。 - `a`：显示与终端相关的所有进程。 - `u`：以用户为中心的格式显示。ps -u $(whoami) # 查看当前用户的进程 ps -ejH # 查看进程的层级关系（父子关系）17. kill（终止进程）**kill 命令用于向指定进程发送信号，常用于终止进程。kill [选项] 进程ID常用选项：-9（SIGKILL）：强制终止进程，不会保存数据或进行清理操作。-15（SIGTERM）：默认信号，优雅地终止进程，允许进程进行清理工作后退出。信号编号信号名称说明1SIGHUP重新加载进程配置（常用于守护进程）。2SIGINT中断进程（相当于 Ctrl+C）。9SIGKILL强制终止进程。15SIGTERM优雅地终止进程（默认）。kill -15 1234 # 优雅地终止进程 kill -9 1234 # 发送 `SIGKILL` 信号强制终止进程 ID 为 `1234` 的进程。 ps -ef | grep python | awk '{print $2}' | xargs kill -9 # 查找运行的 Python 进程并强制终止。18. tcpdump（抓包）用于网络数据包的捕获和分析。可以使用Wireshark图形化分析抓包文件。tcpdump [选项] [表达式]常用选项：-i：指定网络接口。-w：将输出保存到文件。-nn：禁用域名解析。-v：显示详细输出。-s0：捕获完整的数据包。tcpdump -w tcpdump.pcap -i docker0 # 在 `docker0` 网络接口上抓取数据包，并将其保存到 `tcpdump.pcap` 文件中。 tcpdump -i en0 host 127.0.0.1 -nnv -s0 -c 50 # 捕获到 `127.0.0.1` 主机的 50 个数据包，并显示详细信息。19. top（实时进程监控）top 命令用于实时显示系统的进程信息，包括每个进程的 CPU 和内存使用情况，帮助用户了解系统资源的分配情况。常用选项：-u：显示某个用户的进程。-p：监控特定的进程ID。-d：设置更新频率（秒）。-n：指定更新次数。快捷键操作（在 top 命令运行时，你可以使用以下快捷键操作）：P：按 CPU 使用率排序进程。M：按内存使用率排序进程。T：按时间/累计时间排序进程。q：退出 top 命令。h：显示 top 的帮助信息。k：终止（kill）一个进程，输入进程的 PID。r：改变进程的优先级（即调整 nice 值）。u：只显示某个用户的进程。n：设置刷新间隔时间（默认是 3 秒）。c：切换显示命令行或程序名称。20. uptime（系统运行时间）uptime 命令显示系统的运行时间、当前时间、登录用户数量以及负载信息，是系统管理员常用的查看系统健康状况的工具。21. w（查看当前登录用户和系统活动）w 命令用于显示当前系统登录用户的信息以及他们正在执行的活动。它可以提供有关每个用户的详细信息，如登录时间、正在运行的进程、终端等22. sync（同步磁盘）sync 命令用于将文件系统的缓存数据写入磁盘，确保数据的持久性。该命令常用于系统关闭前，或者需要手动同步的场景。sync; echo 3 > /proc/sys/vm/drop_caches # 同步缓存并清空缓存，包括 swap 空间。25. du（磁盘使用情况）du 命令用于显示文件和目录的磁盘使用情况，可以帮助用户查看目录或文件占用的磁盘空间。du [选项] [文件/目录]常用选项：-h：以易读的格式显示（例如 KB、MB）。-s：显示总计，即只显示目录的总大小。-a：显示所有文件和目录的使用情况。--max-depth=N：只显示到指定深度的目录信息。du -sh /home/user/ du -ah # 显示当前目录及其所有子目录和文件的磁盘使用情况。 du -h --max-depth=2 /home/user/ # 显示目录的前两级使用情况26. df（文件系统磁盘空间）df 命令用于查看文件系统的磁盘空间使用情况，帮助了解磁盘空间的分配与使用情况。常用选项**：-h：以易读格式显示（例如 KB、MB）。-T：显示文件系统类型。-a：包括所有文件系统（即使它们的使用空间为 0）。-i：显示 inode 的使用情况（文件系统中的索引节点）。df -hT # 除了显示空间使用情况，还显示文件系统的类型（例如 ext4、xfs）。 df -hi # 显示所有文件系统的 inode 使用情况，帮助判断是否达到 inode 限制。27. rpm（RPM 包管理器）用于安装和管理 RPM 包。常用选项：-i：安装包。-v：显示详细信息。-h：显示安装进度。rpm -ivh package.rpm # 安装名为 `package.rpm` 的软件包。28. systemctl（系统控制）用于管理系统服务。常用选项：status：查看服务状态。start：启动服务。stop：停止服务。enable：设置服务开机自启动。disable：禁用服务开机自启动。systemctl start firewalld systemctl stop firewalld systemctl enable firewalld systemctl disable firewalld29. firewall-cmd（Firewalld 管理）用于管理 firewalld 防火墙。常用选项：--get-active-zones：查看当前激活的防火墙区域。--add-port：开放端口。--remove-port：关闭端口。--set-default-zone：设置默认区域。--add-rich-rule：添加高级规则。firewall-cmd --get-active-zones # 查看激活的域 firewall-cmd --get-default-zones # 查看默认的域 firewall-cmd --zone=public --list-ports # 查看开放的端口 firewall-cmd --zone=public --list-rich-rules # 查看添加的规则 firewall-cmd --zone=public --add-port=80/tcp --permanent # 开放 80 端口并设置为永久生效， firewall-cmd --zone=trusted --remove-port=9201 # 关闭 9201 端口。30. iptables（防火墙规则管理）管理 IP 防火墙规则。常用选项：-I：插入新规则。-D：删除规则。-L：列出当前规则。-p：指定协议。--dport：指定目标端口。iptables -I INPUT -s 10.150.3.11 -p tcp --dport 9201 -j ACCEPT iptables -D INPUT -s 10.150.3.11 -p tcp --dport 9201 -j ACCEPT # -m multiport --dport 9201,8500,15672
Docker 使用手册Docker 基础命令镜像管理查找镜像docker search image_name--filter / -f：按条件过滤（如 stars=100）。--limit：限制返回结果数量。拉取镜像docker pull image_name:tag--all-tags / -a：拉取镜像的所有标签。查看本地镜像docker images--all / -a：列出所有镜像，包括中间层。--digests：显示镜像摘要信息。--filter / -f：按条件过滤。删除镜像docker rmi image_name:tag--force / -f：强制删除。docker image prune -a：删除未使用的镜像。保存与加载镜像docker save image_name:tag | gzip > image.tar.gz gunzip -c image.tar.gz | docker load查看镜像历史docker history image_name:tag--no-trunc：显示完整信息。--quiet / -q：只显示层 ID。根据容器提交镜像docker commit -a "nathan" -m "create new img" <container_id> image_name:tag-a：设置作者信息。-m：描述信息。--change / -c：对镜像进行配置更改。重命名镜像docker tag old-repo/myimage:tag new-repo/myimage:new-tag容器管理运行容器docker run -it --entrypoint sh image_name:tag-i：保持标准输入打开。-t：分配伪终端。--name：为容器命名。-d：后台运行。--rm：退出后自动删除。-p：端口映射（如 8080:80）。-v：挂载数据卷（如 /host/path:/container/path）。查看容器日志docker logs <container_id> docker logs --since 10m container_id-f：实时查看日志。--tail：显示最新日志行数（如 100）。--since：从指定时间开始显示日志（支持 10m、1h、具体时间戳等）。--until：设置日志显示结束时间。查看容器状态docker ps docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"-a / --all：列出所有容器。-q：只显示容器 ID。--filter / -f：按条件过滤。--format：以指定格式显示容器信息，可用占位符包括：{{.ID}}：容器 ID{{.Names}}：容器名称{{.Status}}：容器状态{{.Ports}}：容器端口--latest / -l：只显示最近创建的容器。--size / -s：显示容器的文件大小。删除容器docker rm $(docker ps -aq)-f / --force：强制删除。-v：同时删除挂载的卷。停止/启动/重启容器docker stop/start/restart container_id--time / -t：设置停止超时时间（默认 10 秒）。检查容器信息docker inspect container_id docker inspect --format='{{.State.Running}}' container_id使用 --format 提取特定信息：{{.State.Status}}：容器状态{{.Config.Image}}：镜像名称进入容器docker exec -it container_id /bin/bash网络管理查看网络docker network ls--filter / -f：按条件过滤。创建网络docker network create my-network--driver：指定网络驱动类型（如 bridge、host）。--subnet：指定子网（如 192.168.1.0/24）。指定网络运行容器docker run --network my-network --name nginx -d nginx删除网络docker network rm network_name查看详细信息docker network inspect network_name创建带驱动配置的网络docker network create \ --driver bridge \ --subnet=192.168.1.0/24 \ custom-network删除未使用的网络docker network prune清理无用资源清理未使用镜像和容器docker image prune -a docker system prune -a-a：删除所有未使用资源。--force / -f：跳过确认提示。性能监控查看资源使用情况docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"查看容器进程docker top container_id查看系统事件docker events挂载管理查看数据卷docker volume ls列出使用中的数据docker volume ls --filter dangling=false检查数据卷信息docker volume inspect <volume_name>删除数据卷docker volume rm volume_name清理未使用的卷docker volume prune --force系统信息查看版本docker version查看系统信息docker info导出与导入导出容器docker export container_id > container.tar导入容器cat container.tar | docker import - new_image_name:tag文件复制从主机复制到容器docker cp local_path container_id:container_path从容器复制到主机docker cp container_id:container_path local_path登录与登出登录 Docker 仓库docker login--username / -u：指定用户名。--password / -p：指定密码（不推荐明文）。登出 Docker 仓库docker logoutDockerfile 使用指南1. 常用指令基础设置FROM：指定基础镜像，通常是第一行。FROM ubuntu:20.04LABEL：添加元数据。LABEL maintainer="your-email@example.com" version="1.0"文件与目录操作WORKDIR：设置工作目录。WORKDIR /appCOPY 和 ADD：复制文件到镜像中。COPY . /app ADD http://example.com/file.tar.gz /app # 支持远程 URL 下载与解压VOLUME：声明挂载点。VOLUME ["/data"]软件安装与命令执行RUN：执行命令安装依赖或配置环境。RUN apt-get update && apt-get install -y python3USER：设置后续命令的执行用户。USER nonroot容器启动行为CMD：设置容器启动时的默认命令（可被 docker run 覆盖）。CMD ["python3", "app.py"]ENTRYPOINT：设置不可覆盖的默认命令。ENTRYPOINT ["python3", "app.py"]EXPOSE：声明容器监听的端口（仅文档作用）。EXPOSE 80802. 分阶段构建分阶段构建用于优化镜像大小。以下是示例：# 构建阶段 FROM node:16 AS builder WORKDIR /app COPY . . RUN npm install && npm run build # 运行阶段 FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html构建阶段中安装依赖和生成构建产物。运行阶段中仅包含运行所需的文件。3. docker build 命令docker build 用于根据 Dockerfile 构建镜像。基本语法docker build [OPTIONS] PATH常用选项-t：为镜像命名和标记版本。docker build -t myapp:1.0 .-f：指定 Dockerfile 文件路径。docker build -f /path/to/Dockerfile .--no-cache：禁用构建缓存，强制执行所有步骤。docker build --no-cache -t myapp .--build-arg：传递构建时参数。docker build --build-arg VERSION=1.0 -t myapp .ARG VERSION ENV APP_VERSION=$VERSION-q：仅返回镜像 ID，隐藏构建日志。docker build -q -t myapp .--target：指定目标构建阶段,在多阶段构建中，仅构建指定阶段：docker build --target builder -t app-builder .导出缓存将构建缓存保存到目录：docker build --cache-to=type=local,dest=./cache .启用并行构建使用 --progressdocker build --progress=plain .示例构建镜像：docker build -t myapp .带参数构建：docker build --build-arg ENV=production -t myapp:prod .4. 优化建议多阶段构建：减少最终镜像大小。缓存利用：将变化较小的命令置于 Dockerfile 顶部。精简基础镜像：选择 alpine 等轻量级镜像。合并 RUN 命令：减少镜像层数。RUN apt-get update && apt-get install -y python3 && apt-get clean总结通过合理使用 Dockerfile 指令及优化构建过程，可以高效生成体积小、性能优的镜像。docker build 提供了丰富的选项以支持复杂需求，结合分阶段构建，可满足不同场景的性能和管理需求。Docker Compose 使用指南常用命令启动服务docker-compose up -d-d：后台运行。停止并移除服务docker-compose down默认会移除容器及相关网络，但不会删除卷。使用 --volumes 删除所有关联卷。 docker-compose down --volumes使用 --remove-orphans 删除未定义的容器。docker-compose down --remove-orphans查看状态docker-compose ps指定配置文件启动docker-compose -f custom-compose.yml up -d重启服务docker-compose restart查看实时日志docker-compose logs -f可指定服务名查看：docker-compose logs -f service_name清理无用卷docker volume prunedocker-compose.yaml 书写规范结构顶层字段：version：指定 Compose 文件版本。services：定义服务。volumes：定义数据卷。networks：定义网络。缩进：使用两个空格，保持层级清晰。示例version: "3.9" services: web: image: nginx:alpine ports: - "8080:80" volumes: - web-data:/usr/share/nginx/html networks: - webnet app: build: context: ./app environment: - NODE_ENV=production depends_on: - db networks: - appnet db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example volumes: - db-data:/var/lib/mysql networks: - appnet volumes: web-data: db-data: networks: webnet: appnet:网络配置自定义网络networks: custom-network: name: my-custom-network driver: bridge使用外部网络networks: existing-network: external: true子网和网关networks: custom-network: driver: bridge ipam: config: - subnet: 192.168.1.0/24 gateway: 192.168.1.1卷配置命名卷volumes: app-data:挂载主机目录services: app: volumes: - /host/path:/container/path驱动与选项volumes: my-volume: driver: local driver_opts: type: nfs o: addr=192.168.1.100,rw device: ":/path/to/dir"Docker Compose 的 build 配置build 配置支持更多高级功能，例如缓存、构建参数、挂载等。完整配置示例services: app: build: context: ./app dockerfile: Dockerfile.prod args: APP_ENV: "production" cache_from: - app-cache target: builder network: host extra_hosts: - "local.test:127.0.0.1"字段说明context：指定构建上下文目录（通常是包含 Dockerfile 的路径）。dockerfile：自定义 Dockerfile 路径。args：传递构建参数（在 Dockerfile 中使用 ARG 声明）。cache_from：使用指定镜像作为构建缓存源，减少重复构建时间。target：指定构建阶段的目标，仅构建多阶段镜像中的某一阶段。network：设置构建时使用的网络模式（如 host）。extra_hosts：在构建时定义额外的主机解析（类似 /etc/hosts）。更多高级用法挂载构建时的卷（Docker BuildKit 支持）用于在构建时临时挂载额外数据，例如私有依赖库。services: app: build: context: . dockerfile: Dockerfile secrets: - my_secret secrets: my_secret: file: ./secrets.txt使用 BuildKit 的缓存挂载services: app: build: context: . dockerfile: Dockerfile cache_from: - type=local,src=./cache cache_to: - type=local,dest=./cache实用技巧depends_on 限制定义依赖关系，但不会保证服务完全启动：depends_on: - db扩展字段使用 x- 前缀定义共享配置：x-shared-config: environment: - LOG_LEVEL=debug services: service1: <<: *x-shared-config image: app1 service2: <<: *x-shared-config image: app2动态扩展配置配合环境变量使用：services: app: image: "${APP_IMAGE:-default-app}:latest"综合示例以下是一个完整的 Compose 配置文件示例：version: "3.9" services: frontend: image: nginx:alpine ports: - "8080:80" networks: - frontend-backend backend: build: context: ./backend environment: - APP_ENV=production depends_on: - db networks: - frontend-backend - backend-db db: image: postgres:13 environment: POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - db-data:/var/lib/postgresql/data networks: - backend-db volumes: db-data: networks: frontend-backend: backend-db:总结通过合理配置 docker-compose.yaml 文件并利用 Compose 命令，可以轻松管理复杂的容器服务。配合网络和卷配置，能进一步优化服务间的交互与数据持久化。4. 常用脚本示例检查容器内文件#!/bin/bash if [ -z "$1" ]; then echo "请传入要搜索的文件名" exit 1 fi RUNNING_CONTAINERS="$(docker ps --format '{{.Names}}')" for CONTAINER in $RUNNING_CONTAINERS; do if docker exec -it $CONTAINER sh -c 'test -e $1'; then echo "Found $1 in container: $CONTAINER" fi done5. 常见问题与注意事项镜像源加速配置# apk镜像源加速 RUN echo "https://mirrors.aliyun.com/alpine/v3.18/main" > /etc/apk/repositories && \ echo "https://mirrors.aliyun.com/alpine/v3.18/community" >> /etc/apk/repositories && \ apk update --allow-untrusted && \ apk add --allow-untrusted --clean-protected --no-cache bash && \ rm -rf /var/cache/apk/* # apt镜像源加速 RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list && apt-get update删除未使用的镜像comm -23 <(docker images --format "{{.Repository}}:{{.Tag}}" | sort) <(kubectl get pods --all-namespaces -o jsonpath="{..image}" | tr -s '[[:space:]]' '\n' | sort) | grep emotibot | grep -v infra | xargs docker rmi
Mac 应用工具分类整理本文整理了一系列常用的 Mac 应用程序，按照不同类别进行了分类，并标注了其主要作用及官方网站。开发工具应用名称主要作用官方网站ApifoxAPI 文档管理、接口调试和测试工具Apifox 官网PostmanAPI 开发与测试Postman 官网IntelliJ IDEA CEJava IDEIntelliJ IDEA 官网PyCharm CEPython IDEPyCharm 官网DBeaver数据库管理工具DBeaver 官网Sublime Text文本编辑器Sublime Text 官网TyporaMarkdown 文档编辑器Typora 官网VS Code轻量级代码编辑器VS Code 官网Git版本控制工具Git 官网SoapUIWeb 服务测试工具SoapUI 官网SourcetreeGit 图形化管理工具Sourcetree 官网JProfilerJava 性能分析工具JProfiler 官网ZenTermLite轻量化终端工具无官方网站，基于社区开发。网络与运维工具应用名称主要作用官方网站Docker容器化工具Docker 官网SecureCRTSSH 远程连接SecureCRT 官网Wireshark网络抓包工具Wireshark 官网Apache JMeter性能测试工具JMeter 官网TunnelblickVPN 客户端Tunnelblick 官网Tabby终端模拟器Tabby 官网SwitchHosts快速切换 Hosts 文件SwitchHosts 官网FinalShellSSH 连接与管理工具FinalShell 官网XmanagerWindows 系统下的图形化远程桌面管理Xmanager 官网数据分析工具应用名称主要作用官方网站Navicat Premium数据库管理与开发Navicat 官网Memory Analyzer (MAT)Java 堆分析工具MAT 官网Offset Explorer 2Kafka 数据流监控Offset Explorer 官网通信与远程协作应用名称主要作用官方网站TeamViewer远程桌面连接工具TeamViewer 官网Zoom视频会议Zoom 官网Microsoft Remote Desktop Beta微软远程桌面连接Microsoft 官网ToDesk远程协作工具ToDesk 官网Linphone开源 VoIP 通信工具Linphone 官网浏览器与办公工具应用名称主要作用官方网站Google Chrome浏览器Chrome 官网Microsoft Edge浏览器Edge 官网Adobe Acrobat ReaderPDF 阅读器Adobe 官网Microsoft Office办公套件（Word、Excel、PowerPoint）Office 官网Anaconda Navigator数据科学与 Python 开发环境管理工具Anaconda 官网文件管理与效率工具应用名称主要作用官方网站TransmitFTP 文件传输工具Transmit 官网ClashX Pro网络代理客户端ClashX 官网EasyConnect企业 VPN 工具EasyConnect 官网Cursor提升工作效率的快捷工具Cursor 官网Quantumult X网络代理与规则配置Quantumult 官网V2rayU网络代理客户端V2rayU 官网Maccy剪贴板管理工具Maccy 官网Snipaste截图小工具（可钉在桌面）Snipaste 官网uTools高效工具集插件平台uTools 官网Draw.io绘图与流程图工具Draw.io 官网说明： 以上分类及应用整理基于实际功能划分，帮助您快速找到所需工具。根据需求选择最适合的应用！
购买服务器后，首先需要配置的是 SSH。频繁登录云供应商平台、输入授权码等操作相当繁琐，因此 SSH 配置能大大简化登录流程。SSH（Secure Shell）是一种用于安全远程登录和其他网络服务（如安全文件传输）的协议，支持多种登录方式，每种方式都有其优缺点。以下是 SSH 中常见的两种登录方式的分析（此外还有基于证书和双因素认证等其他方式，它们通常提供更高的安全性，但对于个人开发者而言，过于繁琐且成本较高，本文不作讨论）：1. 基于密码的登录描述用户通过输入用户名和密码进行身份验证。优点简单易用：用户只需记住密码，设置过程相对简单。广泛支持：几乎所有 SSH 客户端和服务器都支持此方式。缺点安全性较低：如果密码被破解（如暴力攻击、社交工程等），攻击者可以轻易获得访问权限。管理复杂：需要定期更改密码以增强安全性，用户可能会使用弱密码。2. 基于公钥的登录描述使用 SSH 密钥对（公钥和私钥）进行身份验证。用户在服务器上放置公钥，而在本地计算机上保留私钥。优点安全性高：密钥对的安全性远高于简单密码，攻击者难以猜测私钥。便捷性：一旦设置，用户可以在不输入密码的情况下轻松登录。支持多种认证机制：可以为不同服务器设置不同的密钥。缺点初始设置复杂：需要生成密钥对并将公钥传输到服务器。私钥管理：用户需妥善保管私钥，避免丢失或被盗。每种 SSH 登录方式都有其独特的优势和不足。通常推荐使用 基于公钥的登录，因为它在安全性和便捷性之间取得了良好的平衡。1. 如何获取密钥对？物理机使用以下命令生成 SSH 密钥对：ssh-keygen -t rsa -b 4096将公钥复制到远程服务器：ssh-copy-id username@hostname云服务器几乎所有云服务供应商都提供了密钥管理功能，支持密钥生成及下载。以下是在腾讯云轻量云服务器上生成密钥的步骤：选择产品-轻量云服务。在左侧菜单中选择 SSH 密钥，点击创建密钥。选择与服务器相同的地域，填写信息以生成 SSH-Key（还可以一键关联至服务器上）。通过以上操作，可以轻松创建密钥对，使用 ssh-copy-id 或云服务商的一键关联功能将公钥配置到服务器上。请妥善保存好私钥（丢失不可恢复）。接下来进行以下操作：2. 修改 SSH 端口自定义 SSH 端口号不仅可以增加安全性，还能减少自动化攻击的潜在风险。选择一个不常用的端口，可以有效地隐藏 SSH 服务，从而降低被攻击的可能性。如何修改 SSH 端口：服务器端的 SSH 配置文件通常位于 /etc/ssh/sshd_config，该文件用于控制服务器端的行为、允许的认证方式和安全策略等。可以通过 Port 指令指定 SSH 的监听端口号，例如：# /etc/ssh/sshd_config Port 2222上述配置将 SSH 服务的端口从默认的 22 改为 2222。完成配置后，重启 SSH 服务以应用更改：sudo systemctl restart sshd这样，服务器将开始在端口 2222 上监听 SSH 连接。3. 配置网络防火墙对于物理服务器，可以配置防火墙以开放相应的 SSH 端口（如 2222）。云服务器则可通过云平台管理网络策略，根据页面配置开放对应的 SSH 端口。例如，腾讯云的配置示例：4. 配置客户端免密登录注意： 仅建议在个人电脑上配置免密登录。在公共网络或多用户共享的设备上，使用免密登录可能导致严重的安全风险，请谨慎选择。客户端的配置文件通常位于用户目录下的 .ssh/config 中，用户可以为不同的主机设定各自的 SSH 参数。客户端配置文件示例：# ~/.ssh/config Host myserver HostName example.com User myuser Port 2222 IdentityFile ~/.ssh/myserver_key密钥认证：确保私钥文件的权限是 600，否则 SSH 会拒绝使用该密钥进行连接。通过以上配置，连接服务器时只需执行以下命令，操作便捷且安全（仅限私人电脑）：ssh myserver常见配置项Host: 定义服务器的别名，可用 * 通配符配置多个主机。HostName: 指定服务器的实际地址或域名。User: 指定默认登录用户名。Port: 指定连接时使用的端口号。IdentityFile: 指定用于身份验证的私钥文件路径，可为不同主机指定不同的密钥。5. 命令行连接对于不常用或公共环境，建议使用云厂商平台登录，或使用以下临时登录命令：ssh -p 2222 myuser@example.com -i ~/.ssh/myserver_key该命令可临时指定端口号和私钥文件，避免修改配置文件，适合短期使用。通过这些 SSH 配置，您可以显著提高登录过程的效率与安全性。强烈建议定期检查和更新您的安全配置，以应对潜在的威胁。
快速搭建 Typecho 博客平台指南要快速搭建一个博客平台其实并不难。借助腾讯云的轻量应用服务器，可以轻松部署 Typecho 博客平台。只需购买轻量应用服务器后选择 Typecho 网站模板，即可实现一键安装的体验。轻量云服务预配置了 LAMP 或 LNMP 环境，让我们不必手动设置服务器环境，十分适合快速启动和试用。在轻量云环境中快速搭建好博客平台后，我们可以简单浏览页面风格及系统配置，以确认是否符合需求。至此，一个可用的私有化部署的博客平台已经搭建完成。但这只是开始……使用轻量云服务搭建博客固然简便快捷，尤其对小白用户来说，仅需几步点击即可轻松完成配置。然而，作为开发者，我希望更深入了解 Typecho 的底层架构和安装过程。因此，我登录到已部署的博客服务器，准备研究这款应用的安装路径。同时，查阅了 Typecho 官方安装指南，希望进一步理解 Typecho 的构成与部署需求。根据文档，Typecho 的依赖环境包括以下几个主要组件：PHP 7.2及以上版本（如果使用 PHP 8，建议确保 Typecho 版本支持兼容）。数据库支持：MySQL、PostgreSQL、SQLite 其中任意一种（需在 PHP 中安装相关扩展）。CURL 或者 Socket 扩展。mbstring 或者 iconv 扩展。在检查云服务器配置时，发现已预装以下组件：PHP：世界上最受欢迎的后端开发语言MariaDB：兼容 MySQL 的数据库替代方案Nginx：用于安装 Typecho 平台，并且 腾讯云支持一键配置 HTTPS 证书这些程序被安装在用户目录下的 softwares 文件夹中，便于管理。手动部署 Typecho接下来，我需要下载安装包，并将文件上传至服务器的 Web 目录。这时可能会遇到一些常见问题，比如：什么是 Web 目录？服务器 Web 目录是专为 Web 应用配置的根目录，一般情况下在 Ubuntu 系统中，路径为 /var/www/html。这里是放置 Web 应用代码的默认位置，可以通过 Nginx 或 Apache 等 Web 服务器访问。GAE/SAE/BAE/ACE 是什么？GAE（Google App Engine）、SAE（新浪应用引擎）、BAE（百度应用引擎）、ACE（阿里云应用引擎）是几大厂商提供的 PaaS 平台，为 Web 应用提供预配置的运行环境，也适合快速部署 Typecho 等应用（目前阿里云上我已经找不到该服务了）。Docker 部署 Typecho为什么使用Docker为了更灵活地管理应用，我决定使用 Docker 部署。首先，从 DockerHub 中搜索 php 基础镜像：Docker PHP。常见的镜像版本包括：php-cliphp-fpmphp-apachephp-alpine我的需求是基于 php-fpm 或 php-apache 镜像来部署 Typecho。如果追求更简单的流程，直接选择 php-apache 作为基础镜像，并挂载 /var/www/html 目录，即可快速运行 Typecho。但是为了更高的性能，我选择了 php-fpm，这样需要引入 Nginx 来处理静态资源并对接 FastCGI 协议。使用 Nginx 和 php-fpm 协同工作接下来，我决定将所有服务整合至 php-fpm，并前置 Nginx 以对接 FastCGI 服务。然而，经过多次测试后，我发现单独使用 php-fpm 无法直接访问应用静态资源，必须配合 Nginx 才能正常工作。因此，我在 php-fpm 镜像中安装了 Nginx，以实现完整的 PHP Web 应用环境。在 Docker 中，推荐将 Nginx 和 php-fpm 放在不同容器中。这种做法能够实现模块化管理，便于维护和扩展。通过 Docker Compose 管理这两个容器时，可以让 Nginx 处理静态资源请求，并将动态请求反向代理到 php-fpm 容器，从而既保持了良好的性能，又确保了环境的稳定性。尽管可以将 Nginx 安装在 php-fpm 镜像中以形成单一容器，但这种方法并不符合容器化的最佳实践。我选择将 Nginx 与 php-fpm 整合的原因在于，虽然 Nginx 可以被分离，但将 Web 应用的根目录配置到 php-fpm 所在的根目录上会导致两者共用同一个目录。这限制了 Nginx 的用途，因此我决定单独安装一个 Nginx，专门用于支持 Typecho 的运行。Dockerfile# 使用更新的 PHP 基础镜像 FROM php:7.4-fpm # 更新包管理器并安装依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ libpq-dev \ zlib1g-dev \ libzip-dev \ zip \ unzip \ nginx \ && docker-php-ext-install pdo pdo_pgsql pdo_mysql mysqli pgsql zip \ && apt-get clean && rm -rf /var/lib/apt/lists/* COPY ./nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD service nginx start && php-fpmnginx.confuser www-data; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; 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; sendfile on; keepalive_timeout 65; server { listen 80; server_tokens off; server_name _; root /var/www/html; index index.php; if (!-e $request_filename) { rewrite ^(.*)$ /index.php$1 last; } location ~ .*\.php(\/.*)*$ { include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; } # 禁止访问的文件或目录 location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) { return 404; } } }常见问题与解决方案Docker 桥接网络的 DNS 问题 使用腾讯云轻量应用服务器的界面管理 Docker 服务时，发现页面创建容器无法直接配置网络。默认的桥接网络在 DNS 解析方面存在局限性，导致容器之间无法通过容器名进行互相访问。根据 Docker 官方文档，默认桥接网络的功能有限，不适合复杂场景。 解决方法：使用 Docker Compose 定义一个自定义的桥接网络，自定义网络不仅支持容器名解析，还能提供更灵活的网络管理。PHP 基础镜像选择问题 最初尝试使用 php:7.4-fpm 配合 Nginx 部署服务，但在实际运行中，发现评论功能无法正常使用。经排查，问题可能与 Nginx 的 FastCGI 配置有关。为了规避此类潜在问题，改用了 php:7.4-apache 镜像，利用其内置的 Apache Web 服务器简化配置流程，同时在 Dockerfile 中增加对多种数据库扩展的支持，以满足 Typecho 的运行需求。Nginx-dmz 配置Nginx 在 nginx-dmz 容器中负责将请求代理到 php-apache 容器，并支持 HTTP 和 HTTPS。以下是完整的 Nginx 配置示例。HTTP 配置文件：default.conf用于处理未加密的 HTTP 流量，将其代理至 php-apache 容器或重定向到 HTTPS。server { listen 80; # 指定域名（或使用通配符 `_` 匹配所有） server_name example.com; # 将所有请求代理到 typecho 容器 location / { proxy_pass http://typecho:80; # 代理到 typecho 服务 # 传递请求头和用户信息 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; # 支持 WebSocket 等长连接 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }HTTPS 配置文件: default.conf参考资料负载均衡 HTTPS 转发配置入门指南-实践教程-文档中心-腾讯云SSL 证书 Nginx 服务器 SSL 证书安装部署（Linux）-文档中心-腾讯云server { # 自动将 HTTP 请求重定向到 HTTPS listen 80; server_name example.com; return 301 https://$host$request_uri; } server { # 配置 HTTPS listen 443 ssl; server_name www.example.com example.com; # 指定 SSL 证书和密钥路径 ssl_certificate /etc/nginx/cert/example.crt; ssl_certificate_key /etc/nginx/cert/example.key; # SSL 会话和协议配置 ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; # 加密套件和优先级配置 ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!aNULL:!MD5:!RC4'; ssl_prefer_server_ciphers on; # 启用 HSTS（仅在 HTTPS 完全启用后使用） add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # 将请求代理到 typecho 容器 location / { proxy_pass http://typecho:80; # 代理到 typecho 服务 # 传递请求头和用户信息 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; # 支持 WebSocket 等长连接 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }部署完成后，请确认证书路径及域名配置正确，然后通过 docker-compose 启动服务，验证 HTTP 和 HTTPS 的功能是否正常工作。使用 Docker Compose 构建服务以下是优化后的 docker-compose.yml 配置，其中包含了 Nginx、PHP-Apache 和 PostgreSQL 服务，脱敏后的配置内容如下：version: '3.9' services: nginx-dmz: image: nginx:latest container_name: nginx-dmz restart: always ports: - "80:80" - "443:443" volumes: - ./nginx/logs:/var/log/nginx:rw # 日志目录挂载 - ./nginx/cert:/etc/nginx/cert:ro # 证书目录挂载 - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # 主配置文件只读挂载 - ./nginx/conf.d:/etc/nginx/conf.d:rw # 其他配置文件目录挂载 depends_on: - typecho - db networks: - app-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 10s timeout: 5s retries: 3 start_period: 30s typecho: image: php:7.4-apache container_name: typecho restart: always volumes: - ./typecho:/var/www/html:rw # 挂载 Typecho 应用目录 networks: - app-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 10s timeout: 3s retries: 3 start_period: 30s db: image: postgres:15-alpine container_name: postgres-db restart: always environment: POSTGRES_USER: ${PGUSER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} PGDATA: /var/lib/postgresql/data/pgdata # 固定数据库数据路径 command: - postgres - -c - max_connections=${POSTGRES_MAX_CONNECTIONS} - -c - shared_buffers=${POSTGRES_SHARED_BUFFERS} - -c - work_mem=${POSTGRES_WORK_MEM} - -c - maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM} - -c - effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE} volumes: - ./postgres/data:/var/lib/postgresql/data:rw # 数据卷持久化存储 networks: - app-network healthcheck: test: ["CMD", "pg_isready", "-U", "${PGUSER}"] interval: 10s timeout: 5s retries: 5 networks: app-network: driver: bridge # 使用自定义 bridge 网络以下是优化后的博客内容片段，改进了语言流畅性、逻辑清晰性，并增强了可读性：配置数据库在按照上述步骤启动应用后，通过访问 80 或 443 端口，默认情况下可能仅支持 SQLite 数据库。如果需要使用 MySQL 或 PostgreSQL，需确保 PHP 环境安装了相应的数据库扩展（例如 pdo_mysql 或 pdo_pgsql）。 为支持多种数据库类型，可以通过修改 Dockerfile 来添加必要的 PHP 扩展，并重新构建镜像。以下是一个示例：Dockerfile 示例# 使用指定版本的 PHP 基础镜像 FROM php:7.4-apache # 更新包管理器并安装所需依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ libpq-dev \ zlib1g-dev \ libzip-dev \ zip \ unzip \ nginx \ && docker-php-ext-install \ pdo \ pdo_pgsql \ pdo_mysql \ mysqli \ pgsql \ zip \ && apt-get clean && rm -rf /var/lib/apt/lists/*构建镜像使用以下命令构建自定义 PHP 镜像：docker build -t custom-php:7.4-apache -f Dockerfile .启动数据库容器修改自定义镜像在docker-compose中的typecho服务的镜像，并重新启动运行，然后访问 Typecho 的安装页面，完成数据库连接配置即可。至此，Typecho 博客平台已成功搭建完成！赶快开始探索 Typecho 的更多功能吧。
服务器Web目录通常是指Web服务器（如Apache、Nginx等）用于存放和提供网站文件的根目录。这个目录被配置为提供静态文件或动态内容，并对外部用户开放访问。理解服务器Web目录的概念、设置方法和最佳实践有助于确保Web应用程序的安全性、性能和可维护性。1. Web目录的定义和作用服务器Web目录是一个指定的文件系统路径，Web服务器会从这里开始根据请求路径查找并提供资源。例如，当用户请求网站的首页时，Web服务器会在Web目录中寻找并返回默认的主页文件（如 index.html 或 index.php）。Web目录通常包含各种网站资源，例如HTML文件、CSS、JavaScript、图像、音频、视频文件，以及服务器端脚本（如PHP文件）。Web目录的核心作用包括：资源管理和共享：Web目录集中存放网站文件，使得管理和分享资源变得更简单。文件访问的标准化路径：通过URL路径与文件系统路径的映射，用户可以方便地通过统一的URL访问资源。基于访问权限的文件控制：Web服务器通常通过配置文件对Web目录的访问进行权限控制，防止未经授权的访问。2. 配置Web目录在不同的Web服务器中，Web目录的配置方式略有不同。下面是常见服务器的配置方法：Apache在Apache中，Web目录的根路径通过 DocumentRoot 指令指定。在配置文件中可以设置类似如下内容：DocumentRoot "/var/www/html"配置之后，所有请求将从 /var/www/html 目录开始查找文件。如果你设置了虚拟主机，可以为每个虚拟主机指定不同的Web目录：<VirtualHost *:80> ServerName example.com DocumentRoot "/var/www/example.com/public" </VirtualHost>Nginx在Nginx中，Web目录由 root 指令指定，通常在 server 块中配置：server { listen 80; server_name example.com; root /var/www/example.com/public; index index.html index.htm; }Nginx会在该目录中查找并返回客户端请求的文件资源。3. Web目录的结构和常见文件Web目录结构通常由以下文件和子目录组成：HTML 文件：存放网页内容文件，例如 index.html、about.html。CSS 文件：存放样式表文件，一般放在 css 文件夹中。JavaScript 文件：存放脚本文件，一般放在 js 文件夹中。图像文件：存放站点所需图像，一般放在 images 文件夹中。动态内容文件：例如 .php、.asp、.jsp 文件，用于生成动态内容。配置文件：例如 .htaccess（在Apache中用于设置目录权限、重定向等配置）。一个典型的Web目录结构如下：/var/www/example.com/public ├── index.html ├── css/ │ └── style.css ├── js/ │ └── app.js ├── images/ │ └── logo.png └── .htaccess4. Web目录的安全性为了防止未经授权的访问和文件泄露，建议在配置Web目录时注意以下安全措施：限制访问权限：设置适当的文件和目录权限，避免不必要的读写权限，防止用户上传和访问不应公开的文件。屏蔽目录列表：防止用户通过URL直接访问目录而显示文件列表。可以通过 Options -Indexes（在Apache中）或 autoindex off（在Nginx中）来关闭目录列表功能。配置防护规则：限制对敏感文件的访问，例如 .env、.htaccess、配置文件等，防止这些文件被公开访问。防止跨站脚本和注入攻击：在Web应用程序中实现输入过滤和验证，避免攻击者利用漏洞获取文件系统中的敏感信息。5. Web目录的常见位置在不同的操作系统和Web服务器上，默认Web目录位置可能会有所不同，以下为常见位置：Linux 系统：通常放在 /var/www/ 或 /usr/share/nginx/html 目录下。Windows 系统：可以设置在 C:\inetpub\wwwroot\（IIS服务器）或任何自定义路径。Web目录的路径可以根据需要进行调整，以便更好地组织网站文件和提高可维护性。6. Web目录的访问控制可以通过在Web服务器配置文件中使用以下指令或模块来控制访问：（Apache）：对指定目录设置访问控制。例如：<Directory "/var/www/html"> AllowOverride None Require all granted </Directory>location（Nginx）：控制特定路径的访问。例如：location /admin/ { deny all; }.htaccess 文件（Apache）：可以用来控制子目录的权限或进行其他设置。注意，这种方式仅适用于Apache服务器。7. Web目录的最佳实践目录分离：将静态资源（CSS、JS、图像等）与动态内容（PHP、Python等后端代码）分开存放，提高文件管理效率。版本控制：使用Git等工具对Web目录的代码和文件进行版本控制，方便追溯和管理文件的历史变更。缓存机制：合理设置文件缓存，减少服务器请求负担，提升页面加载速度。目录清理：定期清理和更新Web目录中的文件，移除不再使用的文件以保持整洁，并降低安全风险。8. 总结Web目录是Web服务器提供文件的根路径，合理设置和管理Web目录可以提高网站的安全性、性能和维护效率。通过控制目录权限、调整目录结构和使用适当的配置规则，可以有效防止文件泄露、目录列表暴露等常见安全问题。
我已经酝酿搭建一个博客很久了。机缘巧合之下，我尝试用 WordPress 来创建网站，并由此正式踏上了博客搭建的选型之路。鉴于当今大模型的知识面极其广泛，我首先通过大模型获取了相关资讯，并结合自身需求，最终选择了 Typecho 作为我的博客平台。为什么选择 Typecho？结合大模型的反馈，我了解到几种常见的博客平台，它们各有特色和独特优势。下面是一些平台及其特点的简要概述：WordPress - 官方网站Ghost - 官方网站Hexo - 官方文档Hugo - 官方文档Jekyll - 官方文档Medium - 官方文档Typecho - 官方文档Vercel + Next.js - 官方文档Halo - 官方文档平台选择简析Halo Halo 是国内知名的开源博客平台，页面设计美观大方，是很多用户搭建博客的不二之选。功能强大且易用，适合多数人的需求。WordPress 我最初接触建站工具时就是从 WordPress 开始的。它功能非常强大，支持多种插件和主题，适合多文章、多站点的需求。然而，WordPress 不支持 Markdown 语法，我认为它更适合搭建官方展示类网站。对于个人博客来说，WordPress 功能略显复杂，而我更倾向于简洁的开发者风格。Ghost / Medium 这两个平台都是国外知名的建站工具，动画特效酷炫，并且支持云托管等特性。不过，由于它们对中文支持不够友好，我没有选择它们。Hexo / Hugo Hexo 基于 Node.js，Hugo 基于 Go 语言。这两个平台主要面向开发者，并且对部署有一定要求。Hugo 主要为英文用户设计，Hexo 虽支持中文，但我更倾向于使用后端技术处理博客需求。Jekyll Jekyll 是基于 Ruby 语言的静态网站生成器。我对 Ruby 有一定兴趣，但发现 Jekyll 已经多年未更新维护，遂放弃了这一选择。Next.js 大模型的建议中提到 Next.js，但我认为它更适合应用搭建，而非博客平台。虽然用 Next.js 搭建博客也可行，但并非我的优先选择。最终选择：Typecho最终，我选择了 Typecho 作为博客平台。Typecho 原生支持 Markdown，界面简洁，风格类似于我常用的 Markdown 编辑器 Typora，这符合我对简单、直观的需求。接下来，我会进一步研究和探索该平台的使用，敬请期待后续文章更新！附件：大模型的回复内容常见的博客搭建平台有很多，不同平台各有优缺点，适合不同用户需求。以下是一些常见的博客平台以及它们的优劣分析，特别是对Markdown支持的情况。1. WordPress概述：WordPress 是目前全球最受欢迎的博客平台，分为 WordPress.com（托管版本）和 WordPress.org（自托管版本）。优点：插件丰富：有大量插件可以扩展功能，适合定制需求多的用户。SEO友好：内置SEO工具和大量SEO插件。社区活跃：有广泛的用户社区，资源丰富，问题容易找到解决方法。缺点：维护成本：自托管版本需要服务器、域名以及对技术的了解，维护成本较高。性能瓶颈：功能多的插件组合可能导致网站变慢。Markdown支持：原生不支持Markdown，但可以通过插件（如 Jetpack）实现。2. Ghost概述：Ghost 是一个基于 Node.js 的博客平台，界面简洁，专注于写作体验。优点：性能优越：基于 Node.js 构建，性能高效，适合对速度要求高的用户。Markdown支持好：原生支持Markdown，编写体验非常流畅。SEO和社交分享优化：内置SEO和社交分享功能，不需要额外插件。缺点：部署难度较高：自托管版本的安装配置较复杂，需要一定的Node.js环境经验。成本较高：托管版价格偏高，不适合个人和预算有限的用户。Markdown支持：原生支持，写作体验流畅。3. Hexo概述：Hexo 是一个基于 Node.js 的静态博客生成器，适合程序员使用。优点：静态文件：生成的博客是静态文件，加载速度快且安全。自定义强大：可以使用主题和插件，支持高度定制。免费使用：作为开源项目，Hexo 是免费的，可以部署在 GitHub Pages 等免费平台上。缺点：学习成本高：对技术要求较高，初学者上手较难。需要手动部署：每次更新内容都需要重新生成并部署。Markdown支持：原生支持Markdown，编写体验很好。4. Hugo概述：Hugo 是一个使用 Go 语言编写的静态博客生成器，以构建速度著称。优点：生成速度快：编译速度非常快，即使是大型博客也能瞬间生成。支持多语言：内置多语言支持，适合多语种博客。主题丰富：提供了很多主题，易于切换和定制。缺点：学习曲线：对于非技术人员来说，上手有难度。需要部署平台：需要服务器或托管服务，部署更新需自行处理。Markdown支持：原生支持Markdown，支持各类Markdown拓展，适合写作。5. Jekyll概述：Jekyll 是 GitHub 推出的静态网站生成器，适合程序员和对技术感兴趣的用户。优点：与 GitHub Pages 无缝集成：可以免费托管在 GitHub Pages 上，方便省事。社区活跃：Jekyll 有较大的用户社区，资源和插件丰富。自由度高：支持自定义主题和插件，适合有技术背景的用户。缺点：更新体验一般：每次更新内容都需要重新生成静态文件并上传。适用范围有限：主要适合技术类、个人或小型网站，不适合大型企业站点。Markdown支持：原生支持Markdown，写作体验流畅。6. Medium概述：Medium 是一个简洁的写作平台，专注于内容创作和分享。优点：简单易用：无需技术背景，开箱即用，适合快速发布内容。社交分享：内置社交功能，文章容易获得关注。美观排版：界面简洁美观，默认的排版效果好。缺点：自由度有限：功能较少，不适合需要自定义的用户。付费阅读：部分文章设有阅读限制，不利于全部内容免费推广。Markdown支持：不直接支持Markdown，但可以将Markdown内容复制粘贴进编辑器，会自动转换格式。7. Typecho概述：Typecho 是国内开发的一款轻量级博客系统，简单易用。优点：轻量级：系统轻量，安装简单，适合入门用户。插件支持：提供基本的插件支持，可以扩展部分功能。免费：开源项目，不需要费用。缺点：功能较少：不如 WordPress 等平台功能丰富，适合对功能要求较少的用户。社区小：资源较少，相对主流平台来说，扩展性有限。Markdown支持：可以通过插件支持Markdown，需手动配置。8. Vercel + Next.js概述：通过 Next.js 和 Vercel 的结合，可以构建静态和动态混合的博客。优点：高性能：支持静态生成和动态内容，适合内容更新频繁的网站。前端框架强大：Next.js 是强大的 React 框架，前端可实现复杂交互。支持 Markdown：可结合 Markdown 文件来生成内容，非常灵活。缺点：开发门槛高：需要掌握 React 和 Next.js，适合有前端开发经验的用户。非专用博客系统：需要自行实现部分功能，不如专用博客系统便捷。Markdown支持：可以灵活支持 Markdown，适合程序员和技术博主。总结如果你偏好使用 Markdown 进行编写，推荐以下平台：Ghost 和 Hexo：原生支持 Markdown，且对写作体验的优化较好。Hugo 和 Jekyll：静态网站生成器，原生支持 Markdown，适合技术型用户。Vercel + Next.js：适合有前端经验的用户，可以灵活集成 Markdown 支持。这些平台不仅支持 Markdown，还在性能、速度和自定义方面提供了不错的选择。