LNMP企业架构实战(二)

一、Nginx Web服务器简介
本节介绍 Nginx高性能Web服务器、 Nginx工作原理、安装配置及升级、 Nginx配置文件深入剖析、Nginx虚拟主机、 location案例演示、 Nginx rewire企业案例实战、Https安全Web服务器及 Nginx高性能集群实战等内容。
二、Nginx Web入门简介
Nginx(engine x)是一个高性能HTTP、反向代理、IMAP、POP3、SMTP服务器
Nginx是由 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,第一个公开版本
发布于2004年10月4日。其源代码以类BSD许可证的形式发布,因它的稳定性、丰富的
功能集、示例配置文件和低系统资源的消耗而闻名
由于 Nginx的高性能、轻量级,目前越来越多的互联网企业开始使用 Nginx做为Web
服务器。据 Netcraft统计,在2017年4月份,世界上最繁忙的网站中有28.72%使用Nignx
作为其服务器或者代理服务器。
Nginx已经在众多流量很大的俄罗斯网站上使用了很长时间,这些网站包括 Yandex、Mai.Ru、 VKontakte以及 Rambler。目前互联网主流公司京东、360、百度、新浪、腾讯、阿里都在使用 nginx作为自己的Web服务器。
Nginx特点是占有内存少,并发能力强,事实上 Nginx的并发能力确实在同类型的网页
服务器中表现较好。
Nginx相对于 Apache优点如下:
1、高并发响应性能非常好,官方 Nginx处理静态文件并发5w/s;
2、负载均衡及反向代理性能非常强;
3、系统内存和CPU占用率低;
4、可对后端服务进行健康检查;
5、支持 PHP CGI方式和 FascCGI方式
6、可以作为缓存服务器、邮件代理服务器
7、配置代码简洁且容易上手
三、Nginx工作原理
Nginx Web服务器主要是由各种模块协同工作,模块从结构上分为核心模块,基础模
块和第三方模块,其中三类模块分别如下:
1、核心模块:HTTP模块、event模块和mail模块等
2、基础模块:Http access模块、Http FastCGI模块、Http proxy模块和HTTP rewrite模块
3、第三方模块: Http upstream request hash模块、 notice模块和 Http access key模块、 limit_req模块等
Nginx的模块从功能上分为如下三类
1、handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改 headers信息等操作, handlers处理器模块一般只能有一个
2、filters(过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由 Nginx输出
3、proxies(代理类模块):此类模块是 Nginx的 Http upstream之类的模块,这些模块主要与后端一些服务比如 Fast CGI等进行交互,实现服务代理和负载均衡等功能。

Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单仅是通过查找配置文件将客户端的请求映射到一个 location block,而 location是 Nginx配置中的一个指令,用于访问的URL匹配,而 location中所配置的每个指令将会启动不同的模块去完成相应的工作
四、Nginx安装配置
Nginx Web安装时可以指定很多的模块,默认需要安装 rewrite模块,需要系统有PCRE库,安装PCRE支持 rewrite功能,以下为安装 Nginx Web服务器的方法,注意Nginx整合PCRE库,需要指定PCRE源码目录,而不是PCRE编译完成之后的路径,否则会报错。代码如下:
#安装比PCRE库支持
yum install pcre-devel pcre -y
#还要在linux安装其它依赖包
yum install gcc-c++
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
#下载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_moudle

./configure–user=www --group==www --prefix=/usr/local/nginx --with-http_stub_status_module --with-openssl=/usr/lib64/openssl
#./conf igure预编译成功后,执行make命令进行编译
make
#make执行成功后,执行 make install正式安装
make install
至此nginx Web服务器安装完毕
测试 Nginx服务安装是否正确,同时启动 Nginx Web服务,具体步骤如下:
检查 Nginx配置文件是否正确,返回OK即正确。代码如下:
[root@bogon /]# /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@bogon /]#
然后启动 Nginx,执行命令/usr/ocal/ nginx/sbin/ nginx按 Enter键即可
[root@bogon ~]# /usr/local/nginx/sbin/nginx
查看进程是否已启动,代码如下
[root@bogon ~]# ps -ef | grep nginx
root 9281 1 0 08:03 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
www 9282 9281 0 08:03 ? 00:00:00 nginx: worker process
root 9284 2881 0 08:04 pts/0 00:00:00 grep nginx
[root@bogon ~]#
#关闭nginx /usr/local/nginx/sbin/nginx -s stop
#重新加载设置/usr/local/nginx/sbin/nginx -s reload
通过浏览器访问 nginx默认测试页面,直接在浏览器上输入虚拟机的ip地址就好,记得把防火墙关了,service iptables stop 是临时关闭,下次重启虚拟机,防火墙会启动,如图所示
LNMP企业架构实战(二)_第1张图片

五、Nginx配置文件优化
学习 Nginx服务的难点在于对配置文件的理解和优化,熟练掌握 Nginx配置文件参数
的含义可以更快地掌握 Nginx,以下为 nginx.conf配置文件常用参数详解:
#定义 Nginx运行的用户和用户组
user www www
#启动进程,通常设置成和CPU的数量相等
worker processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#为每个进程分配CPU,上例中将8个进程分配到B个CPU,当然可以写多个,或者将一个进程
#分配到多个CPU
worker_rlimit_nofile 102400;
#该指令是当一个Nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit-n)
#与Nginx进程数相除,但是 Nginx分配请求并不是那么均匀,所以最好与 limit-n的值保持一致
#全局错误日志及PID文件
error_log /usr/local/nginx/logs/error.log
#错误日志定义等级,[ debug| info | notice | warn | error | crit]
pid /usr/local/nginx/nginx.pid;
#工作模式及连接数上限
events{
use epoll;
#epoll是多路复用I/O(I/O multiplexing)中的一种方式,但是仅用于Linux2.6以上内核,可以大
#大提高Nginx的性能
worker_connections 102400;
#单个后台 worker process进程的最大并发连接数(最大连接数=连接数进程数)
multi_accept on;
#尽可能多地接受请求
}
#设定HTTP服务器,利用它的反向代理功能提供负载均衡
http{
#支持设定MIME类型,类型由mtime.type文件定义
include mime .types;
default_type application/octet-stream;
#设定日志格式
access_log /usr/local/nginx/log/nginx/access.log
sendfile on;
#指令指定Nginx是否调用send file函数(zero copy方式)来输出文件,对于普通应用必须
#设为on
#如果用来进行下载等应用磁盘I/0重负载应用,可设置为off,以平衡磁盘与网络I/O处理#速度,降低系统的 uptime
#autoindex on;
#开启目录列表访问,合适下载服务器,默认关闭
tcp_nopush on;
#防止网络阻塞
keepalive_timeout 60;

keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后继请求时,

#keepalive- timeout功能可避免建立或重新建立连接
tcp_nodelay on;
#提高数据的实时响应性
#开启gzip压缩
gzip on;
gzip_nin_length 1KB;
gzip_buffers 4 16KB;
gzip_http_version 1.1;
gzip_comp_level 2;
#压缩级别大小,最大为9,值越小,压缩后比例越小,CPU处理更快,值越大,消耗CPU比较高
gzip_types text/plain application/x -javascript text/css application/xml;
gzip_vary on;
client_nax_body_size 10MB;
#允许客户端请求的最大单文件字节数
client_body_buffer_size 128KB;
#缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 90;
#Nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90;
#后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90;
#连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4KB;
#设置代理服务器(imx)保存用户头信息的缓冲区大小
proxy_butters 4 32KB;
#proxy_buffer缓冲区,网页平均在32KB以下的话,这样设置
proxy_busy_buffers_size 64KB;
#高负荷下缓冲大小(proxy_buffer*2)
#设定请求缓冲
large_client_header_buffers 4 4KB;
client_header_buffer_size 4KB;
#客户端请求头部的缓冲区大小,这个可以根据系统分页大小来设置,一般一个请求的头
#部大小不会超过1KB,不过由于一般系统分页都要大于1KB,所以这里设置为分页大小,
#分页大小可以用命令getconf

PAGESIZE取得

open_file_cache_max=102400 inactive=20s;
#这个将为打开文件指定缓存,默认是没有启用的,mx指定缓存数量,建议和打开文件数一致
#inactive是指经过多长时间文件没被请求后删除缓存
open_file_cache_valid 30s;
#这个是指多长时间检查一次缓存的有效信息
open_file_cache_min_uses 1;
#open_file_cache指令中的 inactive参数时间内文件的最少使用次数,如果超过这个数字,文
#件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive
#包含其他配置文件,如自定义的虚拟主机
include vhosts.conf;
六、Nginx配置文件优化二
Nginx Web默认发布静态页面,也可以均衡后端动态页面,用户发起HTTP请求,如果请求为静态页面,Nginx直接处理并返回,如果请求的是动态页面, Nginx收到请求之后会进行判断,转到后端服务器去处理Nginx实现负载均衡需要基于upstream模块,同时需要设置 location proxy_ pass:转发指令实现以下为 Nginx应用负载均衡集群配置,根据后端实际情况修改即可,
dzqc_www为负载均衡模块的名称,可以任意指定,但必须跟vhost.conf、 nginx.conf虚拟主机的proxy_pass段保持一致,否则不能将请求转发至后端的服务器, weight表示配置权重,在fail_timeout内检查 max_fails次数,失败则剔除均衡,代码如下:
pstream dzqc_www{
server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s
server 127.0.0.1 weight=1 nax_fails=2 fail_timeout=30s
}
#虚拟主机配置
server{
#侦听80端口
listen 80;
#定义使用ww.dzqcyunwei.net访问
server_name ww.dzqcyunwei.net;
#设定本虚拟主机的访问日志
access_log logs/access.log main;
root /data/webapps/www; #定义服务器的默认网站根目录位置
index index. php index. html index.htm;#定义首页素引文件的名称

默认请求

location ~/{
root /data/webapps/www;
#定义服务器的默认网站根目录位置
index index. php index. html index.htm;#定义首页索引文件的名称
#以下是一些反向代理的配置
proxy_next_upstream http_502 http_504 error timeout invalid_header
#如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到 upstream
#负载均衡池中的另一台服务器,实现故障转移
proxy_redirect_off;
#后端的web服务器可以通过x- Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real -IP $remote_addr;
proxy_set_header X- Forwarded-For KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for; …
{
root /data/webapps/www
#expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更
#长,这样可以节省带宽和缓解服务器的压力,在浏览器保存该类型文件的天数。
expires 3d;
}
#PHP脚本请求全部转发到 FastcCGI处理,使用 FastCGI默认配置
location ~. php ${
root /root;
FastCGI_pass 127.0.0.1:9000;
FastCGI_index index.php
FastCGI_param SCRIPT_FILENAME /data/webapps/www $FastCGI_script_name;
include FastCGI_params;
}
设定查看 Nginx状态的地址
location /NginxStatus{
stub_status on;
}
}
}
通过 expires参数设置,可以在浏览器缓存静态文件,从而减少用户与服务器之间的请
求和流量。具体 expires定义是给一个资源设定一个过期时间,浏览器无须去服务端下载资
源,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。
如果静态文件不常更新, expires可以设置为30d,表示在这30天之内再次访问该静态
文件,浏览器会发送一个HTTP请求,会比对服务器该文件最后更新时间是否有变化,如果
没有变化,则不会从服务器抓取,返回HTTP状态码304,如果有修改,则直接从服务器重
新下载,返回HTTP状态码200。
七、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;
server{
listen 80;
#通过www.yunwei1.com访问此虚拟主机
server_name www.yunwei1.com;
access_log logs/yunwei1. log;
#记得自己在logs文件夹下,创建yunwei1.log
location / {
root html/yunwei1;
#这是此虚拟主机布置项目的根路径
index index.html index.htm;
}
}
server {
listen 80;
server_name www.yunwei2.com;
access_log logs/yunwei2… log;
#记得自己在logs文件夹下,创建yunwei2.log
location / {
root html/yunwei2;
index index.html index.htm;
}
}
}
创建两个不同的目录 mkdir -p/usr/local/ nginx/html/{yunwei1l,yunwei2},然后分别在两个目录
创建两个不同的 index.html网站页面即可。通过 Windows客户端配置 hosts绑定IP与两
个域名的对应关系,谷歌浏览器访问测试效果,如下
LNMP企业架构实战(二)_第2张图片

八、Nginx location深入剖析
http://192.168.0.134:80/test/index.jsp
Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅是通过查找配置文件将客户端的请求映射到一个 location block,而 location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个 location中所配置的每个指令将会启不同的模块去完成相应的工作
默认 nginx. conf配置文件中至少存在一个 location /,即表示客户端浏览器请求的URL为域名+“/”,如果 location/ newindex/,则表示客户端浏览器请求的URL为域名+"/newindex/",常见 location匹配URL的方式如下:
=:字面精确匹配
^:最大前缀匹配。
/:不带任何前缀。
~:大小写相关的正则匹配。
a-•:大小写无关的正则匹配
@: location内部重定向的变量
其中 location=、^、~、/属于普通字符串匹配, location*属于正则表达式匹配,优先级与其在 nginx.conf配置文件中的先后顺序无关
location=精确匹配会第一个被处理,如果发现精确匹配, Nginx则停止搜索其他任何
location的匹配
普通字符匹配,正则表达式规则和完整URL规则将被优先查询匹配,^~为最大前缀匹配,如果匹配到该规则, Nginx则停止搜索其他任何 location的匹配,否则 Nginx会继续处理其他 location指令
正则匹配“”和" *",如果找到相应的匹配,则Nginx停止搜索其他任何 location的匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用
location规则匹配优先级总结如下
(location =)>( location完整路径)>( location ^~路径)>( location *正则顺序)>( location部分起始路径)>( location/)
九、以下为 Nginx location规则案例演示
location = /{
[ configuration L1 ]
#只会匹配/优先级比 location/低

}
location = /index.html{
[ configuration L2 ]
#只会匹配/ index.html,优先级最高
}
location / {
[ configuration L3 ]
#匹配任何请求,因为所有请求都是以“/”开始
#但是更长字符匹配或者正则表达式匹配会优先匹配,优先级最低
}

location = /images/{
[ configuratioion L4 ]
#匹配任何以/ images/开始的请求,并停止匹配其他location
}

location ~* .(html | txt | gif | jpg | jpeg)${
[ configuration L5 ]
#匹配以html、txt、gif、jpg、jpeg结尾的URL文件请求
#但是所有/ Images/目录的请求将由[ configuration L4]处理

}
浏览器发起 Http request URI案例与 location规则案例匹配如下:
/ ->匹配 configation L3;
/index.html匹配 configuration L2;
/ images/匹配 configuration L4;
/image/logo.png匹配
/img/test.jpg configuration L5;
企业生产环境中无须在 nginx.conf配置文件中同时添加5种规则匹配,以下为企业生
产环境 Nginx location部分配置代码:
location /
{
root /var/www/html;
expires 60d;
}

location ~ . * .(gif | jpg | jpeg | bmp | png | ico | txt | js | css)$
{
root /var/www/html/;
expires 60d;
}
location ~ . * .(jsp | php | cgi | do)$
{
root /var/ww/htal/;
proxy_pass http://linuxweb;
proxy_http_version 1.1;
proxy_set_handler_Connection “”;
proxy_set_header Host $host;
proxy_set_header X- Real - IP $remote addr;
proxy_set_header X- Forwarded - For $praxy_add_x_forwarded_for;
}
location = /newindex.html
{
root /var/www/newwww/;
expires 60d;
}

十、企业实战 Nginx动静分离架构
Nginx动静分离简单来说是把动态跟静态请求分开,不能理解成只是单纯地把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面, Tomcat、Resin、PHP、ASP处理动态页面。
动静分离从实现角度来讲大致分为两种:一种是纯粹地把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过Nginx来分开。
Nginx上Web服务器动静分离及完整配置文件代码如下
#定义 Nginx运行的用户和用户组
user www www
#启动进程,通常设置成和CPU的数量相等
worker processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_rlimit_nofile 102400;
pid /usr/local/nginx/logs/nginx.pid;
events{
use epoll;
worker_connections 102400;
multi_accept on;
}
#设定HTTP服务器,利用它的反向代理功能提供负载均衡
http{
include mime .types;
default_type application/octet-stream;
FastCGI_intercept_errors on;
Charset utf-8;
Server_names_hash_bucket_size 128;
client_header_buffer_size 4KB;
large_client_header_buffers 4 32KB;
client_max_body_size 300MB;
client_body_buffer_size 128KB;
tcp_nopush on;
sendfile on;
keepalive_timeout 60;
tcp_nodelay on;
gzip on;
gzip_nin_length 1KB;
gzip_buffers 4 16KB;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4KB;
proxy_butters 4 32KB;
proxy_busy_buffers_size 64KB;
log_format main ‘$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “ r e q u e s t ” ‘ ‘ request”‘ ‘ requeststatus b o d y b y t e s s e n t “ h t t p r e f e r e r ” ‘ ‘ “ body_bytes_sent “http_referer”‘ ‘“ bodybytessenthttprefererhttp_user_agent” $request_time’;
upstream jvm_web1{
server 192.168.0.134:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.134:8081 weight=1 max_fails=2 fail_timeout=30s;
}
server{
listen 80;
server_name www.yunwei1.com;
index index. jsp index. html index.htm;
root /data/webapps/www;
location / {
proxy_next_upstream_http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X- Real - IP $remote_addr;
proxy_set_header X - Forwarded - For KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for; …
{
proxy_set_header Host $host;
proxy_set_header X - Real - IP $remote addr;
proxy_set_header X - Forwarded - For KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for; …
{
root /data/webapps/www1;
expires 30d;
}
access_log /data/logs/jvm_web1/access. log main;
error_log /data/logs/jvm_web1/error.log crit;
}
}
配置文件代码中 location ~ . * .( php | jsp | cgi | shtml)表示匹配动态页面请求,然后将通
求 proxy_pass到后端服务器,而 location ~ .*.( html | htm | gif | jpeg | ico | txt | js | css)表示
匹配静态页面请求本地返回。
检查 Nginx配置是否正确即可,然后测试动静分离是否成功,在192.168.0.134服务器启动8080、8081 Tomcat服务或者LAMP服务,删除后端 Tomcat或者LAMP服务器上的某个静态文件,测试是否能访问该文件,如果可以访问,则说明静态资源通过Nginx直接返回了,如果不能访问,则证明动静分离不成功。
十一、企业实战LNMP高性能服务器
公共网关接口(common gateway interface, CGD),是HTTP服务器与本机或者其他机
器上的程序进行通信的一种工具,其程序需运行在网络服务器上。
CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量,如PHP、
Perl、TCL等
FastCGI为Web服务器与处理程序之间通信的一种协议( App server和 Web server之
间的通信协议),是CG1的改进方案。CGI程序反复加载是CGI性能低下的主要原因,如果
CGI程序保持在内存中并接受 FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、
Fail-Over特性等。 FastCGI是常驻型的CGl,它可以一直运行,在请求到达时,不会花费时
间去fork一个进程来处理
FastCGI是语言无关的、可伸缩架构的CG1开放扩展,将CGI解释器进程保持在内存
中,以此获得较高的性能, FastCGI是一个协议, PHP-FPM实现了这个协议, PHP-FPM的FastCGI协议需要有进程池, PHP-FPM实现的 FastCGI进程叫 PHP-CGI,所以 PHP-FPN其实是它自身的 FastCGI或 PHP-CGI进程管理器,如图所示。
LNMP企业架构实战(二)_第3张图片

由于我们LNMP软件都安装成功了,在Nginx的配置文件中的,server里边再添加以下内容即可
server{
include port.conf;
server_name www.yunwei1.net
location /{
index index.html index.php;
root /usr/local/nginx/html
}
#PHP脚本请求全部转发到 FastcCGI处理,使用 FastCGI默认配置
location ~. php ${
root /root;
FastCGI_pass 127.0.0.1:9000;
FastCGI_index index.php
FastCGI_param SCRIPT_FILENAME /data/webapps/www $FastCGI_script_name;
include FastCGI_params;
}
}
LNMP架构搭建完成后,进行测试如下,创建index.php页面,然后进行访问

你可能感兴趣的:(LNMP企业架构实战(二))