基于LNMP的typecho博客搭建

in linux with 0 comment

2019-4-3 使用docker配置博客

用了docker重新配置了一下typecho,然后一直忘记更新。其实使用docker容器不仅能让不同应用运行在不同容器中,保证隔离。同时也是非常容易部署的,我们用docker-compose 来完成多个容器的创建和配置。
在有docker环境的基础上,运行

sudo pip install docker-compose

某些博客提供了一个docker-compose.yml配置文件,一键搞定数据库,代理和php。 为了方便学习,我对mariadb, nginx, php-fpm分别用了三个yml文件生成docker容器,文件放在三个目录里,单独使用一个目录www存放typecho博客。

首先是mariadb的docker-compose.yml

  1. 我们限定了容器所在的网络为blog_net, 原因是不同的yml生成的容器之间网络是独立的,如果不指定同一个网络,会出现容器之间无法通信的问题。(同一个yml文件生成三个应用,就不用考虑网络问题)
  2. volumes我们指定了容器内外的挂载,这样数据库的文件就可以直接在物理机上看到。
  3. 最后的网络设置也是必不可少的。参考这篇文章:Docker Compose:链接外部容器的几种方式
  4. restart: always 自启动
version: '3'
services:
  mariadb:
    image: mariadb
    container_name: mariadb
    networks:
      - blog_net
    ports:
      - "3306:3306"
    volumes:
      - ./var/lib/mysql:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_password

networks:
    blog_net:
      external: true

其次是nginx代理,其docker-compose.yml为:
几个要点:

  1. 和数据库的文件大致结构一致,文件映射多了几个,物理机目录/文件:docker的目录/文件。主要有nginx.conf文件,网页目录,日志,证书(https需求)等,ro为read only。
  2. 其次是内部端口到外部端口的映射。http和https端口
version: '3'
services:
  nginx:
    image: nginx
    restart: always
    container_name: nginx
    networks:
      - blog_net
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ../www:/var/www/html
      - ./logs:/var/log/nginx
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./certs:/etc/nginx/certs:ro
    ports:
      - "80:80"
      - "443:443"
networks:
   blog_net:
    external: true

第三是php的配置,有了nginx后,php只要一个php-fpm即可,也有相应的配置yml。
直接用别人造好的轮子就好,其中目录映射得到的www就是物理机上放typecho的目录。

version: '3'
services:
  php-fpm:
    image: sazo/php-fpm
    restart: always
    container_name: php-fpm
    volumes:
      - ../www:/var/www/html
    networks:
      - blog_net
    expose:
      - "9000"
networks:
   blog_net:
    external: true

在创建docker容器之前,先创建需要的docker子网。

docker network create blog_net

三个yml可以放在三个不能的目录,在三个yml文件目录下,运行:

docker-compose up -d

用docker ps就可以看到容器已经运行,如果要停止容器,使用

docker-compose down

把之前旧的的typecho拷贝到www目录下(新建的话,直接git clone到www目录下)
nginx.conf包含了conf.d里面的所有conf, 创建一个blog.conf
注意几个路径,certs的路径是物理机的路径,网页的root路径是docker内路径。
也就是说你的网页物理机的路径还是www/typecho, 但是映射到了var/www/html/typecho而已。

server {
        listen  80;
        server_name     shinelin.net www.shinelin.net;
        charset utf-8;
        return 301 https://$server_name$request_uri;
}


server {
    listen       443 ssl;
        server_name             shinelin.net www.shinelin.net;
        ssl_certificate         certs/www.shinelin.net.crt;
        ssl_certificate_key     certs/www.shinelin.net.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        root            /var/www/html/typecho;
        index           index.php index.html index.htm;
        location / {
           try_files $uri $uri/ /index.php$is_args$args;
           # index  index.php;
        }

        location ~* \.php$ {
           fastcgi_pass php-fpm:9000;
           fastcgi_index index.php;
           include fastcgi_params;
           fastcgi_split_path_info ^(.+\.php)(/?.*)$;
           fastcgi_param PATH_INFO $fastcgi_path_info;
           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
        location ~* .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
                expires      24h;
        }

    # access_log  logs/wordpress_access.log;
    # error_log   logs/wordpress_error.log;
}

然后就是数据库的备份和恢复了。

之前的配置

写在前面

如果你喜欢快速搭建,一点都不想编译源码,那么这篇文章可能更适合你。

环境

安装nginx

创建nginx用户,并设定不允许远程登录。

groupadd nginx
useradd -g nginx -M nginx
vi /etc/passwd

/bin/bash改为/sbin/nologin

下面我采用手动编译方式安装,安装编译所需要的库。

yum install -y gcc gcc-c++ autoconf automake
yum install -y zlib zlib-devel openssl openssl-devel pcre-devel

选择最新的nginx(点击我),也可以按照自己的需求选择
我使用了1.13.0版本,只要改版本号就可以下载指定版本,安装在/usr/local/

