跳至内容

Linux中自建WordPress站点

Karson Zhong · Posted on 2023-04-02 · 29 Views

2024年5月更新:本文的配置比较繁琐!想看看如何借助Docker compose一键部署WordPress吗?看看这篇文章吧!

引言

WordPress是一个功能强大的内容管理系统,易于使用和扩展,因此被广泛应用于博客、企业网站、电商平台等各类网站的建设中。本文将为大家介绍如何在Linux操作系统上,利用Nginx作为Web服务器,搭建一个基于WordPress的网站。

配置MySQL

安装Mariadb

更新包

sudo apt update

安装

sudo apt install mariadb-server

配置向导

sudo mysql_secure_installation

跟着指引走就好

测试数据库状态

sudo systemctl status mariadb

输出:

● mariadb.service - MariaDB 10.5.15 database server
     Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2022-11-18 14:33:41 CST; 4 months 13 days ago
       Docs: man:mariadbd(8)
             https://mariadb.com/kb/en/library/systemd/

创建管理员

Debian系统的MariaDB 10.5默认不使用密码,而是使用unix_socket插件进行root用户身份验证。为了方便其它软件登入,还是需要配置密码登录。
而root帐户会执行诸如日志轮换和启动/停止服务器之类的任务,最好不要更改root帐户的身份验证详细信息。

因此,建议创建一个使用密码的管理员帐户。新帐户名为admin,与root帐户具有相同的功能。在终端中打开MariaDB提示以进行操作。

sudo mariadb

注意:<password>是你的密码,不要直接复制

GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY '<password>' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;

创建数据库

sudo mariadb -u admin -p

创建数据库,db_wordpress是数据库的命名

CREATE DATABASE db_wordpress;
SHOW DATABASES;
exit;

安装PHP

每次安装php都十分痛苦,目前(2023/09/08)测试debian中能够使用的是以下方法:

sudo apt install apt-transport-https lsb-release ca-certificates wget -y
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg 
sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update

php的拓展装起来比较蛋疼,建议将这段东西保存下来,方便日后查找自己到底装了什么,也方便升级……

sudo apt install php8.2 php8.2-bcmath php8.2-cgi php8.2-cli php8.2-common php8.2-fpm php8.2-gd php8.2-mbstring php8.2-mysql php8.2-xml php8.2-zip php8.2-curl

php php-mysql php-fpm是必须的,php-cli php-common建议安装

查看安装的php及拓展

dpkg -l | grep php

安装WordPress

下载

你可能需要安装unzipsudo apt install unzip

your_site_name是你网站文件夹的名字,用于自己辨别

cd ~
wget https://wordpress.org/latest.zip
unzip -q latest.zip
mv wordpress your_site_name

配置

cd your_site_name
cp wp-config-sample.php wp-config.php
vim wp-config.php

在打开的配置文件中,修改这几处数据库配置:

define( 'DB_NAME', 'database_name_here' );
define( 'DB_USER', 'username_here' );
define( 'DB_PASSWORD', 'password_here' );

配置服务器

下载nginx

sudo apt install nginx

检查nginx运行用户

打开nginx主文件:/etc/nginx/nginx.conf
确保nginx的运行用户是有权限访问你站点的用户

user www-data;

配置http

建议在conf.d新增配置块

sudo vim /etc/nginx/conf.d/your_site_name.conf

your_site_name.conf里输入以下字段配置php后端及html服务器

注意两个配置项:

  • root 是你WordPress文件夹的路径,以本文为例是/home/[username]/your_site_name
  • server_name 是你域名,没有域名可以不填
upstream php
{
    #server unix:/run/php/php7.4-fpm.sock;
    server 127.0.0.1:9000;
}

