第16章 Nginx服务器企业实战

1.1 Nginx WEB服务器企业实战

万维网 (WORLD WIDE WEB,WWW)服务器,也称之为WEB服务器,主要功能是提供网上信息浏览服务。目前主流的WEB服务器软件包括:Apache、Nginx、Lighttpd、IIS、Resin、Tomcat、WebLogic、Jetty。

本章向读者介绍Nginx高性能WEB服务器、Nginx工作原理、安装配置及升级、Nginx配置文件深入剖析、Nginx虚拟主机、Location案例演示、Nginx Rewirte企业案例实战、HTTPS安全WEB服务器及Nginx高性能集群实战等。

1.2 Nginx WEB入门简介

Nginx (“engine x”) 是一个高性能HTTP 和 反向代理 服务器、IMAP、POP3、SMTP 服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

由于Nginx的高性能、轻量级,目前越来越多的互联网企业开始使用Nginx WEB服务器。据Netcraft统计,在2017年4月份,世界上最繁忙的网站中有28.72 %使用Nginx作为其服务器或者代理服务器。

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.

For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler.

According to Netcraft, nginx served or proxied 28.72% busiest sites in April 2017. Here are some of the success stories: Netflix,Wordpress.com, FastMail.FM.

The sources and documentation are distributed under the 2-clause BSD-like license.

Commercial support is available from Nginx, Inc.

它已经在众多流量很大的俄罗斯网站上使用了很长时间,这些网站包括Yandex、Mail.Ru、VKontakte,以及Rambler。目前互联网主流公司京东、360、百度、新浪、腾讯、阿里都在使用Nginx作为自己的WEB服务器。

Nginx特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。

Nginx相对于Apache优点如下:

  • 高并发响应性能非常好,官方Nginx处理静态文件并发5w/s;
  • 负载均衡及反向代理性能非常强;
  • 系统内存和CPU占用率低;
  • 可对后端服务进行健康检查;
  • 支持PHP cgi方式和FastCGI方式;
  • 可以作为缓存服务器、邮件代理服务器;
  • 配置代码简洁且容易上手。

1.3 Nginx安装配置

Nginx WEB安装时可以指定很多的模块,默认需要安装Rewrite模块,也即是需要系统有PCRE库,安装Pcre支持Rewrite功能。如下为安装Nginx WEB服务器方法:

源码的路径,而不是编译后的路径,否则会报错。

#安装PCRE库支持

yum install pcre-devel pcre -y

#下载Nginx源码包

cd /usr/src

wget -c http://nginx.org/download/nginx-1.12.0.tar.gz

#解压Nginx源码包

tar -xzf nginx-1.12.0.tar.gz

#进入解压目录,然后sed修改Nginx版本信息为JWS

cd nginx-1.12.0 ; sed -i -e ‘s/1.12.0//g’ -e ‘s/nginx\//JWS/g’ -e

‘s/”NGINX”/”JWS”/g’ src/core/nginx.h

#预编译Nginx

useradd www ;./configure –user=www –group=www –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module

#.configure预编译成功后,执行make命令进行编译

make

#make执行成功后,执行make install 正式安装

make install

#至此Nginx WEB服务器安装完毕。

测试Nginx服务安装是否正确,同时启动Nginx WEB 服务,代码命令如下:

/usr/local/nginx/sbin/nginx -t 检查nginx配置文件是否正确,返回OK即正确。

[root@localhost ~]# /usr/local/nginx/sbin/nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@localhost ~]#

然后启动nginx,/usr/local/nginx/sbin/nginx 回车即可。查看进程是否已启动:

[root@localhost ~]# ps -ef |grep nginx

nobody 5381 30285 0 May16 ? 09:04:31 nginx: worker process

root 30285 1 0 2017 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx

root 32260 32220 0 12:34 pts/0 00:00:00 grep nginx

[root@localhost ~]#

通过浏览器访问Nginx默认测试页面,如图14-3所示:

图14-3 Nginx WEB浏览器访问

1.4 Nginx管理及升级

Nginx WEB服务器安装完毕,可以执行如下命令对其进管理和维护,命令如下:

#查看nginx进程

ps -ef|grep nginx

#平滑启动nginx

kill -HUP `cat /var/run/nginx.pid`

或者

nginx -s reload

其中进程文件路径在配置文件nginx.conf中可以找到。

平滑启动的意思是在不停止nginx的情况下,重启nginx,重新加载配置文件,启动新的工作线程,完美停止旧的工作线程。

#完美停止nginx

kill -QUIT `cat /var/run/nginx.pid`

#快速停止nginx

kill -TERM `cat /var/run/nginx.pid`

或者

kill -INT `cat /var/run/nginx.pid`

#完美停止工作进程(主要用于平滑升级)

kill -WINCH `cat /var/run/nginx.pid`

#强制停止nginx

pkill -9 nginx

#检查对nginx.conf文件的修改是否正确

nginx -t -c /etc/nginx/nginx.conf 或者 nginx -t

#停止nginx的命令

nginx -s stop或者pkill nginx

#查看nginx的版本信息

nginx -v

#查看完整的nginx的配置信息

