{"id":442682,"date":"2026-06-02T15:47:04","date_gmt":"2026-06-02T07:47:04","guid":{"rendered":"https:\/\/idc.net\/help\/?p=442682"},"modified":"2026-06-02T15:47:04","modified_gmt":"2026-06-02T07:47:04","slug":"%e5%9c%a8%e9%a6%99%e6%b8%afvps%e4%b8%8a%e7%94%a8docker%e4%b8%80%e9%94%ae%e9%83%a8%e7%bd%b2wordpress%ef%bc%9anginx-ssl%e5%85%a8%e9%85%8d%e7%bd%ae%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/idc.net\/help\/442682\/","title":{"rendered":"\u5728\u9999\u6e2fVPS\u4e0a\u7528Docker\u4e00\u952e\u90e8\u7f72WordPress\uff1aNginx + SSL\u5168\u914d\u7f6e\u6559\u7a0b"},"content":{"rendered":"<p>Docker\u8ba9WordPress\u7684\u90e8\u7f72\u53d8\u5f97\u6807\u51c6\u5316\u3001\u53ef\u590d\u5236\uff0c\u5f7b\u5e95\u544a\u522b\"\u5728\u8fd9\u53f0\u670d\u52a1\u5668\u80fd\u8dd1\uff0c\u6362\u4e00\u53f0\u5c31\u51fa\u95ee\u9898\"\u7684\u56f0\u5883\u3002\u672c\u6587\u57fa\u4e8e\u9999\u6e2fVPS\uff0c\u5e26\u4f60\u5b8c\u6210Docker + Nginx + SSL\u7684\u5b8c\u6574WordPress\u90e8\u7f72\u3002<\/p>\n<h2>\u4e00\u3001\u73af\u5883\u51c6\u5907<\/h2>\n<h3>\u670d\u52a1\u5668\u8981\u6c42<\/h3>\n<ul>\n<li>\u64cd\u4f5c\u7cfb\u7edf\uff1aUbuntu 22.04 LTS\uff08\u63a8\u8350\uff09<\/li>\n<li>\u914d\u7f6e\uff1a\u6700\u4f4e1\u68382G\uff0c\u5efa\u8bae2\u68382G\u4ee5\u4e0a<\/li>\n<li>\u5df2\u5b8c\u6210\u57df\u540d\u89e3\u6790\uff0c\u57df\u540dA\u8bb0\u5f55\u6307\u5411\u670d\u52a1\u5668IP<\/li>\n<\/ul>\n<h3>\u5b89\u88c5Docker\u4e0eDocker Compose<\/h3>\n<pre><code># \u66f4\u65b0\u5305\u7ba1\u7406\u5668\r\napt update &amp;&amp; apt upgrade -y\r\n\r\n# \u5b89\u88c5Docker\r\ncurl -fsSL https:\/\/get.docker.com | sh\r\n\r\n# \u5b89\u88c5Docker Compose\u63d2\u4ef6\r\napt install docker-compose-plugin -y\r\n\r\n# \u9a8c\u8bc1\u5b89\u88c5\r\ndocker --version\r\ndocker compose version<\/code><\/pre>\n<h2>\u4e8c\u3001\u521b\u5efa\u9879\u76ee\u76ee\u5f55\u7ed3\u6784<\/h2>\n<pre><code>mkdir -p \/srv\/wordpress\/{nginx,certbot\/conf,certbot\/www}\r\ncd \/srv\/wordpress<\/code><\/pre>\n<h2>\u4e09\u3001\u7f16\u5199 docker-compose.yml<\/h2>\n<pre><code>version: '3.8'\r\n\r\nservices:\r\n  db:\r\n    image: mysql:8.0\r\n    restart: always\r\n    environment:\r\n      MYSQL_DATABASE: wordpress\r\n      MYSQL_USER: wpuser\r\n      MYSQL_PASSWORD: \u4f60\u7684\u6570\u636e\u5e93\u5bc6\u7801\r\n      MYSQL_ROOT_PASSWORD: \u4f60\u7684Root\u5bc6\u7801\r\n    volumes:\r\n      - db_data:\/var\/lib\/mysql\r\n\r\n  wordpress:\r\n    image: wordpress:php8.1-fpm\r\n    restart: always\r\n    depends_on:\r\n      - db\r\n    environment:\r\n      WORDPRESS_DB_HOST: db\r\n      WORDPRESS_DB_USER: wpuser\r\n      WORDPRESS_DB_PASSWORD: \u4f60\u7684\u6570\u636e\u5e93\u5bc6\u7801\r\n      WORDPRESS_DB_NAME: wordpress\r\n    volumes:\r\n      - wp_data:\/var\/www\/html\r\n\r\n  nginx:\r\n    image: nginx:alpine\r\n    restart: always\r\n    ports:\r\n      - \"80:80\"\r\n      - \"443:443\"\r\n    volumes:\r\n      - wp_data:\/var\/www\/html\r\n      - .\/nginx:\/etc\/nginx\/conf.d\r\n      - .\/certbot\/conf:\/etc\/letsencrypt\r\n      - .\/certbot\/www:\/var\/www\/certbot\r\n    depends_on:\r\n      - wordpress\r\n\r\n  certbot:\r\n    image: certbot\/certbot\r\n    volumes:\r\n      - .\/certbot\/conf:\/etc\/letsencrypt\r\n      - .\/certbot\/www:\/var\/www\/certbot\r\n\r\nvolumes:\r\n  db_data:\r\n  wp_data:<\/code><\/pre>\n<h2>\u56db\u3001\u914d\u7f6eNginx<\/h2>\n<p>\u521b\u5efa\u6587\u4ef6 <code>\/srv\/wordpress\/nginx\/wordpress.conf<\/code>\uff1a<\/p>\n<pre><code>server {\r\n    listen 80;\r\n    server_name \u4f60\u7684\u57df\u540d www.\u4f60\u7684\u57df\u540d;\r\n\r\n    location \/.well-known\/acme-challenge\/ {\r\n        root \/var\/www\/certbot;\r\n    }\r\n\r\n    location \/ {\r\n        return 301 https:\/\/$host$request_uri;\r\n    }\r\n}\r\n\r\nserver {\r\n    listen 443 ssl;\r\n    server_name \u4f60\u7684\u57df\u540d www.\u4f60\u7684\u57df\u540d;\r\n\r\n    ssl_certificate \/etc\/letsencrypt\/live\/\u4f60\u7684\u57df\u540d\/fullchain.pem;\r\n    ssl_certificate_key \/etc\/letsencrypt\/live\/\u4f60\u7684\u57df\u540d\/privkey.pem;\r\n\r\n    root \/var\/www\/html;\r\n    index index.php;\r\n\r\n    location \/ {\r\n        try_files $uri $uri\/ \/index.php?$args;\r\n    }\r\n\r\n    location ~ \\.php$ {\r\n        fastcgi_pass wordpress:9000;\r\n        fastcgi_index index.php;\r\n        include fastcgi_params;\r\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\r\n    }\r\n\r\n    location ~* \\.(jpg|jpeg|png|gif|ico|css|js|webp)$ {\r\n        expires 30d;\r\n        add_header Cache-Control \"public, no-transform\";\r\n    }\r\n\r\n    client_max_body_size 64M;\r\n}<\/code><\/pre>\n<h2>\u4e94\u3001\u7533\u8bf7SSL\u8bc1\u4e66<\/h2>\n<pre><code># \u5148\u542f\u52a8Nginx\uff08\u4ec5HTTP\u6a21\u5f0f\uff09\r\ndocker compose up -d nginx\r\n\r\n# \u7533\u8bf7Let's Encrypt\u8bc1\u4e66\r\ndocker compose run --rm certbot certonly \\\r\n  --webroot \\\r\n  --webroot-path=\/var\/www\/certbot \\\r\n  -d \u4f60\u7684\u57df\u540d \\\r\n  -d www.\u4f60\u7684\u57df\u540d \\\r\n  --email \u4f60\u7684\u90ae\u7bb1 \\\r\n  --agree-tos \\\r\n  --no-eff-email<\/code><\/pre>\n<h2>\u516d\u3001\u542f\u52a8\u5168\u90e8\u670d\u52a1<\/h2>\n<pre><code>docker compose up -d\r\n\r\n# \u67e5\u770b\u8fd0\u884c\u72b6\u6001\r\ndocker compose ps\r\n\r\n# \u67e5\u770b\u65e5\u5fd7\r\ndocker compose logs -f<\/code><\/pre>\n<p>\u8bbf\u95ee <code>https:\/\/\u4f60\u7684\u57df\u540d<\/code>\uff0c\u5373\u53ef\u770b\u5230WordPress\u5b89\u88c5\u5411\u5bfc\u3002<\/p>\n<h2>\u4e03\u3001\u81ea\u52a8\u7eed\u7b7eSSL\u8bc1\u4e66<\/h2>\n<p>Let's Encrypt\u8bc1\u4e66\u6709\u6548\u671f90\u5929\uff0c\u6dfb\u52a0\u5b9a\u65f6\u4efb\u52a1\u81ea\u52a8\u7eed\u7b7e\uff1a<\/p>\n<pre><code># \u7f16\u8f91crontab\r\ncrontab -e\r\n\r\n# \u6dfb\u52a0\u4ee5\u4e0b\u884c\uff08\u6bcf\u5929\u51cc\u66683\u70b9\u68c0\u67e5\u5e76\u7eed\u7b7e\uff09\r\n0 3 * * * cd \/srv\/wordpress &amp;&amp; docker compose run --rm certbot renew &amp;&amp; docker compose exec nginx nginx -s reload<\/code><\/pre>\n<h2>\u516b\u3001\u6570\u636e\u5907\u4efd\u7b56\u7565<\/h2>\n<pre><code># \u5907\u4efd\u6570\u636e\u5e93\r\ndocker compose exec db mysqldump -u root -p\u4f60\u7684Root\u5bc6\u7801 wordpress &gt; backup_$(date +%Y%m%d).sql\r\n\r\n# \u5907\u4efdWordPress\u6587\u4ef6\r\ndocker run --rm -v wordpress_wp_data:\/data -v $(pwd):\/backup \\\r\n  alpine tar czf \/backup\/wp_files_$(date +%Y%m%d).tar.gz \/data<\/code><\/pre>\n<h2>\u4e5d\u3001\u603b\u7ed3<\/h2>\n<p>Docker\u90e8\u7f72WordPress\u7684\u6700\u5927\u4f18\u52bf\u662f\uff1a\u73af\u5883\u4e00\u81f4\u3001\u8fc1\u79fb\u65b9\u4fbf\u3001\u7248\u672c\u53ef\u63a7\u3002\u6574\u4e2a\u90e8\u7f72\u8fc7\u7a0b\u7ea630\u5206\u949f\uff0c\u540e\u7eed\u7ef4\u62a4\u6210\u672c\u6781\u4f4e\u3002IDC.Net\u7684<a href=\"https:\/\/idc.net\/cloud-hk\/\">\u9999\u6e2fVPS<\/a>\u9ed8\u8ba4\u5b89\u88c5Ubuntu 22.04\uff0c\u5b8c\u7f8e\u652f\u6301Docker\uff0c\u5f00\u7bb1\u5373\u7528\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Docker\u8ba9WordPress\u7684\u90e8\u7f72\u53d8\u5f97\u6807\u51c6\u5316\u3001\u53ef\u590d\u5236\uff0c\u5f7b\u5e95\u544a\u522b\"\u5728\u8fd9\u53f0\u670d\u52a1\u5668\u80fd\u8dd1\uff0c\u6362\u4e00\u53f0\u5c31\u51fa\u95ee\u9898\"\u7684\u56f0\u5883\u3002 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[202648],"tags":[],"class_list":["post-442682","post","type-post","status-publish","format-standard","hentry","category-hkvps"],"_links":{"self":[{"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/posts\/442682","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/comments?post=442682"}],"version-history":[{"count":1,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/posts\/442682\/revisions"}],"predecessor-version":[{"id":442683,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/posts\/442682\/revisions\/442683"}],"wp:attachment":[{"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/media?parent=442682"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/categories?post=442682"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/tags?post=442682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}