首页 > 代码库 > 高性能Web服务器Nginx

高性能Web服务器Nginx

高性能Web服务器Nginx介绍

  Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,可以运行在UNIX、GUN/LINUX、BSD、MAC OS X以及Microsoft Windows等操作系统中,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx的功能

 Nginx的模块从功能上分为三类,如下所示。

1、Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。handlers处理器模块一般只能有一个。

2、Filters(代理类模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。

3、Proxies(代理类模块)。就是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如fastcgi等操作交互,实现服务代理和负载均衡等功能。

Nginx的性能优势

1、作为web服务器,Nginx处理静态文件、索引文件以及自动索引效率非常高。

2、作为代理服务器,Nginx可以实现快速、高效的反向代理,提升网站性能。

3、作为负载均衡服务器,Nginx即可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器,对外进行服务。

4、在性能方面,Nginx是专门为性能优化而开发的,在实现上非常注重效率。他采用内核Poll模型,可以支持更多的并发连接,并在大并发时占用很低的内存资源。

5、在稳定方面,Nginx采取分阶段资源分配技术,使得对CPU与内存的占用率非常低。

6、在高性能方面,Nginx支持热部署,启动迅速,因此可以在不间断服务的情况下,对软件版本或配置进行升级,即使运行数月也无需重启,几乎可以做到7x24小时不断运行。

Nginx的安装

Nginx的官方网站是http://nginx.org/,从这里可以获得Nginx的最新版本信息。Nginx有三个版本:稳定版、开发办和历史稳定版。

Nginx的依赖包:gcc、openssl-devel、pcre(编译安装:支持http rewrite模块)和zlib-devel

如果部署LNMP环境还需要安装php、php-frm、php-mysql、mariadb、mariadb-server、mariadb-devel。

快速安装

  Nginx在默认情况下,经过编译安装的Nginx包含了大部分可用的模块。可以通过“./configure --help”选项设置多个模块的使用情况,如对不用的http_ssi模块,可以通过“--without-http_ssi_module”方式关闭,同理,如果需要“http_perl”模块,可以用“--with-http_perl_module”方式来安装。

<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>
Nginx简介
Nginx配置文件及目录
/user/local/nginx/        //安装目录
conf/nginx.conf            //主配置文件
html                    //网页目录
logs                    //日志文件
sbin/nginx                //启动脚本

 

Nginx进程管理
1、启动nginx服务
/user/local/nginx/sbin/nginx
常用选项
-v:查看nginx版本
-V:查看编译参数
-t:测试默认配置文件
-c:指定配置文件

 

<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>
查看服务相关进程及端口信息
[root@proxy ~]# ps aux | grep nginx
root      3918  0.0  0.1  47384  1136 ?        Ss   20:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    3919  0.0  0.1  49920  1980 ?        S    20:22   0:00 nginx: worker process
root      3929  0.0  0.0 112660   968 pts/0    S+   20:22   0:00 grep --color=auto nginx
[root@proxy ~]# netstat -anutlp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3918/nginx: master  

 

2、nginx配置文件结构
技术分享
                                                                                                        nginx配置文件结构图


<style>pre.ctl { font-family: "Liberation Mono", monospace }
p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }</style>

3、nginx的配置文件解析:
		http{}段:是全局配置段,用来定义进程数量、并发数量、日志等全局配置,且全局配置段必须定义在http段内server段外。
		      server{}段:用来定义和配置虚拟主机的站点,且一个虚拟主机需要定义一个单独的server段;server段需要定义在http段内,其配置内容包括:
			        listen 端口号:定义虚拟主机监听的端口
			        server_name 主机名:定义虚拟主机的主机名
		              location{}段:用来定义虚拟主机的DocumentRoot和默认网页,且必须放置在server段内,其配置内容为:
		                      root 目录名称:定义虚拟主机的网页根目录位置
		                      index 文件名:定义虚拟主机的默认网页名称
一、nginx 服务器web
<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>
1、nginx加密网站:
当我们不想让所有人都访问我们web服务的页面时,我们可以基于用户做账号密码认证,且这个账号密码不是我们系统上存在的用户,而是我们自己创建的虚拟用户
配置方法:先在想做用户认证的虚拟主机的location段加入两行:
		auth_basic “提示用户输入账号密码的文本(可以随意写)”
		auth_basic_user_file “密码文件路径”

创建密码文件方法:
使用命令htpasswd –cm 文件路径 用户名
[root@proxy sbin]# vim /usr/local/nginx/conf/nginx.conf
 server {
        listen       80;
        server_name  localhost;
    写    auth_basic "Input pass:"                       //弹出的输入界面的提示信息
    写    auth_basic_user_file "/usr/local/nginx/pass";    //密码存放路径

yum -y install httpd-tools                    //生成密码工具
[root@proxy sbin]# htpasswd -cm /usr/local/nginx/pass tom    //添加tom用户并交互式设置密码
New password: 
Re-type new password: 
Adding password for user tom
[root@proxy sbin]# nginx -s reload

 


<style>pre.ctl { font-family: "Liberation Mono", monospace }
p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }</style>

客户端测试: 登录192.168.4.100客户端主机进行测试

[root@client ~]# firefox http://192.168.4.5                    //输入密码后可以访问
<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>

2、三种模式虚拟主机

<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 三种模式虚拟主机 --> { }</style> <style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { } - --> { }</style>

a、基于域名

vim /usr/local/nginx/conf/nginx.conf
网站a
server {
        listen       80;          //端口
        server_name  www.a.com;        //网站地址
      auth_basic "Input pass:";
        auth_basic_user_file "/usr/local/nginx/pass";
       location / {
        root   html;                //访问目录
        index  index.html index.htm;
      error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   html;
           }
       }

网站b      
    server {
        listen       80;
        server_name  www.b.com;        //网站地址

        location / {
            root   web;                //访问目录
            index  index.html index.htm;
        }
    }
 mkdir /usr/local/nginx/web                //创建目录
 echo "123"> /usr/local/nginx/web/index.html  //创建网页
 nginx -s reload                      //重启
<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>
b、基于端口
网站a
listen       8080;
        server_name  www.b.com;
网站b
listen       8000;
        server_name  www.b.com;
<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>
c、基于ip的虚拟机
网站a
listen       ip1:80;
        server_name  www.b.com;
网站b
listen       ip2:80;
        server_name  www.b.com;
<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>
3、ssl虚拟主机
  加密算法:
  对称算法 AESDES
  非对称算法 RSADSA
  信息摘要 MD5(数据完整性校验【安全】),sha256,sha512
[root@proxy sbin]# cd /usr/local/nginx/conf/
[root@proxy conf]# openssl genra > my.key 
[root@proxy conf]#openssl req -new -x509 -key my.key -out my.crt 
国家名称、省份、城市、公司名称、部门名称、主机名称、邮箱
[root@proxy conf]vim /usr/local/nginx/conf/nginx.conf
 server_name  www.c.com;
    ssl_certificate      my.crt;
    ssl_certificate_key  my.key;
[root@proxy conf]# nginx -s reload
<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>

二、nginx反向代理

<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { } nginx反向代理 --> { }</style> <style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>
优点:
1、 可以给web服务器做高可用,避免单点故障
2、 具有负载均衡能力
3、 可以对集群做高可用
4、 自带健康监测功能,如果后端服务器故障,会自动让其下线,不会将用户请求再发给故障服务器
所需web服务器:
nginx代理:proxy
两台web服务器:web1web2
nginx做带向代理调度器方法: 编辑其配置文件,在http段内server段外首先定义upstream
upstream webs {
        server 192.168.2.100;
        server 192.168.2.200;
        }
    server {
        listen       80;
        server_name  localhost;
        
        location / {
            proxy_pass http://webs;
            root   html;
            index  index.html index.htm;
        }

易错点:
1、 我们nginx配置文件的每一行行尾必须有;(分号),不然后报语法错误
2、 我们的防火墙状态必须处于trusted状态,或者开放对于http服务的访问
3、 基于用户认证时,密码文件必须存在且路径必须与配置文件中的一致,否则会报错
4、 我们在基于主机名进行访问时,由于没有dns进行主机名解析,所以必须在访问此页面的主机的hosts文件中进行定义
5、 做安全http时,配置文件中密钥和证书的路径和名称一定要与配置文件中的一致
6nginx做反代的时候,upstream必须定义在proxxy_pass前,因为我们服务在读配置文件时是顺序读取的,所以如果没定义是没办法引用的

三、nginx负载均衡
<style>pre.ctl { font-family: "Liberation Mono", monospace } p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>
nginx负载分配方式
nginx目前支持4种分配方式
-轮询:逐一调度
-weight:指定轮询机率,权重值和访问比成正比;例如:ip weight=2 ip访问2-ip_hash:根据客户端ip分配固定的后端服务器

服务器组主机状态
--down:表示当前server暂时不参与负载
--max_timeout:max_fails次失败后,暂停提供服务的事件安
--backup:备份服务器
upstream webs {
      ip_hash;
        server 192.168.2.100 max_fails=1 fail_timeout=30;
        server 192.168.2.200;
        }
 server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        location / {
        proxy_pass http://webs;
            root   html;
        }
      }

 四、

