共计 8544 个字符,预计需要花费 22 分钟才能阅读完成。
最近有个 ERP+PHP-web 测试页面环境部署需求,需要部署 nginx+php 的 cgi+socket 的模式、mysql 环境。查看服务端口是否起来,我们习惯使用 netstat 指令查看,所以如果你的系统里尚未安装 netstat,可直接安装 yum install -y net-tools 即可
实验环境:
Linux 版本:CentOS 7.2
nginx 版本:nginx-1.10.1
PHP 版本:php-5.6.5
mysql 版本:MariaDB-5.5.52
一、首先部署 nginx
把相关依赖包安装完毕
openssl-devel、zlib-devel `pcre-devel
程序默认是使用 nobody 身份运行的,我们使用 nginx 用户来运行,首先添加 Nginx 组和用户,不创建家目录,不允许登陆系统
#groupadd nginx
#useradd -M -s /sbin/nologin -g nginx nginx
安装 nginx 採取的是 nginx-1.10.1.tar.gz
# tar xf nginx-1.10.1.tar.gz
# cd nginx-1.10.1
指定安装目录和运行时用的属主和属组,并启用状态监控模块等
# ./configure \
–prefix=/usr/local/nginx \
–pid-path=/usr/local/nginx/logs/nginx.pid \
–lock-path=/var/lock/nginx.lock \
–user=nginx \
–group=nginx \
–with-http_ssl_module \
–with-http_flv_module \
–with-http_stub_status_module \
–with-http_gzip_static_module \
–http-client-body-temp-path=/var/tmp/nginx/client/ \
–http-proxy-temp-path=/var/tmp/nginx/proxy/ \
–http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
–http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
–http-scgi-temp-path=/var/tmp/nginx/scgi \
–with-pcre
大致的配置结果
Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1: using OpenSSL library
+ using system zlib library
nginx path prefix: “/usr/local/nginx”
nginx binary file: “/usr/local/nginx/sbin/nginx”
nginx modules path: “/usr/local/nginx/modules”
nginx configuration prefix: “/usr/local/nginx/conf”
nginx configuration file: “/usr/local/nginx/conf/nginx.conf”
nginx pid file: “/var/run/nginx/nginx.pid”
nginx error log file: “/usr/local/nginx/logs/error.log”
nginx http access log file: “/usr/local/nginx/logs/access.log”
nginx http client request body temporary files: “/var/tmp/nginx/client/”
nginx http proxy temporary files: “/var/tmp/nginx/proxy/”
nginx http fastcgi temporary files: “/var/tmp/nginx/fcgi/”
nginx http uwsgi temporary files: “/var/tmp/nginx/uwsgi”
nginx http scgi temporary files: “/var/tmp/nginx/scgi”
上述配置完,就进行编译安装
#make && make install
#mkdir /var/tmp/nginx/client/ -pv
等编译安装完成后在 /usr/local 下就会出现 nginx 这个目录了,进入这个目录后发现目录非常简单。
它的配置文件存放在 conf 目录中,网页文件存放在 html 中,日志文件存放在 logs 中,
sbin 目录下只有一个可执行程序 “nginx”
二、部署 php 环境
a. FastCGI 是一个可伸缩地、高速地在 HTTP server 和动态脚本语言间通信的接口
b. Nginx 是个轻量级的 HTTP server,必须借助第三方的 FastCGI 处理器才可以对 PHP 进行解析
c. PHP-FPM 是一个第三方的 FastCGI 进程管理器,它是作为 PHP 的一个补丁来开发的,在安装的时候也需要和 PHP 源码一起编译,
也就是说 PHP-FPM 被编译到 PHP 内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比 spawn-fcgi 引擎好很多,
因此,推荐 Nginx+PHP/PHP-FPM 这个组合对 PHP 进行解析。
首先安装 php 的一些依赖包
gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel
然后解压下载好的 tar 包
# tar -xvzf php-5.6.5.tar.gz
进入到解压后的 php-5.6.5 中
# cd php-5.6.5
# ./configure –prefix=/usr/local/php –enable-fpm –enable-mbstring –with-mysql=mysqlnd –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd
# make && make install
查看 php 版本
# php -v
PHP 5.6.5 (cli) (built: Jan 10 2017 03:53:13)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
如果不行,则直接在 php 的执行文件做个软链接到 /usr/bin/php 或者复制一份至 /usr/bin/ 下面即可查看 PHP 版本啦
#ln -s /usr/local/php/bin/php /usr/bin/php
或者
#cp -raf /usr/local/php/bin/php /usr/bin/php
php 的配置文件 php.ini,复制一份安装目录下的 php.ini-development 这个配置文件模板到 php 的目录
# cp -raf php-5.6.5/php.ini-development /usr/local/php/lib/php.ini
当然,我们还需要配置一下 php-fpm,在安装 php 的时候,已经为我们生成了一个配置模板了,在 /usr/local/php/etc/php-fpm.conf.default 了,所以只要复制这个模板并改名为 php-fpm.conf 就可以了,进去把 daemonize 改成 yes,以后台服务的运行方式启动。然后捏,whereis php-fpm,
这个是个可执行文件,直接执行 php-fpm 就可以运行了,然后 netstat -an| grep php-fpm,看到,果然 9000 号端口在监听啦
#cp -raf /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
# whereis php-fpm
配置与优化 PHP-FPM
PHP 的全局配置文件是 php.ini,在上面的步骤中,已经将此文件复制到了 /usr/local/php/lib/php.ini 下。可以根据每个应用需求的不同,对 php.ini 进行相应的配置。
下面重点介绍 PHP-FPM 引擎的配置文件。
根据上面指定的安装路径,PHP-FPM 的默认配置文件为 /usr/local/php/etc/php-fpm.conf。
php-fpm.conf 是一个 XML 格式的纯文本文件,其内容很容易看明白。这里重点介绍几个重要的配置标签:
标签 listen_address 是配置 fastcgi 进程监听的 IP 地址以及端口,默认是 127.0.0.1:9000,端口可更改
<value name=”listen_address”>127.0.0.1:9000</value>
标签 display_errors 用来设置是否显示 PHP 错误信息,默认是 0,不显示错误信息,设置为 1 可以显示 PHP 错误信息。
<value name=”display_errors”>0</value>
标签 user 和 group 用于设置运行 FastCGI 进程的用户和用户组。需要注意的是,这里指定的用户和用户组要和 Nginx 配置文件中指定的用户和用户组一致。
<value name=”user”>nobody</value>
<value name=”group”>nobody</value>
标签 max_children 用于设置 FastCGI 的进程数。根据官方建议,小于 2GB 内存的服务器,可以只开启 64 个进程,4GB 以上内存的服务器可以开启 200 个进程。
<value name=”max_children”>5</value>
标签 request_terminate_timeout 用于设置 FastCGI 执行脚本的时间。默认是 0s,也就是无限执行下去,可以根据情况对其进行修改。
<value name=”request_terminate_timeout”>0s</value>
标签 rlimit_files 用于设置 PHP-FPM 对打开文件描述符的限制,默认值为 1024。这个标签的值必须和 Linux 内核打开文件数关联起来,例如要将此值设置为 65535,
就必须在 Linux 命令行执行 ’ulimit -HSn 65536’。
<value name=”rlimit_files”>1024</value>
标签 max_requests 指明了每个 children 最多处理多少个请求后便会被关闭,默认的设置是 500。
<value name=”max_requests”>500</value>
标签 allowed_clients 用于设置允许访问 FastCGI 进程解析器的 IP 地址。如果不在这里指定 IP 地址,Nginx 转发过来的 PHP 解析请求将无法被接受。
<value name=”allowed_clients”>127.0.0.1</value>
管理 FastCGI 进程, 在配置完 php-fpm 后,就可以启动 FastCGI 进程
/usr/local/php/sbin/php-fpm
FastCGI 进程启动后,其监听的 IP 地址和端口也随即启动,可以通过 ps 和 netstat 查看相关信息
由于Nginx 本身不会对 PHP 进行解析,因此要实现 Nginx 对 PHP 的支持,其实是将对 PHP 页面的请求交给 fastCGI 进程监听的 IP 地址及端口。
如果把 php-fpm 当做动态应用服务器,那么 Nginx 其实就是一个反向代理服务器。Nginx 通过反向代理功能实现对 PHP 的解析,这就是 Nginx 实现 PHP 动态解析的原理
Nginx 配置文件的路径为 /usr/local/nginx/conf/nginx.conf。下面是在 Nginx 下支持 PHP 解析的一个虚拟主机配置实例
# vi /usr/local/nginx/conf/nginx.conf
fastcgi_param 指令指定放置 PHP 动态程序的主目录,也就是 $fastcgi_script_name 前面指定的路径,这里是 /usr/local/nginx/html 目录
fastcgi_params 文件是 FastCGI 进程的一个参数配置文件,在安装 Nginx 后,会默认生成一个这样的文件,这里通过 include 指令将 FastCGI 参数配置文件包含了进来
在配置完成 Nginx+FastCGI 之后,为了保证 Nginx 下 PHP 环境的高速稳定运行,需要添加一些 FastCGI 优化指令。下面给出一个优化实例,
将下面代码添加到 Nginx 主配置文件中的 HTTP 层级
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
# fastcgi_cache TEST;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
}
下面是对上述代码的含义进行介绍。
第一行代码是为 FastCGI 缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。
fastcgi_connect_timeout 指定���接到后端 FastCGI 的超时时间。
fastcgi_send_timeout 指定向 FastCGI 传送请求的超时时间,这个值是已经完成两次握手后向 FastCGI 传送请求的超时时间。
fastcgi_read_timeout 指定接收 FastCGI 应答的超时时间,这个值是已经完成两次握手后接收 FastCGI 应答的超时时间。
fastcgi_buffer_size 用于指定读取 FastCGI 应答第一部分需要用多大的缓冲区,这个值表示将使用 1 个 64KB 的缓冲区读取应答的第一部分(应答头),可以设置为 fastcgi_buffers 选项指定的缓冲区大小。
fastcgi_buffers 指定本地需要用多少和多大的缓冲区来缓冲 FastCGI 的应答请求。如果一个 PHP 脚本所产生的页面大小为 256KB,那么会为其分配 4 个 64KB 的缓冲区来缓存;如果页面大小大于 256KB,那么大于 256KB 的部分会缓存到 fastcgi_temp 指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中 PHP 脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为 256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。
fastcgi_busy_buffers_size 的默认值是 fastcgi_buffers 的两倍。
fastcgi_temp_file_write_size 表示在写入缓存文件时使用多大的数据块,默认值是 fastcgi_buffers 的两倍。
fastcgi_cache 表示开启 FastCGI 缓存并为其指定一个名称。开启缓存非常有用,可以有效降低 CPU 的负载,并且防止 502 错误的发生,但是开启缓存也会引起很多问题,要视具体情况而定。
fastcgi_cache_valid、fastcgi 用来指定应答代码的缓存时间,实例中的值表示将 200 和 302 应答缓存一个小时,将 301 应答缓存 1 天,其他应答均缓存 1 分钟。
测试 Nginx 对 PHP 的解析功能
这里在 /usr/local/nginx/html 目录下创建一个 phpinfo.php 文件,内容如下:
<?php phpinfo(); ?>
然后通过浏览器访问 http://ip/index.html,默认会在浏览器显示“Welcome to Nginx!”表示 Nginx 正常运行。
接着在浏览器中访问 http://ip/phpinfo.php,如果 PHP 能够正常解析,会出现 PHP 安装配置以及功能列表统计信息。
三.yum 安装 Mariadb 数据库
删除全部 MySQL/MariaDB 相关的 rpm 包
MySQL 已经不再包含在 CentOS 7 的源中,而改用了 MariaDB;
1、使用 rpm -qa | grep mariadb 搜索 MariaDB 现有的包:
如果存在,使用 rpm -e –nodeps mariadb-* 将全部删除
2、使用 rpm -qa | grep mysql 搜索 mysql 现有的包:
如果存在,使用 yum remove mysql mysql-server mysql-libs compat-mysql 全部删除;
我比较推荐使用系统自带的 mariadb, 所以直接 yum 安装比较方便
3、yum 安装 mariadb
# yum install -y mariadb mariadb-server
注:mariadb 为数据库客户端,mariadb-server 是数据库服务器端
4、命令启动 MariaDB 服务
# systemctl start mariadb
5、查看 mariadb 进程服务是否在跑
# ps -ef | grep mariadb
root 10131 10095 0 19:24 pts/2 00:00:00 grep –color=auto mariadb
mysql 10197 10009 0 Jan19 ? 15:56:01 /usr/sbin/mysqld –basedir=/usr –datadir=/var/lib/mysql –plugin-dir=/usr/lib64/mysql/plugin –user=mysql –log-error=/var/log/mariadb/mariadb.log –pid-file=/var/lib/mysql/zgz.pid –socket=/var/lib/mysql/mysql.sock
6、查看数据库状态
#systemctl status mariadb
7、接着运行 mysql_secure_installation 初始化配置 MariaDB:
#mysql_secure_installation
在这个阶段进入时 root 初始密码为空,所以回车即可。我个人觉得可以选择在这个时候修改设定数据库 root 密码,然后接下来的设定中,除了 Disallow root login remotely、Remove test database and accesss to it 可以为 n,其他都是 y
8、登录 MariaDB 并创建相应的数据库用户与数据库
(1) 使用 mysql -uroot - p 登录,回车之后会提示输入密码。
(2)创建新用户,CREATE USER ‘git’@’localhost’ IDENTIFIED BY ‘$password’; 其中 $password 填写自己设置的密码。当然后面也可以修改;
(3)设置存储引擎
mariadb[none]> set storage_engine=INNODB;
(4)创建数据库
mariadb[none]>create database database_name character set utf8;
(5) 设置用户权限
grant all privileges on *.* to ‘root’@’%’ identified by ‘$password’ with option;
#上述可以定义为:root 用户可以从任何机器上远程连接数据库里的所有内容且具备最高权限,并且具有授予权他人远程连接的权限。
经过上述操作步骤,lnmp 环境就算是基本搭建完毕。后面只需要把应用代码放进 Nginx 的 html 内,并将应用与数据库连接的配置文件设定完毕即可。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-05/143733.htm