倚楼听风雨
淡看江湖路

记一次网站迁移全过程,单服务器单 IP 双域名搭建 lnmp 架构实现 WordPress 与 Discuz! 并存

最近给网站做了迁移,由于经验比较少,所以踩了很多坑,觉得网络上众多大佬没有几个认真对待这件事情的,写的都比较马马虎虎,也可能是大佬就是大佬,师傅领进门,修行在个人。不过对于老四这样的人喜欢详尽一点教程,便于日后复盘,所以特此记录一下,也希望能帮助一些和我有同样的需求的人吧。

背景

由原先的 lamp 架构单站点转为 lnmp 架构下的双站点,单 ip 利用 Nginx 实现 WordPress 和 Discuz! 共存。关于单站点 lamp 架构的搭建老四之前写过一篇教程,可戳《lamp搭建全流程,摆脱一键安装包 建站参考》参考。

需求

在单台服务其下部署两个项目类型的网站,一个是 WordPress,一个是 Discuz! 论坛,而且要分别配置两个不同的域名实现访问,但要求服务器只用一个 ip 地址。

为新的服务器配置用户、用户组以及设置 sudo 权限

老四用的是新的 CentOS7 64 位服务器纯净版,初始化只有一个 root 用户,使用 root 用户来做任何事情都是不好的行为,所以尽量不要使用 root 用户。另外多提一嘴,我劝你们尽量不要使用市面上出现一些「lnmp一键安装包」,不好维护、设置不自由、无用的模块东西比较多、内存占用比较大等等缺点都不如自己动手搭建来的切实际,并且有一种掌控欲,还增加自己的实操经验。以后优化以及维护可能都会给我带来挑战,但也给我们带来成长和经验,这是最重要的。如果你懒得折腾,那就请尽情的用,只不过那里的采坑不比自己手动少多少。

一、先添加用户组

查看现有的用户和用户组

[root@localhost ~]# cat /etc/group
[root@localhost ~]# cat /etc/passwd

添加用户组

[root@localhost ~]# groupadd testGroup
[root@localhost ~]# groupadd -g 101 testGroup # (-g GID 指定新用户组的组标识号(GID))

二、添加用户到组

[root@localhost ~]# useradd -u 888 -d /home/test -g testGroup -m testUser

设置修改密码,之后才能 SSH 登陆

[root@localhost ~]# passwd testUser

三、设置 sudo 权限

[root@localhost ~]# vi /etc/sudoers

修改:

## Allow root to run any commands anywher
root ALL=(ALL) ALL
testUser ALL=(ALL) ALL # 新增用户信息

这样就可以了,然后可以使用 su 命令从root 用户切换到新增的用户。

安装 Nginx

一、首先关闭 SELinux

[root@localhost ~]# vi /etc/sysconfig/selinux

将配置文件中的「SELINUX=enforcing」改为 「SELINUX=disabled」

二、安装 Nginx 编译依赖库

我使用的是编译安装的方式安装 Nginx,没有采用 yum 安装,因为这种方式我觉得我可以集中管理 Nginx 的安装位置,设置你可以自定义配置。yum 的方式这里不介绍。

在安装之前,Nginx 需要一些依赖库,作为一台纯净版的服务器肯定是没有的,所以需要安装一下。一共四个,执行下面这四条命令即可。

[gaolaosi@localhost ~]# sudo yum install gcc-c++
[gaolaosi@localhost ~]# sudo yum install -y pcre pcre-devel
[gaolaosi@localhost ~]# sudo yum install -y zlib zlib-devel
[gaolaosi@localhost ~]# sudo yum install -y openssl openssl-devel

三、编译安装 Nginx 1.16.0

[gaolaosi@localhost ~]# sudo wget https://nginx.org/download/nginx-1.16.0.tar.gz
[gaolaosi@localhost ~]# sudo tar -zxvf ./nginx-1.16.0.tar.gz
[gaolaosi@localhost ~]# sudo ./configure
[gaolaosi@localhost ~]# sudo make
[gaolaosi@localhost ~]# sudo make install

