使用云服务器搭建 Web 运行环境,尤其是搭建常见的 LNMPR(Linux+Nginx+MySQL+PHP+Redis) 环境,对于开发人员是必备的职场基本技能之一。在这里,借着搭建我的“魚立说”个人网站的机会,整理了从零搭建 LNMPR 环境的详细过程,期间遇到的问题也一一进行了记录。

本文来源:魚立说。本文链接:https://www.yulisay.com/d/lnmpr1.html,支持微信浏览器打开。

更多精彩文章,请移步 魚立说个人网站 翻看。欢迎欣赏,吐槽不足之处。


本主题使用到的服务器是 Aliyun 的 ECS 体验机,适用于在 CentOS 操作系统下搭建 LNMPR 运行环境,整个系列由以下两个文章部分组成:

搭建服务目标组成:Nginx 1.19.4 + MySQL 5.7.32 + PHP 7.4.9 + Redis 6.0.9,预计耗时 40 分钟。

1.1 准备服务器

本服务器是从 阿里云试用中心 找到的,直接跳转:基于 ECS 搭建博客 - 开发者云体验平台

进入体验页后,点击“开始体验”,并免费开通 ECS 服务器,这时会有 2 个小时的体验时间,如图:

然后按照右侧的教程,可以在终端连接 ECS 服务器,如图:

1.2 了解服务器

首先,我们需要了解关于服务器的一些信息,下面是几个有用的命令:

查看服务器版本:cat /etc/redhat-release,比如输出是 CentOS Linux release 7.7.1908 (Core) 。

查看硬盘使用情况:df -h,其中 /dev/vda1 是我们用到的磁盘,如系统资源占用了 2G :

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs 486M 0 486M 0% /dev
tmpfs 496M 0 496M 0% /dev/shm
tmpfs 496M 452K 496M 1% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/vda1 40G 2.0G 36G 6% /
tmpfs 100M 0 100M 0% /run/user/0

查看内存使用量:free -m

查看端口侦听情况:netstat -lntp,输出显示目前没有我们需要的资源(没有 NMPR 的端口服务):

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 984/sshd

接下来,便可以开始依次安装 NMPR 服务了。

1.3 编译安装 LNMPR

1.3.1 准备目录和执行用户

我们需要准备一个源码目录、运行目录、日志目录等,并创建具有执行权限的用户组和用户,同时准备一个项目目录和 PHP 默认入口文件,命令如下:

mkdir -p /data/src /data/run /data/log/nginx /data/log/php /data/log/mysql

groupadd admin && useradd -s /sbin/nologin -M -g admin www

mkdir -p /data/project/www && \
cd /data/project/www && \
echo "<?php" >> index.php && \
echo "phpinfo();" >> index.php chown -R www:admin /data/project/www && chmod -R 755 /data/project/www

1.3.2 编译安装 Nginx

安装缺少的依赖包:

yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel

下载、解压 安装包,这里用到了下载速度更快的镜像源:

cd /data/src && wget -c http://mirrors.sohu.com/nginx/nginx-1.19.4.tar.gz && tar -zxvf nginx-1.19.4.tar.gz && cd nginx-1.19.4

使用自定义配置:

./configure \
--user=www \
--group=admin \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/bin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/data/run/nginx.pid \
--lock-path=/data/run/nginx.lock \
--http-log-path=/data/log/nginx/access.log \
--error-log-path=/data/log/nginx/error.log \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_realip_module

编译安装:

make && make install

加入到当前用户的 PATH 中:

echo 'export PATH=/usr/local/nginx/bin:$PATH' >> ~/.bashrc && source ~/.bashrc

这时,查看 Nginx 版本,输出为 “nginx/1.19.4” :

nginx -v

1.3.3 编译安装 MySQL

下载安装 repo:

cd /etc/yum.repos.d && wget -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm && yum -y install mysql57-community-release-el7-10.noarch.rpm

安装 MySQL 服务器:

yum -y install mysql-community-server

查看 MySQL 版本,输出为 “Server version: 5.7.32” :

mysql -V

1.3.4 编译安装 PHP

安装缺少的依赖包:

yum -y install libxml2 libxml2-devel bzip2 bzip2-devel libcurl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel libicu-devel sqlite-devel

安装 oniguruma5php oniguruma5php-devel 扩展:

yum -y install https://rpms.remirepo.net/enterprise/7/remi/x86_64/oniguruma5php-6.9.5+rev1-4.el7.remi.x86_64.rpm
yum -y install https://rpms.remirepo.net/enterprise/7/remi/x86_64/oniguruma5php-devel-6.9.5+rev1-4.el7.remi.x86_64.rpm

