使用云服务器搭建 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. 手把手搭建一套私有 npm 服务

    手把手搭建一套私有 npm 服务 gnpm xnpm pnpm lnpm refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  2. hardsource bug

    hardsource bug webpack crashed bug memory stackoverflow [hardsource:32210703] Could not freeze refs ...

  3. React LifeCycle API

    React LifeCycle API old API & new API 不可以混用 demo https://codesandbox.io/s/react-parent-child-lif ...

  4. qt 获取窗口句柄的线程id和进程id GetWindowThreadProcessId

    int lpdwProcessId; int id = GetWindowThreadProcessId((HWND)0x707d6, (LPDWORD)&lpdwProcessId); qD ...

  5. vue动态添加当前事件下的class

    html部分<div class="star"> <span v-for="(item,index) in 5" @click="c ...

  6. python进阶(12)闭包

    闭包 首先了解一下:如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用 ...

  7. 后端程序员之路 20、python复习

    Welcome to Python.orghttps://www.python.org/ 怎么用最短时间高效而踏实地学习 Python? - 知乎https://www.zhihu.com/quest ...

  8. 《C++ Primer》笔记 第3章 字符串、向量和数组

    位于头文件的代码一般来说不应该使用using声明. 如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去.与之相反,如果不使用等号,则执行的是直接 ...

  9. 9.Vue之webpack打包基础---模块化思维

    主要内容: 1. 什么是模块化思维? 2.  ES6包的封装思想 一.什么是模块化思维呢? 现实工作中, 一个项目可能会有多个人同时开发. 然后, 将所有人开发的内容, 合并到一个文件中. 比如: 1 ...

  10. Omega System Trading and Development Club内部分享策略Easylanguage源码 (第二期)

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 我们曾经在前文(链接),为大家分享我们精心整理的私货:"System Trading and ...