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小白。有任何问题欢迎留言,互相学习。



本文主要参考自以下文章: