Nginx学习笔记

Posted Shi Peng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx学习笔记相关的知识,希望对你有一定的参考价值。

一、nginx简介

Nginx是一款轻量级的反向代理服务器,也是一款轻量级的Web服务器(较少用到)

1.1、Nginx的使用场景

1、作为http反向代理服务器
2、作为负载均衡服务器
3、直接支持php(web服务器)
4、作为邮件代理服务器
5、帮助实现前端动静分离

1.2、Nginx特点

高稳定、高性能、资源占用少、功能丰富、模块化结构、支持热部署
单台NG可支撑10万并发

二、Nginx的安装

2.1、安装

以mac安装为例:
Step1:安装brew

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

Step2:安装Nginx

brew install nginx

2.2、安装后测试

1、测试配置是否正常
/nginx/sbin/nginx -t

2、启动nginx
/nginx/sbin/nginx

3、停止nginx
/nginx/sbin/nginx -s stop

4、重启nginx
/nginx/sbin/nginx -s reload

5、查看进程
ps -ef | grep nginx

三、Nginx的基本配置

配置文件在:安装路径/conf/nginx.conf

常见的配置文件:
1)nginx.conf:应用程序的基本配置文件
2)mime.types:MIME类型关联的扩展文件
3)fastcgi.conf:与fastcgi相关的配置(php开发时用)
4)proxy.conf:与proxy相关的配置(也可以在nginx.conf中配置)
5)sites.conf:配置Nginx提供的网站,包括虚拟主机(也可以在nginx.conf中配置)

Nginx的进程结构:
启动nginx时,会启动一个master进程,这个进程不处理任何客户端请求,主要用来产生worker进程,一个worker进程用来处理一个request。
这个方式类似于epoll reactor模型。

这个配置就是用于指定每个进程可启动的worker数,默认1024

events 
    use epoll;
    worker_connections  1024; 

http模块用来指定web的反向代理

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;
	...

log_format指定日志格式,$后面表示变量
access_log指定nginx的访问日志放到哪

从上面可以看出,nginx是模块化的方式,每个模块负责一个功能。
nginx的请求来了,可以想象成每个模块逐个走一遍,就好比责任链每个节点逐个过一遍。所以nginx的扩展性非常好:只要增减模块就行了。要增减模块,就是通过在配置文件中配置

upstream是用来做负载均衡:

upstream test1.com
	server 127.0.0.1:8080 weight=5;
	server 127.0.0.1:1111;

server:后端的虚拟主机

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://test1.com; # 指向upstream
        

其中,proxy_pass指nginx反向代理后指向的目标地址

nginx是由多个模块组成,所以要学习每个模块的配置使用。这些配置就类似于现成的API,使用API的方法就是我们去配置。

Nginx的模块包括:核心模块、事件模块、标准http模块、可选http模块、邮件模块、第三方模块、nginx自身的补丁等等

3.1、基本模块

基本模块指nginx默认的功能模块,他们提供的指令,允许你使用定义nginx基本功能的变量。
在编译的时候不能被禁用,包括:
1)核心模块:基本功能和指令,如进程管理和安全
2)事件模块:在nginx内配置网络使用的能力
3)配置模块:提供include机制

至于nginx中都支持哪些配置,每个配置干什么用的,可参看nginx官方文档:https://nginx.org/en/docs/

3.1.1、error_log

Syntax:	error_log file [level];
Default:	error_log logs/error.log error;
Context:	main, http, mail, stream, server, location

指定错误文件的位置及日志等级
每个server可以有自己的error_log地址

3.1.2、include

Syntax:	include file | mask;
Default:	—
Context:	any

从外部引入文件,可以支持文件的通配符

3.1.3、pid

Syntax:	pid file;
Default:	
pid logs/nginx.pid;
Context:	main

Defines a file that will store the process ID of the main process.

默认配置就有:

pid        logs/nginx.pid;

3.1.4、user

Syntax:	user user [group];
Default:	
user nobody nobody;
Context:	main

Defines user and group credentials used by worker processes. If group is omitted, a group whose name equals that of user is used.
指谁在运行nginx,通常用root运行。但要提升安全性,可以单独指定可运行nginx的用户。

默认配置:

user  nobody;

3.1.5、worker_cpu_affinity

Syntax:	worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
Default:	—
Context:	main

Binds worker processes to the sets of CPUs. Each CPU set is represented by a bitmask of allowed CPUs. There should be a separate set defined for each of the worker processes. By default, worker processes are not bound to any specific CPUs.
如果服务器上有多个CPU,可以指定worker进程和CPU的绑定关系

For example,

worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;

binds each worker process to a separate CPU, while

worker_processes    2;
worker_cpu_affinity 0101 1010;

binds the first worker process to CPU0/CPU2, and the second worker process to CPU1/CPU3. The second example is suitable for hyper-threading.

通常没必要配置这个,用默认就可以

3.1.6、worker_processes

Syntax:	worker_processes number | auto;
Default:	
worker_processes 1;
Context:	main

Defines the number of worker processes.
通常worker_processes是CPU核数的整数倍

3.2、日志模块

日志模块是控制nginx如何记录请求的日志

log_format compression '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $bytes_sent '
                       '"$http_referer" "$http_user_agent" "$gzip_ratio"';

access_log /spool/logs/nginx-access.log compression buffer=32k;
Syntax:	access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default:	
access_log logs/access.log combined;
Context:	http, server, location, if in location, limit_except