这里注意一下,我安装的时候使用的是默认的配置,也就是「sudo ./configure」,安装完毕后 Nginx 会安装在 /usr/local/nginx 路径下面。如果你想高度自定义配置,可以使用「./configure --help」看看都有哪些命令,然后自定义按需执行即可。

四、安装完毕之后一些常用的维护命令

安装完成后,浏览器访问你服务器的 ip 地址,不出意外的话都会看到欢迎页,代表你已经安装成功了。

分享一些比较常用的 Nginx 维护命令

[gaolaosi@localhost ~]# cd /usr/local/nginx/sbin/
[gaolaosi@localhost ~]# sudo ./nginx
[gaolaosi@localhost ~]# sudo ./nginx -s stop
[gaolaosi@localhost ~]# sudo ./nginx -s quit
[gaolaosi@localhost ~]# sudo ./nginx -s reload
[gaolaosi@localhost ~]# ps aux|grep nginx

这里说一下关于 Nginx 中 quit 和 stop 两个命令的区别:

  • quit:此方式停止步骤是待 Nginx 进程处理任务完毕进行停止,也就是平滑的停止进程。
  • stop:此方式相当于先查出 Nginx 进程号然后再使用 kill 命令强制杀掉进程,也就是不管不顾直接杀死 Nginx 进程

所以,基于以上的区别,重启 Nginx 服务器比较推荐的方式即先执行 quite 停止命令平滑停机然后再执行启动命令

[gaolaosi@localhost ~]# sudo ./nginx -s quit
[gaolaosi@localhost ~]# sudo ./nginx

另外,Nginx 的配置文件修改之后不需要使用重启服务器的方式,可以上面 reload 命令即可,代表重新加载配置文件。

安装 PHP

老四使用的是 PHP 5.6.40 版本,6、7 版本的安装方式可能会有所不同,这里不提供,自寻优质教程。

一、配置 Centos 7 下的 PHP 安装源

[gaolaosi@localhost ~]# sudo yum install epel-release
[gaolaosi@localhost ~]# sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# 列出 PHP 以及 PHP 各个版本的 PHP 模块列表
[gaolaosi@localhost ~]# sudo yum list --enablerepo=remi --enablerepo=remi-php56 | grep php

二、按需安装 PHP 以及 PHP 模块

这里说明一下,有很多 PHP 模块是我们建站不需要的,所以没必要装,我就是我需要使用哪个就用哪个,如果你到这里也有对应的一些需求,查找对应的模块按需安装即可。说明一下我安装的这些模块分别是用来干嘛的。

  • php 这肯定是要安装的了
  • php-mysql php用来连接的 MySQL 的,必须安装
  • php-mcrypt 负责加解密的,我是在我的 WP 站下载栏需要用到这个库
  • php-fpm 用来管理 PHP的,必须安装
  • php-devel PHP的开发扩展,如果以后想编译安装一些所需要的模块扩展,需要用到这个依赖库。
  • php-gd* PHP的图像处理库,我在使用验证码的时候需要用到这个库
  • php-xmlrpc Discuz! 需要 xml 解析库
[gaolaosi@localhost ~]# sudo yum install --enablerepo=remi --enablerepo=remi-php56 php php-mysql php-mcrypt php-fpm php-devel php-gd* php-xmlrpc

三、配置 PHP 开机启动服务

[gaolaosi@localhost ~]# sudo systemctl enable php-fpm

四、查看版本以及是否安装启动成功

[gaolaosi@localhost ~]# php --version
[gaolaosi@localhost ~]# php -vps -ef | grep php
[gaolaosi@localhost ~]# netstat -anp | grep 9000
[gaolaosi@localhost ~]# sudo systemctl restart php-fpm

安装 MySQL 5.7

我之前用的是 MySQL 5.6,但是操蛋的是总出现 mysql.sock 丢失的问题,这回换 MySQL 5.7 看看有没有同样的问题出现。关于 mysql.sock 丢失的问题可以参考一下老四的《如何彻底解决mysql.sock(Can't connect to local MySQL server through)丢失的问题?非网上各种瞎哔哔的解决方式》这篇文章。

一、yum 源安装 MySQL 5.7

[gaolaosi@localhost ~]# sudo wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
[gaolaosi@localhost ~]# sudo yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
[gaolaosi@localhost ~]# sudo yum -y install mysql-community-server

二、安装完毕后启动 Mysql 服务

[gaolaosi@localhost ~]# sudo systemctl start mysqld

三、设置开机启动

[gaolaosi@localhost ~]# sudo systemctl enable mysqld
[gaolaosi@localhost ~]# sudo systemctl daemon-reload

四、修改 root 本地登录密码

MySQL 5.7 及以上版本安装完成之后,会在 /var/log/mysqld.log 文件中给 root 用户生成了一个临时的默认密码。去那里找到那个临时密码,我就不截图了。然后用这个密码登陆 MySQL,修改密码并设置远程连接权限。这里注意一下,我的示例用了 root 用户进行了远程连接,在建站部署的时候尽量建立普通用户来进行数据库的管理,安全规范要做好,并且尽量设置一下远程连接的白名单,而不是使用通配符「%」将权限放开。

ALTER USER 'root'@'localhost' IDENTIFIED BY '密码'; // 大小写字母、数字、特殊符号
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION; //授权

五、打开防火墙 3306 端口

[gaolaosi@localhost ~]# sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
[gaolaosi@localhost ~]# sudo firewall-cmd --reload

关于 firewall 命令是 CentOS 7 之后新出的命令,取代了之前的 iptables,更多信息可以参考一下老四的《常用Linux命令操作集(CentOS) 持续更新》文章。

六、设置 MySQL 数据库编码

我们基本都用 UTF-8,所以尽量都记得修改一下。修改 /etc/my.cnf 配置文件,在 [mysqld] 下添加编码配置,如下所示:

[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'

然后重启 MySQL 服务。

[gaolaosi@localhost ~]# sudo systemctl restart mysqld

以上,lnmp 这样的结构我们基本就安装搭建完毕了。接下来简单的介绍一下部署 WordPress 和 Discuz! ,主要是说一些部署这两个项目需要在 Nginx 中的一些相关配置,就是应题如何在单服务器单 IP 双域名搭建 lnmp 架构实现 WordPress 与 Discuz! 并存。

配置 Nginx 配置文件实现双目共存

Nginx 安装完毕之后,默认的项目位置是 /var/www 下面,然后可以建立两个目录,分别放入 WordPress 和 Discuz! 安装程序包,至于这些程序的安装与部署我就不细讲了。这里最关键的是 Nginx 的配置,基本上所有的配置都在 /usr/local/nginx/conf 里面,打开 nginx.conf,在 http 模块里面配置两个 server,配置如下:

server {
    listen       80;
    server_name  www.wordpress.com;
    root   /var/www/wordpress/;

    location / {
        root   /var/www/wordpress/;
        index  index.php index.html index.htm;
		# 重写配置
		if (-f $request_filename/index.html){
			rewrite (.*) $1/index.html break;
		}
		if (-f $request_filename/index.php){
			rewrite (.*) $1/index.php;
		}
		if (!-f $request_filename){
			rewrite (.*) /index.php;
		}
    }

    error_page  404              /404.html;
    location = /404.html {
        #root   /usr/share/nginx/html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        #root   /usr/share/nginx/html;
    }
    location ~ .*\.(php|php5)?(\/.*)*$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        set $path_info "";
                set $real_script_name $fastcgi_script_name;
                if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                        set $real_script_name $1;
                        set $path_info $2;
                }
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $real_script_name;
                fastcgi_param PATH_INFO $path_info;
            include    fastcgi_params;
    }
}

