最近给网站做了迁移,由于经验比较少,所以踩了很多坑,觉得网络上众多大佬没有几个认真对待这件事情的,写的都比较马马虎虎,也可能是大佬就是大佬,师傅领进门,修行在个人。不过对于老四这样的人喜欢详尽一点教程,便于日后复盘,所以特此记录一下,也希望能帮助一些和我有同样的需求的人吧。
背景
由原先的 lamp 架构单站点转为 lnmp 架构下的双站点,单 ip 利用 Nginx 实现 WordPress 和 Discuz! 共存。关于单站点 lamp 架构的搭建老四之前写过一篇教程,可戳《lamp搭建全流程,摆脱一键安装包 建站参考》参考。
需求
在单台服务其下部署两个项目类型的网站,一个是 WordPress,一个是 Discuz! 论坛,而且要分别配置两个不同的域名实现访问,但要求服务器只用一个 ip 地址。
为新的服务器配置用户、用户组以及设置 sudo 权限
老四用的是新的 CentOS7 64 位服务器纯净版,初始化只有一个 root 用户,使用 root 用户来做任何事情都是不好的行为,所以尽量不要使用 root 用户。另外多提一嘴,我劝你们尽量不要使用市面上出现一些「lnmp一键安装包」,不好维护、设置不自由、无用的模块东西比较多、内存占用比较大等等缺点都不如自己动手搭建来的切实际,并且有一种掌控欲,还增加自己的实操经验。以后优化以及维护可能都会给我带来挑战,但也给我们带来成长和经验,这是最重要的。如果你懒得折腾,那就请尽情的用,只不过那里的采坑不比自己手动少多少。
一、先添加用户组
查看现有的用户和用户组
1 2 |
[root@localhost ~]# cat /etc/group [root@localhost ~]# cat /etc/passwd |
添加用户组
1 2 |
[root@localhost ~]# groupadd testGroup [root@localhost ~]# groupadd -g 101 testGroup # (-g GID 指定新用户组的组标识号(GID)) |
二、添加用户到组
1 |
[root@localhost ~]# useradd -u 888 -d /home/test -g testGroup -m testUser |
设置修改密码,之后才能 SSH 登陆
1 |
[root@localhost ~]# passwd testUser |
三、设置 sudo 权限
1 |
[root@localhost ~]# vi /etc/sudoers |
修改:
1 2 3 |
## Allow root to run any commands anywher root ALL=(ALL) ALL testUser ALL=(ALL) ALL # 新增用户信息 |
这样就可以了,然后可以使用 su 命令从root 用户切换到新增的用户。
安装 Nginx
一、首先关闭 SELinux
1 |
[root@localhost ~]# vi /etc/sysconfig/selinux |
将配置文件中的「SELINUX=enforcing」改为 「SELINUX=disabled」
二、安装 Nginx 编译依赖库
我使用的是编译安装的方式安装 Nginx,没有采用 yum 安装,因为这种方式我觉得我可以集中管理 Nginx 的安装位置,设置你可以自定义配置。yum 的方式这里不介绍。
在安装之前,Nginx 需要一些依赖库,作为一台纯净版的服务器肯定是没有的,所以需要安装一下。一共四个,执行下面这四条命令即可。
1 2 3 4 |
[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
1 2 3 4 5 |
[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 维护命令
1 2 3 4 5 6 |
[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 停止命令平滑停机然后再执行启动命令
1 2 |
[gaolaosi@localhost ~]# sudo ./nginx -s quit [gaolaosi@localhost ~]# sudo ./nginx |
另外,Nginx 的配置文件修改之后不需要使用重启服务器的方式,可以上面 reload 命令即可,代表重新加载配置文件。
安装 PHP
老四使用的是 PHP 5.6.40 版本。
一、配置 Centos 7 下的 PHP 安装源
1 2 3 4 |
[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 解析库
- opcache php 5.5之后自动加了 opcache 模块提高程序性能,默认关闭,自行搜索资料打开即可
- phpmyadmin 管理 MySQL 的界面工具,可以根据建议来对你的业务数据库进行优化。
- mbstring phpmyadmin 要求必须添加的模块,一起安装上
1 |
[gaolaosi@localhost ~]# sudo yum install --enablerepo=remi --enablerepo=remi-php56 php php-mysql php-mcrypt php-fpm php-devel php-gd* php-xmlrpc phpmyadmin mbstring |
三、配置 PHP 开机启动服务
1 |
[gaolaosi@localhost ~]# sudo systemctl enable php-fpm |
四、查看版本以及是否安装启动成功
1 2 3 4 |
[gaolaosi@localhost ~]# php --version [gaolaosi@localhost ~]# php -vps -ef | grep php [gaolaosi@localhost ~]# netstat -anp | grep 9000 [gaolaosi@localhost ~]# sudo systemctl restart php-fpm |
五、另外,如果你想要安装高版本,比如说 php 7.3 版本,其实变化跟上面没太区别,就是需要在 remi-php56 命令修改为 remi-php73 即可。如下:
1 |
[gaolaosi@localhost ~]# sudo yum install --enablerepo=remi --enablerepo=remi-php73 php php-mysql php-mcrypt php-fpm php-devel php-gd* php-xmlrpc phpmyadmin mbstring |
安装 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
1 2 3 |
[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 服务
1 |
[gaolaosi@localhost ~]# sudo systemctl start mysqld |
三、设置开机启动
1 2 |
[gaolaosi@localhost ~]# sudo systemctl enable mysqld [gaolaosi@localhost ~]# sudo systemctl daemon-reload |
四、修改 root 本地登录密码
MySQL 5.7 及以上版本安装完成之后,会在 /var/log/mysqld.log 文件中给 root 用户生成了一个临时的默认密码。去那里找到那个临时密码,我就不截图了。然后用这个密码登陆 MySQL,修改密码并设置远程连接权限。这里注意一下,我的示例用了 root 用户进行了远程连接,在建站部署的时候尽量建立普通用户来进行数据库的管理,安全规范要做好,并且尽量设置一下远程连接的白名单,而不是使用通配符「%」将权限放开。
1 2 |
ALTER USER 'root'@'localhost' IDENTIFIED BY '密码'; // 大小写字母、数字、特殊符号 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION; //授权 |
五、打开防火墙 3306 端口
1 2 |
[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] 下添加编码配置,如下所示:
1 2 3 |
[mysqld] character_set_server=utf8 init_connect='SET NAMES utf8' |
然后重启 MySQL 服务。
1 |
[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,配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
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 上,这个配合网上很多写的都是错的,会导致管理员从前端页面进入后台无限循环重定向的问题。最后老四找到几个完美的配置,供你参考一下,上面的也是正确的,此外还有如下:
1 2 3 |
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。
1 2 3 4 5 6 |
[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 然后进行重新安装?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 查看 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... |
三、重启网络服务的命令
1 |
[gaolaosi@localhost ~]# sudo service network restart |
四、查看某个 PHP 模块的信息以及查看当前 PHP 安装了那些模块扩展
1 2 |
php -m yum info php-devel |
五、如何彻底卸载 CentOS 上的 MySQL?
基于 yum 安装 MySQL 卸载:
1 2 3 4 5 |
[gaolaosi@localhost ~]# yum list installed mysql* [gaolaosi@localhost ~]# sudo yum remove (列表中的所有模块) [gaolaosi@localhost ~]# sudo rm -rf /usr/share/mysql [gaolaosi@localhost ~]# sudo rm -rf /var/lib/mysql [gaolaosi@localhost ~]# sudo rm /etc/my.cnf |
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。
非常详细的教程
后期还会优化并加一些内容