安装 libzip 扩展:

yum remove libzip && \
cd /data/src && wget -c https://hqidi.com/big/libzip-1.2.0.tar.gz && tar -zxvf libzip-1.2.0.tar.gz && cd libzip-1.2.0
./configure && make && make install && export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

下载、解压 安装包,这里用到了下载速度更快的镜像源:

cd /data/src && wget -c http://mirrors.sohu.com/php/php-7.4.9.tar.gz && tar -zxvf php-7.4.9.tar.gz && cd php-7.4.9

自定义配置,配置项可以使用命令 ./configure --help 查看,这里设定安装目录为 /usr/local/php,配置文件目录为 /usr/local/php/etc,并允许使用 php-fpm 管理 PHP 请求:

./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-fpm-user=www \
--with-fpm-group=www \
--with-curl \
--with-gettext \
--with-iconv-dir \
--with-kerberos \
--with-libdir=lib64 \
--with-mysqli \
--with-pdo-sqlite \
--with-pdo-mysql \
--with-pear \
--with-xmlrpc \
--with-mhash \
--with-bz2 \
--with-gmp \
--with-openssl \
--with-xsl \
--with-zip \
--with-zlib \
--with-zlib-dir \
--with-freetype \
--enable-fpm \
--enable-mysqlnd \
--enable-mysqlnd-compression-support \
--enable-inline-optimization \
--enable-mbregex \
--enable-opcache \
--enable-xml \
--enable-bcmath \
--enable-calendar \
--enable-dba \
--enable-exif \
--enable-ftp \
--enable-gd \
--enable-intl \
--enable-mbstring \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm

编译安装,执行过程需要等待几分钟:

make && make install

加入到当前用户的环境变量中:

echo 'export PATH=/usr/local/php/bin:$PATH' >> ~/.bashrc && source ~/.bashrc

复制 php-fpm 程序到 /etc/init.d,并赋予执行权限 :

cp /data/src/php-7.4.9/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm &&

chmod +x /etc/init.d/php-fpm

查看 PHP 版本,输出为 “PHP 7.4.9 (cli)” :

php -v

1.3.5 编译安装 Redis

安装缺少的依赖包 :

yum -y install centos-release-scl && \
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

加入到当前用户的环境变量:

echo "source /opt/rh/devtoolset-9/enable" >> ~/.bashrc && echo 'export PATH=/usr/local/redis/bin:$PATH' >> ~/.bashrc && source ~/.bashrc

下载、解压 安装包:

cd /data/src && wget -c http://download.redis.io/releases/redis-6.0.9.tar.gz && tar -zxvf redis-6.0.9.tar.gz && cd redis-6.0.9

编译安装:

make install PREFIX=/usr/local/redis

复制配置文件:

cp /data/src/redis-6.0.9/redis.conf /usr/local/redis/bin/

查看 Redis 版本,输出为 “Redis server v=6.0.9”:

redis-server -v

最后,再次执行命令:df -h,可以看到系统资源占用了 5.6G ,也就是说我们安装的资源占用了 3G 多:

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs 486M 0 486M 0% /dev
tmpfs 496M 0 496M 0% /dev/shm
tmpfs 496M 496K 495M 1% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/vda1 40G 5.6G 32G 15% /
tmpfs 100M 0 100M 0% /run/user/0

1.4 可能出现的问题

1.4.1 MySQL 报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements_calistom

原因是密码设置的过于简单,MySQL有密码设置的规范,validate_password_policy 决定密码的验证策略。

1.4.2 PHP 报错:configure: error: Package requirements (libzip >= 0.11) were not met

libzip 版本过低导致。

1.4.3 编译 PHP 时,阿里云服务器报错:virtual memory exhausted: Cannot allocate memory

内存不足,无法完成编译。通过增加 SWAP 虚拟内存来解决,执行下面的命令:

dd if=/dev/zero of=/swap bs=1024 count=1M
mkswap /swap
swapon /swap
echo "/swap swap swap sw 0 0" >> /etc/fstab

执行后,通过命令free -m 可以看到出现了虚拟内存 SWAP。

1.4.4 CentOS 报错:yum 安装软件出现 No package XXX available

找到配置文件 /etc/yum.repos.d/CentOS-Base.repo ,修改 yum 的更新源站点。这里使用阿里云的镜像进行替代,执行前先备份 CentOS-Base.repo:

cp /etc/yum.repos.d/CentOS-Base.repo /data/src/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

1.5 参考链接