server {
    listen       80;
    server_name  www.discuz.net;
    root   /var/www/discuz/;

    location / {
        root   /var/www/discuz/;
        index  index.php index.html index.htm;
    }

    error_page  404              /404.html;
    location = /404.html {
        #root   /usr/share/nginx/html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        #root   /usr/share/nginx/html;
    }
    location ~ .*\.(php|php5)?(\/.*)*$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        set $path_info "";
                set $real_script_name $fastcgi_script_name;
                if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
                        set $real_script_name $1;
                        set $path_info $2;
                }
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $real_script_name;
                fastcgi_param PATH_INFO $path_info;
            include    fastcgi_params;
    }
}

以上就是两个项目的 Nginx 配置,着重看一下关于 WordPress 重写规则的配置,因为 lnmp 架构下需要在 Nginx 中配置重写规则,重写规则其实就是伪静态,如果是 lamp 架构是在 PHP 和 Apache 中的「.htaccess」中配置的。关于这一点,尤其是从 Apache 转到 Nginx 上,这个配合网上很多写的都是错的,会导致管理员从前端页面进入后台无限循环重定向的问题。最后老四找到几个完美的配置,供你参考一下,上面的也是正确的,此外还有如下:

location / {
    try_files $uri $uri/ /index.php?$args ;
}

最后,老四发现了一个 Apache 重写规则与 Nginx 重写规则互相转换的在线地址,这里小小的推荐一下,不过没那么好用的,还是我上面推荐的两个写法好用。

还有一点,就是可以建立一个 vhosts 目录,里面配置两个conf,然后分别配置 server,然后在 http 模块中 include 这两个文件。我没采用这种方式是因为就两个 server,没必要。还有就是将默认的 server 配置注视掉。

好了,重要的一些点也就这么多了,如果实操还是遇到很多问题,可以看看下面的这个常见问题汇总,另外也可以留言或者加入官方交流群一起交流。

常见问题汇总

一、在安装的 PHP 的过程中,由于网络的原因,可能执行「sudo yum install epel-release」的过程中发生网络错误无法安装,可以尝试一下 yum update 并重新安装 epel-release。

[gaolaosi@localhost ~]# sudo yum clean all
[gaolaosi@localhost ~]# sudo rpm --rebuilddb
[gaolaosi@localhost ~]# sudo yum update
# 删掉之前的 epel-release
[gaolaosi@localhost ~]# sudo yum remove epel-release
# 重新安装:[gaolaosi@localhost ~]# sudo yum -y install epel-release

二、如何彻底的卸载 PHP 然后进行重新安装?

# 查看 PHP 相关的安装包
[gaolaosi@localhost ~]# sudo yum list installed | grep php
# 可能会返回类似下列的结果
php.x86_64                          5.6.40-7.el7.remi      
php-cli.x86_64                      5.6.40-7.el7.remi      
php-common.x86_64                   5.6.40-7.el7.remi      
php-gd.x86_64                       5.6.40-7.el7.remi      
php-mcrypt.x86_64                   5.6.40-7.el7.remi      
php-mysqlnd.x86_64                  5.6.40-7.el7.remi      
php-pdo.x86_64                      5.6.40-7.el7.remi      
php-pecl-jsonc.x86_64               1.3.10-2.el7.remi.5.6  
php-pecl-zip.x86_64                 1.15.2-1.el7.remi.5.6 
# 删除以上所有的安装包
[gaolaosi@localhost ~]# sudo yum remove php.x86_64...

三、重启网络服务的命令

[gaolaosi@localhost ~]# sudo service network restart

四、查看某个 PHP 模块的信息以及查看当前 PHP 安装了那些模块扩展

php -m
yum info php-devel

更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。

赞(5) 给你买杜蕾斯
本站原创文章受自媒体平台原创保护,未经允许不得转载高老四博客 » 记一次网站迁移全过程,单服务器单 IP 双域名搭建 lnmp 架构实现 WordPress 与 Discuz! 并存
分享到: 更多 (0)

开始你的表演 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下老四,鼓励我更好的创作

支付宝扫一扫打赏

微信扫一扫打赏