Nginx

  • 什么是Nginx
  • Nginx的功能
  • Nginx安装
  • Nginx.conf配置解析
  • 全局块
  • Events块(设定Nginx的工作模式及连接数上限)
  • Http块(全局)
  • Http块(Server块)
  • 全局块:
  • location块:


什么是Nginx

Nginx 是一款免费开源的高性能 HTTP 代理服务器及反向代理服务器(Reverse Proxy)产品,同时它还可以提供 IMAP/POP3 邮件代理服务等功能。它高并发性能很好,官方测试能够支撑 5 万的并发量;运行时内存和 CPU 占用率低,配置简单,容易上手,而且运行非常稳定。

Nginx的功能

Nginx在不依赖第三方模块的前期下,主要的功能有:

  1. 正向代理:代理的是客户端。浏览器先访问Nginx服务器地址,Nginx服务器转发请求,并最后将请求结果原路返回来。
  2. 反向代理:代理的是服务器。客户端向服务器发送请求时,会首先经过 Nginx 服务器,由服务器将请求分发到相应的 WEB 服务器。正向代理是代理客户端,而反向代理则是代理服务器,Nginx 在提供反向代理服务方面,通过使用正则表达式进行相关配置,采取不同的转发策略,配置相当灵活,而且在配置后端转发请求时,完全不用关心网络环境如何,可以指定任意的IP地址和端口号,或其他类型的连接、请求等。
  3. 负载均衡:当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
  4. 动静分离:在Web开发中,通常来说,动态资源其实就是指那些后台资源,而静态资源就是指HTML,JavaScript,CSS,img等文件。
    一般来说,都需要将动态资源和静态资源分开,将静态资源部署在Nginx上,当一个请求来的时候,如果是静态资源的请求,就直接到nginx配置的静态资源目录下面获取资源,如果是动态资源的请求,nginx利用反向代理的原理,把请求转发给后台应用去处理,从而实现动静分离。
    在使用前后端分离之后,可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间。

Nginx安装

详细信息参看:

Nginx.conf配置解析

主要分为以下几块:

main # 全局设置
events { # Nginx工作模式
    ....
}
http { # http设置
    ....
    upstream myproject { # 负载均衡服务器设置
        .....
    }
    server  { # 主机设置
        ....
        location { # URL匹配
            ....
        }
    }
    server  {
        ....
        location {
            ....
        }
    }
    ....
}

全局块

主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等

#user  nobody;
# 运行用户
worker_processes  1;
# 启动进程,通常设置成和cpu的数量相等
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#全局错误日志
#pid        logs/nginx.pid;
#PID文件
  1. #user nobody;
    nobody 是系统用户,是一个不能登陆的帐号,一个特殊用途的用户 ID。
    一些服务进程如apache,aquid等都采用一些特殊的帐号来运行,比如nobody,news,games等等。 一般来说 uid < 500 的都是系统 ID 。如果不指定用户,nginx默认用户是nobody。
    这里用户的设置又有什么意义呢?主要是指定执行nginx的worker process的用户,linux里所有程序都是文件,都具有权限问题:这个指定的用户对特定的文件有没有权限访问或执行,就是这个用户的意义:可以把每个服务运行的情况隔离出来,保证不会因为服务器程序的问题而让服务器程序成了黑客的直接操作源。
    指令格式:
user user [group];

user:指定可以运行Nginx服务器的用户;group:可选项,可以运行Nginx服务器的用户组。
如果user指令不配置或者配置为user nobody nobody,默认由nobody账户运行。

  1. worker_processes 1;
    Nginx开启的进程数,worker_processes默认情况下为1,一般情况下不用修改,但考虑到实际情况,可以修改这个数值,以提高性能;也可以修改为worker_processes auto;自动的设置进程个数。
    官方的建议是修改成CPU的内核数,一般开一个就够了,多开几个,可以减少机器io带来的影响。
    指令格式:
worker_processes number | auto;

number : Nginx 进程最多可以产生的worker process 数。
auto : Nginx 进程将自动检测。

  1. #error_log logs/error.log;
    error_log是关键字不能改变,logs/error.log是存放日志的目录,可以指定任意目录。在后面还可以添加日志级别,例如 error_log logs/error.log info;常见的错误日志级别有[debug | info | notice | warn | error | crit | alert | emerg],级别越高记录的信息越少。生产场景一般是 warn | error | crit 这三个级别之一,不要配置info等级较低的级别,会带来大量的磁盘I/O消耗。
    指令格式:
error_log file | stderr;

file : 日志输出到某个文件file
stderr : 日志输出到标准错误输出 (日志输出级别)

  1. #pid logs/nginx.pid;
    Nginx进程是作为系统守护进程在进行,需要在某个文件中保存当前运行程序的主进程号,Nginx支持该保存文件路径的定义。
    指令格式:
指令格式:pid file;

file:指定存放路径和文件名称。
如果不指定,则默认置于路径 logs/nginx.pid。

Events块(设定Nginx的工作模式及连接数上限)

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。

events {
	use epoll;
	#epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
    worker_connections  1024;
    #单个后台worker process进程的最大并发链接数
}
  1. worker_connections 1024;
    用于定义Nginx每个进程的最大连接数,默认是1024。
    进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
    指令格式:
worker_connections number;

number : 工作进程可以打开的最大同时连接数

  1. #use [ kqueue | epoll | /dev/poll | select | poll ];
    指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll 。其中select 和poll 都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。
    指令格式:
use method;

method : 要使用的连接处理方式,例如kqueue、epoll、select、poll、/dev/poll,通常无需显式指定它,因为默认情况下nginx将使用最有效的方法。

Http块(全局)

Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。它负责HTTP服务器相关属性的配置。Http部分又包含:http全局部分、一个或以上server 部分。

http {
    include       mime.types;
    #设定mime类型,类型由mime.type文件定义
    default_type  application/octet-stream;
	charset utf-8;
	#默认编码
    #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;
    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
    #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    tcp_nopush     on;
    tcp_nodelay     on;
	#将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
	#开启gzip压缩输出
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
  1. include mime.types;:
    Nginx 会根据mime type定义的对应关系来告诉浏览器如何处理服务器传给浏览器的这个文件,是打开还是下载;如果Web程序没设置,Nginx也没对应文件的扩展名,就用Nginx 里默认的 default_type定义的处理方式。
    比如Nginx默认的配置中default_type application/octet-stream; 这个就是默认为下载,浏览器访问到未定义的扩展名的时候,就默认为下载该文件;如果将这个设置改成default_type text/html;那就是告诉浏览器默认的打开方式是把所有未设置的扩展名当HTML文件打开,虽然可能这样设置会很多打不开。
    mime type 和文件扩展名的对应关系一般放在 mime.types这个文件里,然后用 include mime.types; 来加载。
include mime.types;
#文件扩展名与文件类型映射表
default_type application/octet-stream;
#默认文件类型

指令格式:

include file;

该指令主要用于将其他的Nginx配置或第三方模块的配置引用到当前的主配文件中,减少主配置文件的复杂度。
default_type application/octet-stream;
default_type属于HTTP核心模块指令,这里设定默认类型为二进制流。也就是当文件类型未定义时使用这种方式。例如在没有配置asp的locate 环境时,Nginx是不予解析的,此时,用浏览器访问asp文件就会出现下载窗口了。

2.自定义服务日志
此处所指的日志与常规的不同,它是指记录Nginx服务器提供服务过程应答前端请求的日志

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#Nginx默认的log_format的格式,main表示给log_format取的别名;可自定义,此指令只能在http块中进行配置
#log_format yuedu '$http_yd_uid $http_yd_token $remote_addr [$time_local] $request_method $http_host $request_uri $status $body_bytes_sent $upstream_response_time "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
#定义了上面的日志格式后,可以以下面的形式使用日志
#access_log logs/access.log main;
#此指令可以在http块、server块或者location块中进行设置
#用来纪录每次的访问日志的文件地址,后面的main是日志的格式样式,对应于log_format的main。

main的类型日志记录如下:也可以增删部分参数。

nginx反向代理的server_name可以写任意ip吗 nginx反向代理服务器作用_nginx

  1. 允许sendfile方式传输文件
sendfile on;
#tcp_nopush on;

开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数(zero copy 方式)来输出文件,对于普通应用必须设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
#tcp_nopush on;此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用。

  1. 连接超时时间:
#keepalive_timeout 0;
keepalive_timeout 65;

设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接,单位是秒。
若将它设置为 0,就禁止了 keepalive 连接。

  1. gzip压缩:
#gzip  on;

开启nginx gzip压缩后,网页、css、js等静态资源的大小会大大的减少,从而可以节约大量的带宽,提高传输效率,给用户快的体验。

Http块(Server块)

这块和虚拟主机有密切关系。每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

全局块:
server {
listen       80;
#声明服务器监听的端口号
server_name  localhost;
#用来指定IP地址或者域名,多个域名之间用空格分开
root   /Users/yangyi/www;
#表示在这整个server虚拟主机内,全部的root web根目录。注意要和locate {}下面定义的区分开来。
index  index.php index.html index.htm; 
#全局定义访问的默认首页地址。注意要和locate {}下面定义的区分开来。
charset koi8-r;
# 用于设置网页的默认编码格式
access_log  logs/host.access.log  main;
#定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式,在前面已经定义了。
}
location块:

location模块是nginx中用的最多的,也是最重要的模块了,什么负载均衡啊、反向代理啊、虚拟域名啊都与它相关。
location块的主要作用是,基于Nginx服务器接收到的请求字符串(例如, server_name/uri-string),对除虚拟主机名称(也可以是IP别名,后文有详细阐述)之外的字符串(前例中“/uri-string”部分)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。
设定默认首页和虚拟机目录:

location / {
#location / 表示匹配访问根目录。
    root   /Users/yangyi/www;
    #root 指令用于指定访问根目录时,虚拟主机的web目录,这个目录可以是相对路径(相对路径是相对于nginx的安装目录)。也可以是绝对路径。
    index  index.php index.html index.htm;
    #index 用于设定我们只输入域名后访问的默认首页地址,有个先后顺序:index.php index.html index.htm,如果没有开启目录浏览权限,又找不到这些默认首页,就会报403错误。
}