在各种网站服务器软件中,除了 Apache HTTP Server 外,还有一款轻量级的 HTTP服务器软件--Nginx,由俄罗斯的 lgor Sysoev 开发,其稳定、高效的特性逐渐被越来越多的用户认可。本章将讲解 Nginx 服务的基本构建、访问控制方式、虚拟主机的搭建,还有应用广泛的 LNMP 架构服务器的部署方式,并对 PHP FPM 模块如何支持 PHP 语言进行讨论。
一、Nginx服务基础
Nginx(发音为[enginex)专为性能优化而开发,其最知名的优点是它的稳定性和低系统资源消耗,以及对 HTTP 并发连接的高处理能力(单台物理服务器可支持 30000~50000个并发请求)。正因为如此,大量提供社交网络、新闻资讯、电子商务及虚拟主机等服务的企业纷纷选择 Nginx 来提供 Web 服务。
本节将介绍 Nginx 的安装配置方法。
1.1 Nginx 1.12 安装及运行控制
Nginx 安装文件可以从官方网站 http:/hwwww.nginx.org/下载。下面以稳定版 Nginx1.12.0为例,介绍 Nginx 的安装和运行控制。
1.编译安装 Nginx
(1)安装支持软件
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install pcre-devel zlib-devel gcc* openssl-devel
(2)创建运行用户、组
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
(3)编译安装 Nginx
[root@localhost ~]# tar zxvf nginx-1.12.0.tar.gz
[root@localhost ~]# cd nginx-1.12.0
[root@localhost nginx-1.12.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_stub_status_module
[root@localhost nginx-1.12.0]# make&&make install
[root@localhost nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.12.0]# ls -l /usr/local/sbin/nginx
2.Nginx 的运行控制
(1)检查配置文件
[root@localhost ~]# nginx -t
(2)启动、停止 Nginx
[root@localhost ~]# nginx
[root@localhost ~]# netstat -anpt | grep nginx
[root@localhost ~]# yum -y install elinks
[root@localhost ~]# elinks http://localhost
[root@localhost ~]# yum install -y psmisc
备注:
psmisc提供killall命令
[root@localhost ~]# killall -s HUP nginx
//重载,选项 -s HUP 等同于 -1 :killall -1 nginx
[root@localhost ~]# killall -s QUIT nginx
//关闭,选项 -s QUIT 等同于 -3:killall -3 nginx
(3)添加 Nginx 系统服务
[root@localhost ~]# vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 20
#description:Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
pkill nginx
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
[root@localhost ~]# chmod +x /etc/init.d/nginx
[root@localhost ~]# chkconfig --add nginx
[root@localhost ~]# systemctl status nginx
1.2配置文件 nginx.conf
1.全局配置
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
#user nobody; ##运行用户
worker_processes 1; ##工作进程数量
#error_log logs/error.log; ##错误日志文件的位置
#pid logs/nginx.pid; ##PID 文件的位置
2.I/O 事件配置
events {
use epoll; ##使用 epoll 模型
worker_connections 4096; ##每进程处理 4096 个连接
}
备注:
epoll模式能够提高并发连接,并支持非活跃连接
3.HTTP 配置
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name www.benet.com;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
4.访问状态统计
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
http {
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
index index.html index.htm;
}
location /status {
stub_status on;
access_log off;
}
}
}
[root@localhost ~]# systemctl restart nginx
二、Nginx 访问控制
2.1基于授权的访问控制
1.基于授权的访问控制简介
Nginx与 Apahce 一样,可以实现基于用户授权的访问控制,当客户端想要访问相应网站或者目录时,要求用户输入用户名和密码才能正常访问,配置步骤与 Apache 基本一致。
概括为以下几个步骤。
- 生成用户密码认证文件。
- 修改主配置文件相对应目录,添加认证配置项。
- 重启服务,访问测试。
2.基于授权的访问控制步骤
(1)使用 htpasswd 生成用户认证文件
[root@localhost ~]# yum -y install httpd-tools
备注:
httpd-tools提供了htpasswd命令
[root@localhost ~]# htpasswd -c /usr/local/nginx/passwd.db test
root@localhost ~]# cat /usr/local/nginx/passwd.db
(2)修改密码文件权限为 400,将所有者改为 nginx,设置 Nginx 的运行用户能够读取
[root@localhost ~]# chmod 400 /usr/local/nginx/passwd.db
[root@localhost ~]# chown nginx /usr/local/nginx/passwd.db
[root@localhost ~]# ll -d /usr/local/nginx/passwd.db
(3)修改主配置文件 nginx.conf,添加相应认证配置项
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
(4)检测语法、重启服务
[root@localhost ~]# nginx -t
[root@localhost ~]# systemctl restart nginx
(5)用浏览器访问网址,检验控制效果
2.2基于客户端的访问控制
1.基于客户端的访问控制简介
- deny IP/IP段:拒绝某个IP或IP段的客户端访问。
- allow IP/IP段:允许某个IP或IP段的客户端访问。
- 规则从上往下执行,如匹配则停止,不再往下匹配。
2.基于客户端的访问控制步骤
(1)修改主配置文件 nginx.conf,添加相应配置项
location / {
root html;
index index.html index.htm;
# auth_basic "secret";
# auth_basic_user_file /usr/local/nginx/passwd.db;
deny 192.168.10.3;
allow all;
}
(2)重启服务器访问网址,页面已经访问不到
三、Nginx 虚拟主机
提示:将参数还原
location / {
root html;
index index.html index.htm;
# auth_basic "secret";
# auth_basic_user_file /usr/local/nginx/passwd.db;
# deny 192.168.10.3;
# allow all;
}
1.基于域名的虚拟主机
(1)设置客户端域名解析
修改hosts 文件,加入www.benet.com 和 www.accp.com 这两个域名
192.168.10.101 www.benet.com
192.168.10.101 www.accp.com
(2)准备各个网站的目录和测试首页
[root@localhost ~]# mkdir -p /var/www/html/benet/
[root@localhost ~]# mkdir -p /var/www/html/accp/
[root@localhost ~]# echo "www.benet.com">> /var/www/html/benet/index.html
[root@localhost ~]# echo "www.accp.com">>/var/www/html/accp/index.html
(3)修改配置文件
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.benet.com;
access_log logs/www.benet.com.access.log;
charset utf-8;
location / {
root /var/www/html/benet;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html {
root html;
}
}
server {
listen 80;
server_name www.accp.com;
access_log logs/www.accp.com.access.log;
charset utf-8;
location / {
root /var/www/html/accp;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html {
root html;
}
}
[root@localhost ~]# nginx -t
[root@localhost ~]# systemctl restart nginx
(4)测试
2.基于 IP 的虚拟主机
(1)为服务器设置多个IP地址
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:1
[root@localhost network-scripts]# vim ifcfg-ens33:0
IPADDR=192.168.10.151
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
DNS1=223.6.6.6
NAME=ens33:0
DEVICE=ens33:0
[root@localhost network-scripts]# vim ifcfg-ens33:1
IPADDR=192.168.10.152
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
DNS1=223.6.6.6
NAME=ens33:1
DEVICE=ens33:1
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip add
(2)修改 Nginx的配置文件,使基于 IP 的虚拟主机生效
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 192.168.10.151:80;
server_name www.benet.com;
.....
}
server {
listen 192.168.10.152:80;
server_name www.accp.com;
.....
}
[root@localhost ~]# systemctl restart nginx
(3)访问两个IP网站,测试页面是否生效
3.基于端口的虚拟主机
(1)选择系统中不使用的端口,多个端口映射到同一 IP 地址
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 192.168.10.101:8080;
server_name www.benet.com;
.....
}
server {
listen 192.168.10.101:8888;
server_name www.accp.com;
.....
}
[root@localhost ~]# systemctl restart nginx
(2)检测端口是否运行正常
[root@localhost ~]# netstat -anpt | grep nginx
(3)分别访问 2 个端口地址
四、LNMP 架构部署及应用
4.1构建 LNMP 网站平台
1.安装 MySQL 服务
(1)编译安装 MySQL 服务
[root@www ~]# yum install -y autoconf
备注:
初始化mysql需要autoconf,它是自动化配置脚本生成工具,安装自动化脚本生成工具
[root@localhost ~]# yum -y install ncurses-devel gcc-c++ perl-Module-Install cmake
备注:
ncurses是字符终端下屏幕控制的基本库,大多数的 Linux 实用程序仅仅只在屏幕的底部滚动文本。如果你想在屏幕中放置你的文本,例如一个游戏或者一个数据展示,你可以试试 ncurses。
curses 是一个旧的 Unix 库,它可以在文本终端界面控制光标。curses 的名称就来自于术语 " 光标控制(cursor control)"。
[root@localhost ~]# tar -zxvf mysql-5.6.36.tar.gz
[root@localhost ~]# cd mysql-5.6.36/
[root@localhost mysql-5.6.36]# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DSYSCONFDIR=/etc
[root@localhost mysql-5.6.36]# make && make install
GCC,它是个shell脚本。这一步一般用来生成 Makefile,为下一步的编译做准备
make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
(2)复制配置文备注
CMake是一个跨平台的安装工具,可以用简单的语句来描述所有平台的安装(编译过程)。
-DDEFAULT_COLLATION:用于指定数据集如何排序,以及字符串的比对规则
常用的编译工具有cmake和configure。一般来说,程序安装既支持cmake安装也支持configure安装,因此解压后的程序包会包含cmake文件和configure文件。我们可以选择其中之一进行安装。cmke相对于configure来说编译更智能,可自动搜索文件夹下所包含的所有编译文件进行编译,但对于我这样的初学者感受不是很明显。使用其中一种方法编译失败时,可以尝试用另一种方法。
./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或件到/etc 下,并把 MySQL 添加到服务
[root@localhost mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
[root@localhost mysql-5.6.36]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql-5.6.36]# chmod +x /etc/rc.d/init.d/mysqld
[root@localhost mysql-5.6.36]# chkconfig --add mysqld
[root@localhost mysql-5.6.36]# chkconfig mysqld on
[root@localhost mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin">> /etc/profile
[root@localhost mysql-5.6.36]# . /etc/profile
(3)初始化数据库
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -M -s /sbin/nologin mysql -g mysql
[root@localhost ~]# chown -R mysql.mysql /usr/local/mysql
[root@localhost ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
(4)启动 mysql,并设置密码
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysqladmin -u root password '123.com'
2.安装 PHP 解析环境
(1)编译安装 PHP
[root@localhost ~]# yum -y install gd libxml2-devel libjpeg-devel libpng-devel
备注:
libxml2-devel:libxml是一个用来解析XML文档的函数库
libjpeg-devel #是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现
libpng-devel #libpng 是一套免费的、公开源代码的程序库,支持对 PNG 图形文件的创建、读写等操作
GD指的是Graphic Device,PHP的GD库是用来处理图形的扩展库,通过GD库提供的一系列API,可以对图像进行处理或者直接生成新的图片。PHP除了能进行文本处理以外,通过GD库,可以对JPG、PNG、GIF、SWF等图片进行处理
zlib-devel #Zlib是一个压缩和解压模块
[root@localhost ~]#tar -zxvf php-5.5.38.tar.gz
[root@localhost ~]#cd php-5.5.38/
[root@localhost php-5.5.38]# ./configure \
--prefix=/usr/local/php5 \
--with-gd \
--with-zlib \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-config-file-path=/usr/local/php5 \
--enable-mbstring \
--enable-fpm \
--with-jpeg-dir=/usr/lib
备注:
如果使用yum安装mariadb数据库,则配置参数如下:
[root@localhost php-5.5.38]# ./configure \
--prefix=/usr/local/php5 \
--with-gd \
--with-zlib \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-config-file-path=/usr/local/php5 \
--enable-mbstring \
--enable-fpm \
--with-jpeg-dir=/usr/lib
备注:
可简化参数为如下:
./configure \
--prefix=/usr/local/php5 \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-config-file-path=/usr/local/php5 \
--enable-mbstring \
--enable-fpm
注意:
--with-mysqli=mysqlnd需要用ip地址的方式连接数据库,既可以是php和mysql装在同一个服务器,也可以装在不同的服务器。用127.0.0.1本地连接不需要为连接授权,用192.168.10.101连接需要授权,哪怕连接本地数据库。
--with-mysqli=/usr/bin/mysql_config需要用localhost连接数据库,只能用于本地连接,也就是php和mysql装在同一个服务器上
[root@localhost php-5.5.38]# make && make install
(2)安装后调整
[root@localhost php-5.5.38]# cp php.ini-development /usr/local/php5/php.ini
[root@localhost php-5.5.38]# ln -s /usr/local/php5/bin/* /usr/local/bin/
[root@localhost php-5.5.38]# ln -s /usr/local/php5/sbin/* /usr/local/sbin/
(3)安装 ZendGuardLoader
[root@localhost ~]# tar -zxvf zend-loader-php5.5-linux-x86_64_update1.tar.gz
[root@localhost ~]# cd zend-loader-php5.5-linux-x86_64/
[root@localhost zend-loader-php5.5-linux-x86_64]# cp ZendGuardLoader.so /usr/local/php5/lib/php/
[root@localhost zend-loader-php5.5-linux-x86_64]# vim /usr/local/php5/php.ini
添加下列内容:
zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so
zend_loader.enable=1
3.配置 Nginx 支持 PHP 环境
(1)启用 php-fpm 进程
[root@localhost ~]# cd /usr/local/php5/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# useradd -M -s /sbin/nologin php
[root@localhost etc]# vim php-fpm.conf
pid = run/php-fpm.pid
user = php
group = php
pm.max_children = 50 ##最多子进程数
pm.start_servers = 20 ##启动时开启的进程数
pm.min_spare_servers = 5 ##最少空闲进程数
pm.max_spare_servers = 35 ##最多空闲进程数
[root@localhost etc]# /usr/local/sbin/php-fpm
[root@localhost etc]# netstat -anpt | grep php-fpm
[root@localhost etc]# vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 20
#description:Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
PROG_FPM="/usr/local/sbin/php-fpm"
PIDF_FPM="/usr/local/php5/var/run/php-fpm.pid"
case "$1" in
start)
$PROG
$PROG_FPM
;;
stop)
pkill nginx
pkill php-fpm
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
kill -s HUP $(cat $PIDF_FPM)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart nginx
(2)配置 Nginx 支持 PHP 解析
第一种方法:转给其他 Web 服务器处理
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
Server{
root /var/www/kgc/bbs;
location ~ \.php$ {
proxy_pass http://192.168.10.101:80;
}
}
第二种方法:调用本机的 php-fpm 进程(本案例采用该方法)
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
Server{
listen 80;
server_name www.bt.com;
location / {
root /var/www/html;
index index.html index.htm index.php;
}
location ~ \.php$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
备注:
Nginx 与 php-fpm 通信过程是通过 nginx 的 fastcgi 模块来处理的,即 fastcgi 模块将来自客户端的关于 php 文件的请求转发给 php-fpm 来处理。既然是转发请求,那么必须要遵循一定的协议,也就是 fastcgi.conf 所规定的协议了。
原本只有fastcgi_params文件,fastcgi.conf是nginx 0.8.30 才引入的。主要为是解决以下问题:
原本Nginx只有fastcgi_params,后来发现很多人在定义SCRIPT_FILENAME时使用了硬编码的方式。
例如,fastcgi_param SCRIPT_FILENAME /var/www/foo$fastcgi_script_name。
于是为了规范用法便引入了fastcgi.conf。
(3)PHP 页面访问测试
[root@localhost ~]# mkdir -p /var/www/html/
[root@localhost ~]# vim /var/www/html/test1.php
<?php
phpinfo();
?>
[root@localhost ~]# vim /var/www/html/test2.php
<?php
$link=mysqli_connect('127.0.0.1','root','pwd123');
if($link) echo "<h1>恭喜你,数据库连接成功啦!!!</h1>";
mysqli_close($link);
?>
4.2在 LNMP 平台中部署 Web 应用
1.下载并部署程序代码
[root@localhost ~]# yum -y install unzip
[root@localhost ~]# unzip Discuz_X3.3_SC_UTF8.zip
[root@localhost ~]# mkdir -p /var/www/html/bbs
[root@localhost ~]# mv upload/* /var/www/html/bbs
[root@localhost ~]# chown -R php:php /var/www/html/bbs/
2.创建数据库
[root@localhost ~]# mysql -uroot -p
mysql>create database bbs;
mysql>grant all on bbs.* to runbbs@127.0.0.1 identified by 'bbs123';
mysql>grant all on bbs.* to runbbs@'localhost' identified by 'bbs123';
3.安装 Web 应用
访问服务器 URL 地址,对网站进行初始化