CentOS7安装Nginx

CentOS7安装MySQL(完整版)

Centos 下安装 PHP (新)

PHP: 核心配置选项列表 - Manual

Linux(CentOS7.6 x64)安装Redis-6.0.9完全教程手册详细篇

以Aliyun体验机为例,从零搭建LNMPR环境(上)的更多相关文章

  1. 以Aliyun体验机为例,从零搭建LNMPR环境(下)

    使用云服务器搭建 Web 运行环境,尤其是搭建常见的 LNMPR(Linux+Nginx+MySQL+PHP+Redis) 环境,对于开发人员是必备的职场基本技能之一.在这里,借着搭建我的" ...

  2. 从零搭建LNMP环境

    Linux就是环境所在的操作系统: Nginx则是一个「高性能的HTTP和反向代理服务器」,官网地址:http://nginx.org/: MySQL则是一个方便地对数据进行增删改查的数据库管理系统, ...

  3. 通过create-react-app从零搭建react环境

    一. 快速开始: 全局安装脚手架: $ npm install -g create-react-app 通过脚手架搭建项目: $ create-react-app <项目名称> 开始项目: ...

  4. 从零搭建 webpack3 环境 #1 - 安装使用

    目录: (1)什么是webpack (2)webpack核心概念 (3)环境安装 (4)开始使用webpack 1.什么是webpack 官网的一幅图对webpack的解释,从图中可以看出,webpa ...

  5. 从零搭建生产环境的ghost2.0博客

    当前安装过程是在ghost cli 1.9.2上的,由于ghost更新特别快,我安装我个人博客cmlanche.com的时候还是1.9.1,当时没碰到啥问题,到1.9.2就有一点点不一样了,所以要注意 ...

  6. webpack-从零搭建vuecli环境

    模块化思想 // 1最早期就只是html和css处理网页 // 2发明一种语言来操作html和css js // 3早期只是在html文件里直接在script标签里写一些脚本代码 // 4随着Ajax ...

  7. React Native从零到一搭建开发环境

    React Native从零到一搭建开发环境 ReactNative环境搭建 安装Homebrew 安装rvm 安装nvm 安装node 安装react-native-cli 安装watchman i ...

  8. 从零搭建docker+jenkins 自动化部署环境

    从零搭建docker+jenkins+node.js自动化部署环境 本次案例基于CentOS 7系统 适合有一定docker使用经验的人阅读 适合有一定linux命令使用经验的人阅读 1.docker ...

  9. 从零搭建Spring Boot脚手架(1):开篇以及技术选型

    1. 前言 目前Spring Boot已经成为主流的Java Web开发框架,熟练掌握Spring Boot并能够根据业务来定制Spring Boot成为一个Java开发者的必备技巧,但是总是零零碎碎 ...

随机推荐

  1. Navigator.registerProtocolHandler All In One

    Navigator.registerProtocolHandler All In One Web API custom protocol URL Schemes URL Protocols https ...

  2. HTML script tag type all in one

    HTML script tag type all in one script type https://developer.mozilla.org/en-US/docs/Web/HTML/Elemen ...

  3. React Hooks vs React Class vs React Function All In One

    React Hooks vs React Class vs React Function All In One React Component Types React Hooks Component ...

  4. node os env reader

    node os env reader node-os-env-reader.js #!/usr/bin/env node "use strict"; /** * * @author ...

  5. SQL Tutorials & MySQL & SQL Server

    SQL Tutorials SQL MySQL https://www.mysql.com/ $ mysql --version # mysql Ver 8.0.21 for osx10.15 on ...

  6. js 实现各种算法 APP

    js 实现各种算法 APP 常见算法: 排序,搜索/查找,枚举,遍历,最短路径,二叉树 open source web app desktop app react native app flutter ...

  7. Object to Array

    Object to Array objectToArray(obj = {}, title = `标题`){ let datas = []; if(Object.keys(obj).length) { ...

  8. dynamic creat svg in js

    dynamic creat svg in js SVG title https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title < ...

  9. 利用Metasploit 打入ThinkPHP内网...

    出品|MS08067实验室(www.ms08067.com) 本文作者:dch(Ms08067实验室 SRSP TEAM小组成员) 一.利用Metasploit进行攻击的流程图   Metasploi ...

  10. C++面试题集合(持续更新)

    C++面试中常被问到的几个知识点: 1. 基本概念 多态是什么,C++通过什么实现的多态.虚函数是什么,纯虚类是什么.重载是什么,重写是什么.重载运算符怎么写.new和malloc有什么区别.公有继承 ...