cd usr/local
wget http://nginx.org/download/nginx-1.13.0.tar.gz
tar zxvf nginx-1.13.0.tar.gz
cd nginx-1.13.0
./configure --prefix=/usr/local/nginx \
--pid-path=/usr/local/nginx/run/nginx.pid \
--with-http_ssl_module \
--user=nginx \
--group=nginx \
--with-pcre \
make && make install

启动和关闭(service nginx start|stop|restart,尽管我参照网上的方法配置了/etc/ini.d/,但是并不能成功)

# 启动
/usr/local/nginx/sbin/nginx
# 关闭(发现这么关闭比较快, 如果没有这个命令,可以yum install psmisc)
killall nginx
# 平滑加载配置
/usr/local/nginx/sbin/nginx -s reload
#开机自启动
echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local

打开浏览器访问,如果发现访问不了,就是防火墙问题,centos7的防火墙用的firewall

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

其他端口开发类似,不过我们要尽量少开放端口,而用nginx去做代理

安装php-fpm

nginx本身可以作为静态服务器,所以即使不需要安装apache也可以通过fastCGI+php-fpm实现动态解析php。
安装必要依赖包

yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel
yum -y install libjpeg-devel libpng-devel freetype-devel libmcrypt-devel

安装php-fpm
php7的最新稳定版本, 以下替换版本号即可。

cd /usr/local
wget http://cn2.php.net/distributions/php-7.1.4.tar.gz
tar zvxf php-7.1.4.tar.gz
rm php-7.1.4.tar.gz
cd php-7.1.4
# 不需要提供apxs模块的参数
./configure --prefix=/usr/local/php7 \
--with-config-file-path=/usr/local/php7/etc \
--with-config-file-scan-dir=/usr/local/php7/etc/php.d \
--with-mcrypt=/usr/include \
--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-gd \
--with-iconv \
--with-zlib \
--enable-xml \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-ftp \
--enable-gd-native-ttf \
--with-openssl \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--without-pear \
--with-gettext \
--enable-session \
--with-curl \
--with-jpeg-dir \
--with-freetype-dir \
--enable-opcache
# 等一会儿,然后看提示缺什么依赖补什么依赖,上面也写清楚了配置文件的目录
make && make install

然后是php的配置

cd /usr/local/php7/etc
mv php-fpm.conf.default php-fpm.conf
mv php-fpm.d/www.conf.default php-fpm.d/www.conf

php-fpm提供了service php-fpm start|stop|restart这些操作的模块。
php-7.1.4是源码目录,别弄错。

cd /usr/local/php-7.1.4/sapi/fpm
cp init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on

配置nginx代理。

cd /usr/local/nginx
vim conf/nginx.conf
#取消第一行注释,用户为nginx
user nginx
#server添加php配置,其中root为网站的根目录,可自行定义,我使用了区别于博客的目录。
location ~* \.php$ {
   root /home/www;
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   include fastcgi_params;
   fastcgi_split_path_info ^(.+\.php)(/?.*)$;
   fastcgi_param PATH_INFO $fastcgi_path_info;        
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

/home/www目录中添加index.php文件,内容为

<?php
   echo phpinfo();
?>

打开你的ip/index.php就可以看到php的配置界面了。

安装mysql数据库

mysql数据库因为编译要用到boost库(大),而且要编译好久,所以推荐用yum命令来安装吧。但是默认repo的数据库不是最新的。

wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
rpm -Uvh mysql57-community-release-el7-7.noarch.rpm
yum install mysql-community-server

sudo service mysqld start|stop|restart|status去控制mysql
启动后:

# 查看root随机生成的密码
sudo grep 'temporary password' /var/log/mysqld.log
mysql -u root -p 
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newPassword4!';
# 设置允许远程连接(如果单独创建用户,那么可以不使用root)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'newPassword4' WITH GRANT OPTION;

记得开放3306端口,方法同上面开放80

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload

然后用本地的navicat去测试连接就可以了,一般就可以直接连接上了。

安装typecho

天哪,搭建环境就讲这么长了。。。。

yum -y install git
git clone https://github.com/typecho/typecho.git /home/www/

这个时候需要配置一下nginx,保证博客可以被访问安装,参考官网文档推荐配置

  server {
        listen          80;
        server_name     yourdomain.com;
        root            /home/www/typecho;
        index           index.html index.htm index.php;
 
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php$1 last;
        }
 
        location ~ .*\.php(\/.*)*$ {
            include fastcgi.conf;
            fastcgi_pass  127.0.0.1:9000;
        }
 
        access_log logs/yourdomain.log combined;
    }

接着就可以用过url访问来安装了,yourdomain.com/install.php
安装过程中可能会遇到的问题:

答:检查账号密码确保正确!!!需要手动先创建typecho的数据库名!!!可以把数据库从localhost改为127.0.0.1,不知道什么原因!!!

参考博客

Responses