nginx -V

Nginx WEB服务器定期更新,如果需要将低版本升级或者将高版本降级,升级或者降级方法如下,分为四个步骤,包括软件下载、预编译、编译、配置,具体方法如下:

wget http://www.nginx.org/download/nginx-1.4.2.tar.gz

获取旧版本nginx的configure选项

/usr/local/nginx/sbin/nginx -V

编译新版本的Nginx

tar -xvf nginx-1.4.2.tar.gz

cd nginx-1.4.2

./configure –prefix=/usr/local/nginx –user=www –group=www –with-http_stub_status_module –with-http_ssl_module

make

备份旧版本的nginx可执行文件,复制新版本的nginx这行文件

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

cp objs/nginx /usr/local/nginx/sbin/

测试新版本nginx是否正常

/usr/local/nginx/sbin/nginx -t

平滑重启升级nginx

kill –QUIT `cat /usr/local/nginx/log/nginx.oldbin` ##关闭旧版nginx

验证nginx是否升级成功

/usr/local/nginx/sbin/nginx -V显示最新编译的版本信息即可。

1.5 Nginx虚拟主机实战

在真实的企业服务器环境中,为了充分利用服务器的资源,单台Nginx WEB服务器同时会配置N个网站,也可称之为配置N个虚拟域名的主机,即多个域名对应同一个80端口。

在Nginx.conf中加入server代码,Nginx虚拟主机完整代码如下:

worker_processes 1;

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

#virtual hosts config 2017/5/18

server {

listen 80;

server_name www.jf1.com;

access_log logs/jf1.access.log;

location / {

root html/jf1;

index index.html index.htm;

}

}

server {

listen 80;

server_name www.jf2.com;

access_log logs/jf2.access.log;

location / {

root html/jf2;

index index.html index.htm;

}

}

}

创建两个不同的目录mkdir –p /usr/local/nginx/html/{jf1,jf2},然后分别在两个目录创建两个不同的index.html网站页面即可。通过Windows客户端配置hosts绑定IP与两个域名的对应关系,在IE浏览器访问测试效果,如图14-4(a)、14-4(b)所示:

图14-4(a) Nginx 虚拟主机www.jf1.com

图14-4(b) Nginx 虚拟主机www.jf2.com

1.6 企业实战LNMP高性能服务器

公共网关接口”(Common Gateway Interface,CGI),是HTTP服务器与本机或者其它机器上的程序进行通信的一种工具,其程序须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量,如php、perl、tcl等。

LNMP WEB架构中,Nginx为一款高性能Web服务器,本身是不能处理PHP的,当接收到客户端浏览器发送HTTP Request请求时,Nginx服务器响应并处理web请求,静态资源CSS、图片、视频、TXT等静态文件请求,Nginx服务器可以直接处理并回应。

但是PHP动态页面请求Nginx不能直接处理,Nginx服务器会将PHP网页脚本通过接口传输协议(网关协议)PHP-FCGI(Fast-CGI)传输给PHP-FPM(进程管理程序),PHP-FPM不做处理,然后PHP-FPM调用PHP解析器进程,PHP解析器解析PHP脚本信息。PHP解析器进程可以启动多个,可以实现多进行并发执行。

如图14-5所示:

IMG_256 图14-5 Nginx+FastCGI通信原理图

CGI、FAST-CGI、PHP-CGI、PHP-FPM概念总结:

  • CGI:Common gateway interface 通用网关接口;
  • FastCGI:Fast common gateway interface 快速通用网关接口;
  • PHP-FPM:PHP-Fast CGI Process Manager CGI,是FastCGII协议的实现并且带进程管理器;
  • PHP-CGI是解析PHP代码的程序,属于PHP程序解释器,只负责解析请求,不负责进程管理;
  • PHP-FPM是PHP-CGI进程管理器,可以有效控制内存和进程、可以平滑重载PHP配置。

企业级LNMP(Nginx+PHP(FastCGI)+MySQL)主流架构配置方法如下,分别安装Nginx、MYSQL、PHP服务,步骤如下:

  1. Nginx安装配置

wget -c http://nginx.org/download/nginx-1.12.0.tar.gz

tar -xzf nginx-1.12.0.tar.gz

cd nginx-1.12.0

useradd www ;./configure –user=www –group=www –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module

make

make install

  1. MYSQL安装配置

yum install cmake ncurses-devel ncurses –y

wget http://down1.chinaunix.net/distfiles/mysql-5.5.20.tar.gz

tar -xzf mysql-5.5.20.tar.gz

cd mysql-5-5.20

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql55 \

-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \

-DMYSQL_DATADIR=/data/mysql \

-DSYSCONFDIR=/etc \

-DMYSQL_USER=mysql \

-DMYSQL_TCP_PORT=3306 \

-DWITH_XTRADB_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_PARTITION_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_EXTRA_CHARSETS=1 \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci \

-DEXTRA_CHARSETS=all \

-DWITH_BIG_TABLES=1 \

-DWITH_DEBUG=0

make

make install

  1. PHP安装配置

wget http://museum.php.net/php5/php-5.3.10.tar.gz