缓冲区大小不能超过写入文件的最小大小

nginx用户必须有写入nginx日志文件的权限

3.3、事件模块

推荐配置:
worker_processes 8 : 这里的8,推荐跟你的CPU核数相同

events
use epoll;
worker_connections 1024; # 这里跟你操作系统能打开的文件句柄数相同, 可通过ulimit -n来查看

3.4、HTTP核心模块

http配置主要分三个模块:

http  # 这个是协议级别
    include      mime.types;
    default_type  application/octet-stream;
    keepalive_timeout  65;
    gzip on

	server  # 这个是服务器级别,可以配置多个server
	    listen  80;
	    server_name  localhost;
      
        location ~* .~\\.(jpg|jpeg|gif|png|swf|ico)$ 
           if (-f $request_filename) 
                break;
	       
	    

        location /  # 这个是请求级别
           root html
           index index.htm index.htm
        
   

Nginx的http核心魔,包括大量指令和变量。

3.4.1、alias

Syntax:	alias path;
Default:	—
Context:	location

Defines a replacement for the specified location. For example, with the following configuration

location /i/ 
    alias /data/w3/images/;

nginx会把 /i/ 自动替换为 /data/w3/images/

也支持正则

3.4.2、client_max_body_size

Syntax:	client_max_body_size size;
Default:	
client_max_body_size 1m;
Context:	http, server, location

Sets the maximum allowed size of the client request body. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size.

3.4.3、error_page

Syntax:	error_page code ... [=[response]] uri;
Default:	—
Context:	http, server, location, if in location

Defines the URI that will be shown for the specified errors. A uri value can contain variables.

error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;

如果出现404,则跳转到/404.html

3.4.4、listen

指定server里可以被访问到的IP和端口地址,或可解析到的服务器的没名字。通常我们都只指定端口就可以。

Syntax:	listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Default:	
listen *:80 | *:8000;
Context:	server

3.4.5、open_file_cache

open_file_cache max=1000 inactive=20s; #设置缓存的最大数据,过期时间
open_file_cache_valid 30s; # 有效时间
open_file_cache_min_uses 2; # 最少使用此时
open_file_cache_errors on; # 通常打开

这几个配置配合使用

3.4.6、Location

Syntax:	location [ = | ~ | ~* | ^~ ] uri  ... 
location @name  ... 
Default:	—
Context:	server, location

指定模式来与客户端请求的URI 相匹配。

1、没有修饰符,表示:必须从指定模式开始,如:

server 
    server_name test.com
    location /abc 
		...
	

2、 = 表示:精确匹配,如:

server 
    server_name test.com
    location = /abc 
		...
	

3、~ 表示:指定的正则表达式要区分大小写,如:

server 
    server_name test.com
    location ~ ^/abc 
		...
	

下面是对的:
http://test.com/abc
http://test.com/abc?p1=1

下面是错的:
http://test.com/ABC
http://test.com/abc/

4、~* 表示:指定的正则表达式不区分大小写,如:

server 
    server_name test.com
    location ~* ^/abc 
		...
	

下面是对的:
http://test.com/abc
http://test.com/abc?p1=1
http://test.com/ABC

下面是错的:
http://test.com/abc/

5、^~ 表示无修饰符的行为,也是从指定模式开始,不同的是,如果模式匹配,那么久停止搜索其他模式了

6、@ 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_file或error_page等

查找顺序和优先级:
1)带有 = 的精确匹配
2)没有修饰符的精确匹配
3)正则表达式安装他们在配置文件中定义的顺序
4)带有 ~ 修饰符的,开头匹配
5)带有 ~ 或 ~* 修饰符的
6)没有修饰符的,如指定字符串与URI开头匹配,如: location / …, 这样配置用来兜底,优先级最低

3.5、HTTP反向代理模块

nginx通常用于后端服务器的反向代理,这样可方便的实现动静分离,以及负载均衡

http proxy模块,功能很多,最常用的时proxy_pass

http proxy模块,主要用于转发请求到其他服务器

location / 
    proxy_pass                 http://localhost:8000; # 转发指令
    proxy_set_header Host      $host; # 设置header的值
    proxy_set_header X-Real-IP $remote_addr; # 设置IP地址

3.5.1、proxy_buffer_size&proxy_buffering&proxy_buffers

Syntax:	proxy_buffer_size size;
Default:	
proxy_buffer_size 4k|8k;
Context:	http, server, location
Syntax:	proxy_buffering on | off;
Default:	
proxy_buffering on;
Context:	http, server, location
Syntax:	proxy_buffers number size;
Default:	
proxy_buffers 8 4k|8k;
Context:	http, server, location

proxy_buffer_size: 设置从被代理服务器读取的第一部分应答的缓冲区大小
即从后端tomcat返回应答的缓冲区大小,默认是4k/8k

proxy_buffering:为后端服务器启用应答缓存
如果启用缓存,nginx假设被代理服务器能够非常快的传递应答,并将其放入缓冲区。可以使用proxy_buffer_size和proxy_buffers设置相关参数

proxy_buffers:设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况为分页大小,根据操作系统不同可能是4k或8k

以上是关于Nginx学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Nginx学习笔记

nginx学习笔记五(nginx的事件模块定义)

Nginx学习笔记

nginx学习笔记

Nginx学习笔记

nginx学习笔记七(nginx HTTP框架的执行流程)