banner
子文

子文

世界,你好鸭~
x
github

30分鐘建成一個個人博客

wordpress 是廣為人知的內容管理系統,而 docker 可以打包應用以及依賴包到一個輕量級、可移植的容器中,然後發布到任何流行的 Linux 機器上,兩者的結合讓建站只需要簡單的幾步配置。

購買實例(伺服器)#

阿里雲、騰訊雲、華為雲、亞馬遜雲、谷歌雲等等地方都可以購買雲伺服器,其中谷歌和亞馬遜都有試用一年的套餐,而阿里、騰訊、華為的新用戶和校園用戶也有許多折扣,小夥伴們可以自行挑選合適的套餐購買。

安裝 docker 和 docker-compose#

這裡可以直接在購買伺服器的時候選擇含有 docker 的鏡像,如果沒有也可以在控制台中找到更換操作系統(或更換鏡像)來換一個帶有 docker 的鏡像,如果還是沒有可以通過以下方法安裝:

# 安裝docker
sudo curl -sSL https://get.daocloud.io/docker | sh

# 安裝docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

創建持久化目錄#

docker 容器一旦銷毀後,容器內的數據就會丟失,為了避免這種事情的發生,我們一般會通過掛載卷的方式來持久化這些數據:

# 切換到安裝目錄
cd ~

# 創建掛載所需的目錄
## 創建mysql配置目錄
mkdir db
## 創建mysql數據目錄
mkdir db_data
## 創建wordpress文件目錄
mkdir wordpress_data
## 創建nginx文件目錄
mkdir nginx

# 創建必備配置文件
## 創建mysql配置文件
cat > ./db/mysql.cnf << EOF
[mysqld]
explicit_defaults_for_timestamp=true
wait_timeout=86400
interactive_timeout=7200
EOF
## 創建nginx配置文件

### 先啟動一個ngninx的鏡像
sudo docker run -it -d --name nginx nginx:latest
### 將容器內的/etc/nginx目錄拷貝到本地
sudo docker cp nginx:/etc/nginx ./nginx/conf
### 將容器內的/usr/share/nginx/html目錄拷貝到本地
sudo docker cp nginx:/usr/share/nginx/html ./nginx/html
### 創建ngnix的日誌目錄
mkdir ./nginx/log
### 文件拷貝完畢移除ngnix鏡像
sudo docker stop nginx
sudo docker rm nginx

配置 docker-compose.yml#

vi docker-compose.yml

文件內容如下

version: '3'
services:
  nginx:
    image: nginx:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf:/etc/nginx:ro
      - ./nginx/html:/usr/share/nginx/html:rw
      - ./nginx/log:/var/log/nginx:rw
      - ./nginx/ssl:/etc/ssl:ro

  wpdatabase:
    image: mysql:latest
    volumes:
      - ./db_data:/var/lib/mysql
      - ./db/mysql.cnf:/etc/my.cnf
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root # 數據庫管理員密碼,推薦改為強密碼
      MYSQL_DATABASE: wordpress # wordpress數據庫
      MYSQL_USER: wordpress # wordpress用戶
      MYSQL_PASSWORD: wordpress # wordpress用戶的密碼,推薦改為強密碼

  wordpress:
    depends_on:
      - wpdatabase
    image: wordpress:latest
    volumes:
      - ./wordpress_data:/var/www/html
    restart: always
    environment:
      WORDPRESS_DB_HOST: wpdatabase:3306
      WORDPRESS_DB_USER: wordpress # 上面配置的mysql用戶
      WORDPRESS_DB_PASSWORD: wordpress # 上面配置的mysql用戶的密碼

啟動容器#

sudo docker-compose up -d

修改 ngnix 配置文件#

經過上面的配置,我們可以通過sudo docker ps看到容器已經啟動了,但是 nginx 還沒配置好代理,所以還無法直接訪問到 wordpress 的頁面,我們只需要創建一個配置文件即可:

# 創建nginx配置文件
vi ./nginx/conf/conf.d/wordpress.conf

i鍵進入編輯模式,將以下內容更改後粘貼:

server {
  listen 80;
  server_name x.x.x.x; # 此處修改為你的主機IP

  location / {
    proxy_pass http://wordpress;
    proxy_redirect off;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    # 轉發host信息
    proxy_set_header Host $host;
  }
}

:後輸入wq!保存文件即可

重啟 nginx 容器並訪問網站#

sudo docker-compose restart nginx

此時直接訪問伺服器 IP 地址即可訪問 wordpress,如果出現了錯誤,可以使用tail -f ./nginx/log/error.log查看錯誤日誌

進階配置#

建站一條龍服務#

上述的方法只能在伺服器上簡單部署一個 wordpress 應用,別人可以用公網 IP 去訪問你的頁面,但這不合規也不安全,一個完整的建站流程還包括域名註冊、網站備案、公安備案、DNS 解析、SSL 證書簽發等等,以上步驟都可以在雲服務廠商獲取一條龍服務,其中域名註冊是收費的,其他環節都有免費方案,需要注意的是網站備案需要近 20 天左右的審批時間。

SSL 證書配置#

在雲服務廠商那獲取免費的 ssl 證書後上傳到伺服器,並將.crt 和.key 文件拷貝到./nginx/conf 目錄中,並生成將 mozilla 的 pem 文件:

# 拷貝ssl證書文件
cp /path/to/xxx.crt ./nginx/conf
cp /path/to/xxx.key ./nginx/conf

# 生成mozilla的pem文件
curl https://ssl-config.mozilla.org/ffdhe2048.txt > ./nginx/conf/dhparam.pem

按標記的註釋對./nginx/conf/conf.d/wordpress.conf 進行文件修改:

# generated 2022-03-24, Mozilla Guideline v5.6, nginx 1.17.7, OpenSSL 1.1.1k, intermediate configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1k&guideline=5.6

server {
    listen 80;
    listen [::]:80;

    server_name _;
    server_name yangziwen.cn www.yangziwen.cn; # 這裡改為自己的域名

    location / {
        return 301 https://yangziwen.cn$request_uri; # 這裡改為自己的域名
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name yangziwen.cn www.yangziwen.cn; # 這裡改為自己的域名

    location / {
      proxy_pass http://wordpress;

          proxy_http_version    1.1;
          proxy_cache_bypass    $http_upgrade;

          proxy_set_header Upgrade            $http_upgrade;
          proxy_set_header Connection         "upgrade";
          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_set_header X-Forwarded-Host    $host;
          proxy_set_header X-Forwarded-Port    $server_port;
    }

    ssl_certificate xxx.crt; # 這裡改為自己的ssl證書
    ssl_certificate_key xxx.key; # 這裡改為自己的ssl證書密鑰
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;
    
    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    ssl_dhparam dhparam.pem;

    # intermediate configuration
    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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate xxx.crt; # 這裡改為自己的ssl證書

    # replace with the IP address of your resolver
    resolver 8.8.8.8;
    
    location ~* /xmlrpc.php {
        deny all;
    }

    if ( $fastcgi_script_name ~ \..*\/.*php ) {
        return 403;
    }

    if ($request_method !~ ^(GET|PUT|HEAD|POST|OPTIONS)$ ) {
        return 444;
    }

}

以上的配置模板是由https://ssl-config.mozilla.org/生成的,並進行了一些簡單的安全加固,接下來重啟 ngnix 即可直接通過 https 訪問自己的站點了

sudo docker-compose restart nginx

此時可以在https://myssl.com/中對自己的站點進行 HTTPS 評級,以上配置的分數為 A+,如果不是可能是因為之前首頁上通過 http 引用了圖片等資源,改為 https 引用即可

nginx 安全加固#

在 ssl 配置中我們已經對 nginx 做了部分加固,還有一些配置需要在./nginx/conf/nginx.conf 中進行配置,將文件進行如下修改,主要是禁止了 http 和直接使用 ip 訪問


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;
    #隱藏 Nginx 的版本號,提高安全性。
    server_tokens off;
    #隱藏 PHP 版本
    fastcgi_hide_header X-Powered-By;
    proxy_hide_header X-Powered-By;
    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;

    include /etc/nginx/conf.d/*.conf;
    server {
        listen 80 default;
        server_name _;
        return 444; #防止通過ip訪問網站
        location ~* \.(rar|zip|gz|tar|tgz|tar.gz|7z|z|bz2|tar.bz2|sql|log|rar|ini|bak|conf|DS_Store|idea|swp|svn|entries|git|config)$ {
            deny all;
        }
        autoindex off;
        include vhost/*.conf;
    }
}                                                   

重啟 nginx:

sudo docker-compose restart nginx

wordpress 安全加固#

強烈建議站點建好後立馬安裝 Wordfence 插件,並開啟雙因子鑑權(Two-Factor Authentication),我在建好站等備案期間已經通過 Wordfence 插件攔截了許多嘗試登錄 admin 賬號和訪問敏感接口的行為

伺服器安全加固#

一般購買雲伺服器後廠商會贈送最基本的安全掃描,新建的實例需要及時按照掃描結果將一些敏感軟件(如 openssh)更新到最新版本,以免存在漏洞

ssh 是我們登錄伺服器最常用的方式,也是黑客最愛的入口之一,新建實例後我們應該盡快進行以下兩點配置:

  1. 新建密鑰,並將伺服器實例與密鑰關聯,具體方式可以參考雲服務廠商的說明。新建密鑰後我們登錄實例就不需要再輸密碼了,只要在 ssh 客戶端配置好自己的私鑰即可連接實例,唯一需要注意的是要避免私鑰的洩露,私鑰一旦洩露或丟失需要及時到雲服務的用戶管理中心去刪除原始密鑰並創建新的密鑰
  2. 修改伺服器防火牆。進入雲伺服器的管理頁面,修改防火牆,只要保留 80,443,ICMP 端口的訪問即可,對於 22 端口如果不嫌麻煩的最好只留需要 ssh 登錄的源端 ip 地址即可,不過像使用電信,移動寬帶的用戶,ip 在一段時間或者重啟路由器後會變,此時如果 ssh 連接不上大概率是 ip 地址更新導致的。對於 ip 在一個固定網段的用戶,可以通過子網掩碼來劃定 ip 範圍,就是 ip 後面的 / 24,/16,/8 這些

SEO 配置#

我們搭建好自己心愛的網站後,肯定希望盡快被志同道合的基友看到,這時 SEO(搜索引擎優化)就起到了很大的幫助。在 wordpress 中我們可以通過一些插件即可方便地配置 SEO,我用的是 Yoast SEO 這款插件,安裝好後可以根據插件提示做一些簡單配置。

sitemap(站點地圖)是 SEO 相當重要的一部分,Yoast 的站點地圖是收費功能,我們可以安裝 WP Sitemap Page 插件來生成一個簡單的站點地圖,通過域名/sitemap_index.xml即可訪問,這是一個索引文件,點開後會有各種類型的索引,每個索引裡面具有對應的 url 鏈接,這些鏈接基本涵蓋了我們網站所有對外顯示的內容。通過將這些 xml 索引推給百度、谷歌、必應的站長工具,就可以讓搜索引擎快速收錄我們的站點,以下是這些站長工具的地址

配置方法也很簡單,首先是站點關聯,有各種關聯方式,按照說明選一個配置就行。其次每個站長工具中都有站點地圖的上傳,谷歌和必應在菜單欄中就能看到,百度的在普通收錄裡面有個 sitemap 上傳,只要將 sitemap_index.xml 中所有 xml 的鏈接提交即可。

提交完站點地圖之後,只要等各大搜索引擎去爬取站點地圖中的 url 即可,這裡不得不誇讚一下谷歌的速度,錄完第二天就能在 pc 端搜到自己網站的內容了,而百度,著實讓人有點著急。
robots.txt 是一種爬蟲協議,他們告訴搜索引擎的爬蟲哪些能爬哪些不能爬,一份良好的 robots.txt 能夠讓爬蟲快速發現你想要展示的頁面,wordpress 默認有一個 robots.txt 配置了簡單的屏蔽 wp-admin 的策略,我們可以為其加上 sitemap 的地址,讓爬蟲更快地發現 sitemap。首先進入./wordpress_data創建robots.txt文件,添加Sitemap: https://域名/站點地圖名.xml, 然後訪問https://域名/robots.txt生效即可。

參考鏈接#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。