LNMP环境搭建小记 服务商为腾讯云,主机基础配置为CentOS 7.1 64位、单核CPU、1G 内存、20G 系统云盘、1Mbps 带宽。
身为一个传统的Windows程序员,在Linux环境中的实践操作次数屈指可数,更不用提在没有“exe”一键安装的Linux中手动编译安装开发环境。最近也是心血来潮,毕竟作为一个PHPer,没有在Linux环境下搭建过服务器实在是人生都不完整。在对比了下国内几家云服务提供商后,最终选择了腾讯云,因为便宜!之前小站是部署在阿里云活动期间免费送的共享虚拟主机上的,属于一键傻瓜式操作,只需通过ftp上传项目代码到指定路径就一切ok,不需要做任何环境方面的配置,当然,能够使用的功能也仅限于系统提供的拓展,是没有办法添加如redis等拓展的。
下面就是此次开发环境搭建过程的记录:
首先登录腾讯云后台管理,点击创建实例,按照流程付费创建CVM实例,我选择的配置是CentOS 7.1 64位+单核CPU+1G 内存+20G 系统云盘+1Mbps 带宽,服务器月基础费用为45元,因为站点流量并不大,所以流量结算模式选择了按流量计算,为0.8元/G。
在创建向导中会要求设置服务器密码,远程连接的IP即是上图中的公网IP,账号默认是root,密码就是在创建流程中设置的。
首先我们需要先在本地安装一些开发辅助工具:
- FileZilla——ftp文件操作
- SSH Secure Shell——命令行操作工具
- MySQL-Front——mysql数据库管理工具,当然你也可以用navicat、mysql workbench等等,按习惯来就行
- 文本编辑器——我用的是Visual Studio Code,notepad++、sublime都可以,但这里还是安利一下vs code,至少颜值高
然后我们使用上述的IP、账号和密码分别通过FileZilla和SSH登录服务器,可视化文件+命令行,会比较方便。此时Mysql还没有安装,后面再说。
整个开发环境的搭建大致分四步,即nginx、mysql、php的编译安装以及实际项目配置。
Note:自我约定:下载的软件压缩包文件统一都放到 /usr/local/src 下,方便后续使用;软件安装位置统一到 /usr/local 下;
在所有软件安装前,先安装两个编译组件:
// 自动化编译套件
[root@localhost src]# yum -y install gcc automake autoconf libtool make
// g++编译器
[root@localhost src]# yum -y install gcc gcc-c++
1.Nginx
安装编译nginx所需的依赖包,pcre(重写Rewrite)、zlib(网页Gzip压缩)以及openssl(加密传输):
安装pcre:
[root@localhost src]# wget https://pilotfiber.dl.sourceforge.net/project/pcre/pcre/8.38/pcre-8.38.tar.gz
[root@localhost src]# tar -zxf pcre-8.38.tar.gz
[root@localhost src]# cd pcre-8.38
[root@localhost pcre-8.38]# ./configure --prefix=/usr/local/pcre
[root@localhost pcre-8.38]# make
[root@localhost pcre-8.38]# make install
Note: Linux编译安装中configure、make和make install各自的作用
安装zlib:
[root@localhost src]# wget http://zlib.net/zlib-1.2.8.tar.gz
[root@localhost src]# tar -zxf zlib-1.2.8.tar.gz
[root@localhost src]# cd zlib-1.2.8
[root@localhost zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@localhost zlib-1.2.8]# make && make install
Note: tar命令中参数的含义。x : 从 tar 包中把文件提取出来;z : 表示 tar 包是被 gzip 压缩过的,所以解压时需要用 gunzip 解压(如果是bz或bz2压缩包,这里使用参数“j”);v : 显示详细信息;f xxx.tar.gz : 指定被处理的文件是 xxx.tar.gz
安装openssl:
[root@localhost src]# wget http://www.openssl.org/source/openssl-1.0.1t.tar.gz
[root@localhost src]# tar -zxf openssl-1.0.1t.tar.gz
[root@localhost src]# cd openssl-1.0.1t
[root@localhost openssl-1.0.1t]# ./config --prefix=/usr/local/openssl
[root@localhost openssl-1.0.1t]# make && make install
[root@localhost openssl-1.0.1t]# export PATH=$PATH:/usr/local/openssl/bin
[root@localhost openssl-1.0.1t]# source /etc/profile
安装gd库:
[root@localhost src]# yum -y install gd-devel
依赖库安装ok后,开始安装nginx,首先下载nginx包,我下载的是1.10.1版本
[root@localhost src]# wget http://nginx.org/download/nginx-1.10.1.tar.gz
// 创建名字为nginx的组,后续配置nginx时用
[root@localhost nginx-1.10.1]# groupadd nginx
[root@localhost nginx-1.10.1]# useradd -g nginx nginx -s /bin/false
[root@localhost nginx-1.10.1]# tar -zxf nginx-1.10.1.tar.gz
[root@localhost nginx-1.10.1]# cd nginx-1.10.1
[root@localhost nginx-1.10.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.38 --with-zlib=/usr/local/src/zlib-1.2.8 --with-openssl=/usr/local/src/openssl-1.0.1t
[root@localhost nginx-1.10.1]# make && make install
安装成功后,启动nginx
[root@localhost nginx-1.10.2]# /usr/local/nginx/sbin/nginx
也可以将nginx配置成开机自启动,具体方法这里就不介绍了。另外注意一点,如果有开启防火墙的话是要关闭或者将80端口的权限赋予nginx的,不过腾讯云的服务器如果在创建CVM实例时使用了默认的安全组(即开放所有端口),那么这里就不需要修改了,不然请将安全组中的80端口开放。
以上步骤都操作成功后,这时直接访问公网IP会是nginx的默认页面。
2.Mysql
因为mysql从版本5.5开始使用cmake编译安装,所以先安装cmake。先使用命令“cmake --version”是否已经安装过了cmake,如果已安装会输出类似“cmake version 2.8.11”,否则进行如下操作
[root@localhost src]# wget http://www.cmake.org/files/v3.1/cmake-3.1.0.tar.gz
[root@localhost src]# tar -zxf cmake-3.1.0.tar.gz
[root@localhost src]# cd cmake-3.1.0
[root@localhost cmake-3.1.0]# ./configure --prefix=/usr/local/cmake
[root@localhost cmake-3.1.0]# make
[root@localhost cmake-3.1.0]# make install
[root@localhost cmake-3.1.0]# export PATH=$PATH:/usr/local/openssl/bin
[root@localhost cmake-3.1.0]# source /etc/profile
在安装cmake的过程中会使用openssl协议下载依赖文件,然后可能中途会出现“Download failed, error: 1;‘unsupported protocol‘”这种错误,这时候仔细看下错误内容,我看到的是说CMakeLists.txt在include某路径下某个包的时候没有找到,然后就去download,结果失败。如果是这样的话,可以直接把需要的包copy到指定目录,这样就会跳过download阶段。
然后把可能用到的两个库都装一下(如果已经安装了会跳过)
[root@localhost src]# yum -y install bison
[root@localhost src]# yum -y install git
然后下载mysql,我下载的是5.7.13版本
[root@localhost src]# wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.7.13.tar.gz
[root@localhost src]# tar -zxf mysql-5.7.13.tar.gz
[root@localhost src]# cd mysql-5.7.13
// 和nginx安装时一样,创建mysql组
[root@localhost mysql-5.7.13]# groupadd mysql
[root@localhost mysql-5.7.13]# useradd -g mysql mysql -s /bin/false
[root@localhost mysql-5.7.13]# mkdir -p /usr/local/mysql
// mysql数据存放目录
[root@localhost mysql-5.7.13]# mkdir -p /usr/local/mysql/data
[root@localhost mysql-5.7.13]# chown -R mysql:mysql /data/mysql
[root@localhost mysql-5.7.13]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
[root@localhost mysql-5.7.13]# make
[root@localhost mysql-5.7.13]# make install
[root@localhost mysql-5.7.13]# cd /usr/local/mysql
Note: 在编译mysql的过程中,有一点特别要注意(敲黑板,这里是重点),由于服务器内存为1G,而mysql编译过程中十分耗内存,因此在编译到一半左右,就会被系统杀掉编译进程导致失败,查看服务器资源监控是这样的,红色箭头就是在编译mysql
所以综合了百度来的解决方案后,这里需要在硬盘上划分一块区域用作交换分区,就是将内存放不下的内容暂时放到硬盘中,以免内存标红直接被杀死进程
// 获取要增加的2G的SWAP文件块
[root@localhost src]# dd if=/dev/zero of=/swapfile bs=1k count=2048000
// 创建SWAP文件
[root@localhost src]# mkswap /swapfile
// 激活SWAP文件
[root@localhost src]# swapon /swapfile
// 查看SWAP信息是否正确
[root@localhost src]# swapon -s
// 添加到fstab文件中让系统引导时自动启动
[root@localhost src]# echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab
使用完后可以删除
[root@localhost src]# swapoff /swapfile
[root@localhost src]# rm -fr /swapfile
mysql的编译过程极其漫长(如果服务器配置高一些可能会快点),耐心等就好。安装成功后开始配置mysql,第一步是初始化mysql数据库,这里要注意的是,在5.7版本之前,mysql是通过mysql_install_db脚本来进行初始化的,大致命令为
// 生成mysql系统数据库
[root@localhost mysql]# scripts/mysql_install_db --user=mysql --datadir=/data/local/mysql/data
而5.7版本之后,mysql_install_db被废弃,需要通过--initialize命令来初始化,具体流程如下:
// 创建mysql组
[root@localhost mysql]# groupadd mysql
// 新建msyql用户
[root@localhost mysql]# useradd -r -g mysql mysql
// 创建数据仓库目录
[root@localhost mysql]# mkdir /usr/local/mysql/data
// 更改文件夹所有者(注意后面的点
[root@localhost mysql]# chown -R mysql .
// 更改所属组,就是前面创建的group
[root@localhost mysql]# chgrp -R mysql .
// 初始化成功后会生成一个随机密码,注意保存
[root@localhost mysql]# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
[root@localhost mysql]# chown -R root .
// 更改data目录所有者为mysql
[root@localhost mysql]# chown -R mysql data
接着创建配置文件
// 将默认生成my.cnf改名或删除否则启动服务会报错
[root@localhost mysql]# mv /etc/my.cnf my.cnf.bak
[root@localhost mysql]# cd /usr/local/mysql/support-files
// 复制模板为新的配置文件,根据需要修改文件中配置选项
[root@localhost mysql]# cp my-default.cnf /etc/my.cnf
配置mysql自启动
// 复制启动文件
[root@localhost mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
// 增加执行权限
[root@localhost mysql]# chmod 755 /etc/init.d/mysql
// 加入自动启动项
[root@localhost mysql]# chkconfig --add mysql
// 设置MySQL在345等级自动启动
[root@localhost mysql]# chkconfig --level 345 mysql on
配置mysql系统环境变量
[root@localhost mysql]# vi /etc/profile
// 在文件最后添加以下两行
// PATH=/usr/local/mysql/bin:$PATH
// export PATH
// 然后保存退出
// 使环境变量及时生效
[root@localhost mysql]# source /etc/profile
启动mysql服务
# /usr/local/mysql/support-files/mysql.server start ---启动mysql服务
# /usr/local/mysql/support-files/mysql.server restart ---重启mysql
# /usr/local/mysql/support-files/mysql.server stop ---停止mysql服务
或者由于前面已经复制了启动文件
所以操作mysql服务可以换用如下命令
# /etc/init.d/mysql start ---启动mysql服务
# /etc/init.d/mysql restart ---重启mysql
# /etc/init.d/mysql stop ---停止mysql服务
然后第一次登录mysql时会要求修改在初始化数据库时生成的随机密码,不修改的话不允许后续操作,默认的root用户是root@localhost
[root@localhost mysql]# mysql -u root -p
password:
mysql> ALTER USER 'root'@'localhost' identified by '这里是新密码';
mysql> quit;
// 重新使用新密码登录
[root@localhost mysql]# mysql -u root -p
password:
mysql> show databases;
mysql> use mysql;
Note:补充几条mysql操作语句
- grant all privileges on *.* to root@'localhost'; ——授权
- flush privileges; ——刷新权限
3.PHP
首先安装必要工具和php编译时依赖库
[root@localhost src]# yum -y install libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel
安装php
[root@localhost src]# wget http://cn2.php.net/distributions/php-5.6.25.tar.gz
[root@localhost src]# tar -zxf php-5.6.25.tar.gz
[root@localhost src]# cd php-5.6.25
[root@localhost php-5.6.25]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-pdo-mysql=/usr/local/mysql --with-gd --with-png-dir --with-jpeg-dir --with-freetype-dir --with-xpm-dir=/usr/lib --with-zlib-dir=/usr/local/zlib --enable-bcmath --enable-shmop --enable-sysvsem --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-opcache --enable-pcntl --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --with-xmlrpc --enable-zip --enable-soap --without-pear --with-mcrypt --with-curl --with-mhash --with-openssl=/usr/local/openssl
Note:Linux的文件后缀名没啥用,基本就是用来看的,有时候下载下来的压缩包后缀名正确,但解压时会提示非指定类型文件,所以可以通过“file filename”命令来查看文件真实类型。比如
[root@localhost src]# file php-5.6.25.tar.gz
php-5.6.25.tar.gz: gzip compressed data, was "php-5.6.25.tar", from Unix, last modified: Fri Aug 19 04:07:58 2016, max compression
php安装还是蛮久的,过程中可能会提示某些库没安装,反正少什么就直接安装什么,然后按照提示一步步走下去就可以,php的安装整体上来说没什么坑
[root@localhost php-5.6.25]# make
[root@localhost php-5.6.25]# make test
[root@localhost php-5.6.25]# make install
然后就安装成功了,看吧,对比nginx和mysql,php确实简单很多。接下来就是配置php.ini以及php-fpm等,php.ini配置的思路和windows上差不多,无非是将编译后php默认提供的php.ini拷贝到php读取配置的目录中,查看php读取目录的命令是
[root@localhost php-5.6.25]# /usr/local/php/bin/php --ini
然后命令行中会显示“Configuration File (php.ini) Path: /usr/local/php/lib”,那么我们就将配置文件copy到lib下即可
[root@localhost php-5.6.25]# cp php.ini-production /usr/local/php/lib/php.ini
然后php.ini中具体的配置以及拓展的添加和windows中一样。然后是php-fpm的配置
[root@localhost php-5.6.25]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php54/etc/php-fpm.conf
// 去掉25行 ;pid = run/php-fpm.pid 前面的分号
// 第148行改为 user = nginx 设置php-fpm运行账号为nginx,因为我们安装nginx的时候用的是nginx这个用户,可以看上面的nginx安装那步
// 第149行改为 group = nginx #设置php-fpm运行组为nginx,和上面一个原理
// 设置socket的监听
// listen = /dev/shm/php-fpm.sock
// listen.owner = nginx
// listen.group = nginx
在php5.2之前的版本,listen这里一般都是写127.0.0.1:9000,在后续版本中,增加了php-fpm.sock即使用socket方式连接,包括nginx中也可以使用监听socket方式,由于socket是驻留在内存中的,因此nginx和php的响应速度都会显著增加。
设置php-fpm开机启动
[root@localhost php-5.6.25]# cp ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@localhost php-5.6.25]# chmod 0755 /etc/init.d/php-fpm
[root@localhost php-5.6.25]# chkconfig --level 35 php-fpm on
启动php-fpm
[root@localhost html]# /usr/local/php/sbin/php-fpm
// 由于我们已经把php-fpm加入了开机自启动,也就是加入了服务,所有,我就可以用这样的命令来控制php-fpm了:
[root@localhost html]# service php-fpm start|restart|stop|reload|status|force-quit
4.项目配置
主要就是修改nginx.conf,先贴一下我修改好的配置
user nginx;// 修改nginx的用户组为我们前面在编译nginx时创建的“nginx”组
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 128k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
#gzip on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6].";
server_names_hash_bucket_size 128;
client_max_body_size 100m;
client_header_buffer_size 256k;
large_client_header_buffers 4 256k;
server {
listen 80;
server_name XXX.XXX.XXX.XXX;// 这里配置成公网IP,则可以通过外网访问站点
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /usr/local/nginx/html/elittle/public; // 项目根路径
index index.php index.html index.htm; // 默认是没有index.php的,加上
try_files $uri $uri/ /index.php$is_args$query_string; // 路由rewrite,这里是将php默认的index.php?mdl=xx&cls=yy展示为http://host/xx/yy的形式
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; // 服务器错误的重定向
location = /50x.html {
root html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ .php$ { // 本站点的配置
root html/elittle/public;
fastcgi_pass unix:/dev/shm/php-fpm.sock; // 这里即是前面提到的监视socket,替代了过去的127.0.0.1:9000监视端口的方式
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; // 默认是/scripts$fastcgi_script_name,修改为$document_root
include fastcgi_params;
}
}
}
配置完毕后重启nginx即可。
Note:需要给web根目录下有读写需求的目录以权限,比如小站是使用laravel搭建的,laravel对于storage目录有读写要求,因此会出现服务器500页面一片空白的情况,因此进入项目根目录,执行“chmod -R 777 storage”即可。
以上,就是这一次折腾了两天下来的总结,希望能帮到和我一样的linux小白。有任何问题欢迎留言,互相学习。
本文主要参考自以下文章:
- Centos7安装Lnmp环境nginx1.10.1-php5.6.22/7.0.7-mysql5.7.11
- 腾讯云服务器php+mysq+nginx配置出现的问题及解决方法(亲测)
- [环境部署] 小技巧 lnmp(ngxin1.8+mysql5.6+php5.6)编译安装
- 在编译mysql5.7.12时在编译一半时出现错误,其实是邮于阿里vps内存不足所导致
- CentOS7安装MYSQL5.7.7