<style>p { margin-bottom: 0.25cm; line-height: 120% } a:link { }</style>

nginx调优:

 

a、不让nginx’显示其版本号:因为每个版本的nginx都有其相应的缺陷,如果我们让其显示版本号,可能会被某些人利用其缺陷进行攻击

解决方法:

在其配置文件中全局配置段添加:server_tokens off;即可

 

b、客户端请求太多时,但是我们服务器端并发数量过小时,导致请求失败,我们可以对服务器端的并发数量进行调整:

解决方法:

在其配置文件中全局配置段调整:

worker_processes N;设置最大值为CPU的核心数

worker_connetions N;每个worker的最大并发数

最大并发数= worker_processes* worker_connetions

但是只更改配置文件并不能达到我们预期的并发数,因为我们系统对打开文件的数量是有限制的:默认为1024

如果想让其支持更多我们就需要去修改系统打开文件数量的限制:

查看系统打开文件数量的限制数:ulimit –a –> open file 1024

如果我们想让其永久生效就修改配置文件:/etc/security/limits.conf给其添加:

添加格式:*(对谁生效,*表示对所有生效)<type>格式一般为软限制或者硬限制 <item>限制什么东西 <values> 限制值的大小

我们这里需要添加:

* soft nofile 100000

* hard nofile 100000

这个是永久生效但是不会立即生效,我们想让其立即生效需要执行命令:

ulimit –Hn 100000

ulimit –Sn 100000

此命令是立即生效但是重启失效,所以需要上面两种方法结合使用

三、头部信息过长导致请求失败

我们nginx默认头部信息超过1k就会报错,这是我们需要去调整nginx配置文件

client_header_buffer_size 1k;

large_client_ header_buffers 4 4k;

此配置的含义是:第一行为默认请求包头信息的缓存大小,第二行表示大请求包头信息的缓存个数和大小

默认先开上面的1k容量,如果不够,再根据large值分配

注意生产环境一定不能开太大,如果开的特别大,别人用大包攻击我们几次就会导致我们的内存不足了


d、让用户浏览器缓存数据

让用户浏览器直接缓存页面数据,当用户再次请求此数据时,浏览器会立即返回其页面数据,这样比我们代理缓存服务器响应的还快

但是,这些缓存在浏览器中的页面数据什么时候失效就是用户自己决定的了,所以我们只能让浏览器缓存那些长期不变的静态数据。

定义方法:由于我们想让其缓存那些长期不变的静态数据而不是所有页面,所以我们需要在server段添加location进行匹配:

location ~ \.(jpg|gif|png) {

expires 30d;

}

上面配置的含义就是当用户请求我们location能匹配到的页面时,我们会让其缓存30天‘

这时我们可以在浏览器中输入aboutcache进行验证


e、防盗链

有时候我们的页面没有被访问,但是我们的页面资源一直在被访问,这就是盗链,我们可以对其进行防盗链:

浏览器会自动发送给服务器referer信息,referer里面的内容是我从哪里来,如果是盗链的数据,就会显示其是从哪里链接过来的,这时我们就可以判断了:

如果我们是从百度跳转到土豆的,那么referer的内容就是百度;如果没有盗链,referer就是百度自身




 

 

高性能Web服务器Nginx