server
{
    listen 80;
    listen [::]:80;
    charset utf-8;
    server_name www.yourdomain.com;

    root /path-to-your-wordpress-folder;

    index index.php index.html index.htm;

    client_max_body_size 64M;

    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;

    location = /robots.txt
    {
        allow all;
        log_not_found off;
        access_log off;
    }

    location /
    {
        # This is cool because no php is touched for static content.
        # include the "?$args" part so non-default permalinks doesn't break when using query string
        try_files $uri $uri/ /index.php?$args;
    }


    location ~ \.php$
    {
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        include fastcgi_params;
        #include snippets/fastcgi-php.conf;
        fastcgi_intercept_errors on;
        fastcgi_pass php;
        #The following parameter can be also included in fastcgi_params file
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$
    {
        expires max;
        log_not_found off;
    }
}

⚠注意:http并不安全
建议配置https服务器,将http重定向至https

配置https(可选)

  • ssl_certificate: 你ssl证书的地址,一般存放于/etc/ssl/...文件夹内
  • ssl_certificate_key: 你sll私钥的地址
  • ssl_verify_client: 如果你使用Cloudflare等CDN,可以取消注释设置为on,以防止CDN以外的人员直接访问。如果开启,请注意:
    • ssl_client_certificate: 客户端ssl证书,在CDN官方下载,用于识别其身份
upstream php
{
    #server unix:/run/php/php7.4-fpm.sock;
    server 127.0.0.1:9000;
}

server
{
    listen 80;
    listen [::]:80;
    charset utf-8;
    server_name www.yourdomain.com;

    return 301 https://$host$request_uri;
}

server
{
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    charset utf-8;
    server_name www.yourdomain.com;

    root /path-to-your-wordpress-folder;

    ssl_certificate /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/key.pem;
    # ssl_client_certificate /etc/ssl/cloudflare.crt;
    # ssl_verify_client on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
    ssl_session_tickets off;

    # 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;

    #root /usr/share/nginx/html;
    index index.php index.html index.htm;

    client_max_body_size 64M;

    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;

    location = /robots.txt
    {
        allow all;
        log_not_found off;
        access_log off;
    }

    location /
    {
        # This is cool because no php is touched for static content.
        # include the "?$args" part so non-default permalinks doesn't break when using query string
        try_files $uri $uri/ /index.php?$args;
    }


    location ~ \.php$
    {
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        include fastcgi_params;
        #include snippets/fastcgi-php.conf;
        fastcgi_intercept_errors on;
        fastcgi_pass php;
        #The following parameter can be also included in fastcgi_params file
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$
    {
        expires max;
        log_not_found off;
    }
}

重启nginx服务

sudo systemctl restart nginx

如果启动出现问题,请使用sudo nginx -t追踪问题

配置php-fpm

找到你的php-fpm配置文件,一般位于/etc/php/...
这里我是:

sudo vim /etc/php/8.2/fpm/pool.d/www.conf

在配置文件中找到listen = /var/run/php8.2-fpm.sock一项,将其注释,并改为socket模式:

;listen = /var/run/php8.2-fpm.sock <-- 注释
listen = 127.0.0.1:9000 <-- 与上一步nginx配置的端口一致

确保php-fpm的用户是有权限访问你站点文件夹的用户。(注意:php-fpm默认不能以root身份运行):

user = www-data
group = www-data

重启php-fpm

sudo systemctl restart php8.2-fpm

访问站点

打开浏览器,输入服务器地址,或者映射到服务器的域名(注意域名建议要和nginx中配置的一致),可以访问到WordPress站点。

配置站点

首次访问后,会出现WordPress站点的初始化界面。
按照其引导进行操作即可完成安装。

关于权限问题

如果你发现站点没有写入权限
(比如无法上传媒体库、修改语言不生效)
请确保你的nginxphp-fpm的运行用户有对wordpress站点文件夹写入的权限。

  1. 确保你的站点文件夹至少具有权限755
  2. 确保nginxphp-fpm的运行用户(默认一般为www-data)有写入权限
    • 如果你没配置过这个用户,那它是没有任何权限的
    • 你可以给予www-data写入的权限
    • 或者修改为有权限的运行用户或组:
    • nginx可以到/etc/nginx/nginx.conf文件中修改user字段
    • php-fpm可以到上面提到的同一配置文件修改usergroup字段

后续工作

  • 设置你的站点
  • 下载一个主题
  • 安装必要插件(参考我其它文章的插件推荐)
  • 导入、编写站点的内容
  • 开冲

程序员,热衷于游戏开发和软件制作。但也是一个杂食动物,喜欢探索各种赛博相关的奇技淫巧。

0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

Nova - rebirth of a wonderful theme.

Theme Nova by KarsonJo

  • Serif
  • Sans Serif
切换主题 | SCHEME TOOL
Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
0
希望看到您的想法,请您发表评论x
0
希望看到您的想法,请您发表评论x