yum -y install gd curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel

cd php-5.3.10

./configure –prefix=/usr/local/php5 –enable-fpm –enable-debug –with-gd –with-jpeg-dir –with-png-dir –with-freetype-dir –enable-mbstring –with-curl –with-mysql=/usr/local/mysql55/ –with-mysqli=/usr/local/mysql55/bin/mysql_config –with-config-file-path=/usr/local/php5/etc

make

make install

cp php.ini-development /usr/local/php5/etc/php.ini

cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf

/usr/local/php5/sbin/php-fpm

cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

  1. Nginx配置文件配置

server {

include port.conf;

server_name www.jfedu.net jfedu.net;

location / {

index index.html index.php;

root /usr/local/nginx/html;

}

location ~ \.php$ {

root html;

FastCGI_pass 127.0.0.1:9000;

FastCGI_index index.php;

FastCGI_param SCRIPT_FILENAME html$FastCGI_script_name;

include FastCGI_params;

}

}

  1. 测试LNMP架构测试,创建index.php测试页面,如图14-6所示:

图14-6 LNMP企业实战测试页面

1.7 Nginx Rewrite规则详解一

Rewirte规则也称为规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其正则表达式是基于Perl语言。通常而言,几乎所有的WEB服务器均可以支持URL重写。Rewrite URL规则重写的用途:

  • 对搜索引擎优化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取网站页面;
  • 隐藏网站URL真实地址,浏览器显示更加美观;
  • 网站变更升级,可以基于Rewrite临时重定向到其他页面。

Nginx Rewrite规则使用中有三个概念需要理解,分别是:Rewrite结尾标识符、Rewrite规则常用表达式、Nginx Rewrite变量。

  1. 将jfedu.net跳转至www.jfedu.net。

if ($host = ‘jfedu.net’ ) {

rewrite ^/(.*)$ http://www.jfedu.net/$1 permanent;

}

  1. 访问www.jfedu.net跳转www.test.com/new.index.html。

rewrite ^/$ http://www.test.com/index01.html permanent;

  1. 访问/jfedu/test01/跳转至/newindex.html,浏览器地址不变。

rewrite ^/jfedu/test01/$ /newindex.html last;

  1. 多域名跳转到www.jfedu.net。

if ($host != ‘www.jfedu.net’ ) {

rewrite ^/(.*)$ http://www.jfedu.net/$1 permanent;

}

  1. 禁止访问以.sh,.flv,.mp3为文件后缀名的文件。

location ~ .*\.(sh|flv|mp3)$
{
return 403;
}

  1. 匹配URL访问字符串跳转。

if ($args ~* tid=13){

return 404;

}

  1. 访问/10690/jfedu/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。

rewrite ^/([0-9]+)/jfedu/(.+)$ /index.php?tid/$1/items=$2 last;

1.8 Nginx防盗链配置案例配置

防盗链的含义是网站内容本身不在自己公司的服务器上,而通过技术手段,直接在调用其他公司的服务器网站数据,而向最终用户提供此内容。一些小网站盗链高访问量网站的音乐、图片、软件的链接,然后放置在自己的网站中,通过这种方法盗取高访问量网站的空间和流量。

网站每天访问量很大,而且占用了很多不必要的带宽,浪费资源,所以必须采取一些限制措施。防盗链其实就是采用服务器端编程技术,通过URL过滤、主机名等实现的防止盗链的软件。

例如http://www.jfedu.net/linux/页面,如果没有配置防盗链,别人就能轻而易举的在其的网站上引用该页面。Nginx防盗链配置代码如下:

server {

listen 80;

server_name jfedu.net www.jfedu.net;

location / {

root html/b;

index index.html index.htm;

}

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked jfedu.net *.jfedu.net;

root html/b;

if ($invalid_referer) {

#rewrite ^/ http://www.jfedu.net/403.html;

return 403;

}

}

}

Nginx防盗链参数详解:

valid_referers表示可用的referers设置

none 表示没有referers,直接通过浏览器或者其他工具访问。

blocked表示有referers,但是被代理服务器或者防火墙隐藏;

jfedu.net 表示通过jfedu.net访问的referers;

*.jfedu.net 表示通过*.jfedu.net访问的referers,*表示任意host主机。

除了以上方法,按照如下方法设置也可以实现防盗链:

location ~* \.(gif|jpg|png|swf|flv)$

if ($host !=’*.jfedu.net’) {

return 403;

}

防盗链测试,找另外一台测试服务器,基于Nginx发布如下test.html页面,代码如下,去调用www.jfedu.net官网的test.png图片,由于www.jfedu.net官网设置了防盗链,所以无法访问该图片。

<html>

<h1>TEST Nginx PNG</h1>

<img src=”http://www.jfedu.net/test.png”>

</html>

默认没有配置Nginx防盗链,网站正常调用www.jfedu.net的logo图片,访问如图14-9所示:

图14-9 Nginx无防盗链正常调用图片

配置Nginx防盗链,网站无法正常调用www.jfedu.net的logo图片,访问如图14-10所示:

图14-10 Nginx防盗链403禁止访问