Nginx学习记录一揽子:学会配置Nginx

前言

在配置我的网站的过程中,深觉自己功力尚浅,不由黯然伤神,遂有奋进之意,针对这个过程中的不自然优雅的操作,得加强学习。在配置整个虚拟网络的过程中,由于对Nginx的了解不深,使用起来也捉襟见肘,就从Nignx的学习开始。

Nignx是什么

Nignx是一款轻量级的高性能web服务器和反向代理服务器,也提供IMAP/POP3/SMTP服务。具有占用少,并发性高,可扩展性好,高可靠性,热部署的特点。
正向代理

正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器中获取内容,客户端向代理发送一个请求并指定目标,然后代理服务器向原始服务器转交请求并间获得的内容返回给客户端。正向代理是在客户端的。
反向代理

反向代理方式是指以代理服务器来接受网络上的连接请求,然后将请求准发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端,反向代理是在服务端的。

Nginx使用

配置文件nginx.conf

nginx.conf是一个纯文本类型的文件,整个文件以区块的形式组织,每一个区块都放在大括号中。

  • main块位于nginx.conf配置文件的最高层,是nginx的全局配置,设置一些影响Nginx服务器的配置指令;main块下边有events块和http块。
  • event块的内容影响nginx服务器与用户的网络连接。包括每个进程的最大连接数,选取哪种驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • http块中有一个或多个server块;配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,minme-type,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • server块下允许有一个或多个location块;用于配置虚拟主机的相关参数。
  • location块用来配置请求的路由,以及各种页面的处理情况。
main

通常配置运行Nginx服务器的用户(组)、允许的worker process数量,Nignx

进程PID文件存放路径、日志的类型和存放路径。

conf 复制代码
# 定义Nginx运行的用户和用户组 
user [user] [group]; 

# nginx进程数,可以指定具体线程数,一般为cpu支持的线程数,也可使用自动配置 
worker_processes [number]|auto; 

# 全局错误日志定义类型
error_log [path] [debug|info|notice|warn|error|crit]

# 进程pid文件,指出pid文件的路径 
pid [path]; 
events

通常配置Nignx服务器与用户的网络连接,包括是否开启对多work process的网络连接进行序列化,每个线程支持的最大并发连接数,选取哪种驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

conf 复制代码
events { 
	# 是否对对个连接进程序列化
	# 开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢
	accept_mutex on|off;
	
	# 一个工作进程是否能同时接受所有的新连接
	# 默认为off,一个工作进程只能同时接受一个新连接。
	# Nignx使用`kqueue`驱动模型,忽略该指令。
	multi_accept on|off;
	
	# 指定使用哪种驱动模型,需要结合操作系统进行选择。
	use [select|poll|kqueue|rtsig|epoll|/dev/poll]; 
	
	# 设置单个进程并发的最大连接数,当连接数超过时就不再接收请求。
	#  不能超过系统支持的最大打开文件数。
	worker_connections [number]; 
	
	#keepalive超时时间。这里是应用层的keep-alive
	keepalive_timeout [time];
	 
	# 客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置
	client_header_buffer_size 1k; 
	
	# 这个将为打开文件指定缓存,默认是没有启用的
	# max指定缓存数量,建议和打开文件数一致.
	# inactive是指经过多长时间文件没被请求后删除缓存。 
	open_file_cache max=65535 inactive=60s;
	
	#这个是指多长时间检查一次缓存的有效信息。 
	open_file_cache_valid [time];
} 	
http

用于配置代理、缓存、日志定义和第三方模块等功能。http块可以包含自己块内的main块,也可以包含server块。

conf 复制代码
http{
	# 文件扩展名与文件类型映射,mime.types文件与配置文件同级目录
	include mime.types;
	
	# 默认文件类型,默认值为text/plain。
	default_type application/octet-stream;
	
	# 默认编码 
	charset utf-8;
	
	# 保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。
	server_names_hash_bucket_size [size];
	
	# 客户端请求头部的缓冲区大小,可以根据系统分页大小来设置
	client_header_buffer_size [size];
	
	# 客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。
	large_client_header_buffers 4 [size];
	
	# 设定通过nginx上传文件的大小 
	client_max_body_size [size];
	
	# log_format指令,用于定义日志格式
	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 [path] main;
	
	# 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件
	sendfile on|off;
	
	# 设置sendfile最大数据量 
	sendfile_max_chunk [size];
	
	# size值如果大于0,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过这个值(这里是128k,所以每次不能超过128k);如果设置为0,则无限制。默认值为0。
	sendfile_max_chunk 128k;
	
	#此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用 
	tcp_nopush on; 
	tcp_nodelay on;
	
	# 配置连接超时时间
	# timeout,服务器端对连接的保持时间。
	# 默认值为75s;header_timeout,可选项,在应答报文头部的Keep-Alive域设置超时时间
	keepalive_timeout [timeout] [header_timeout];
	
	# 单连接请求数上限
	#指令keepalive_requests用于限制用户通过某一连接向Nginx服务器发送请求的次数。默认是100
	keepalive_requests [number];
	
	#gzip模块设置 
	gzip on; #开启gzip压缩输出 
	gzip_min_length 1k; #最小压缩文件大小 
	gzip_buffers 4 16k; #压缩缓冲区 
	gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
	gzip_comp_level 2; #压缩等级 
	gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型 
	gzip_vary on;
	
	# 负载均衡配置
	upstream [mywebsite] {
		server [ip1]:[port1] weight=[number1]; # weight是权重
		server [ip2]:[port2] weight=[number2];
    }
}
server

用来配置虚拟主机。虚拟主机技术主要应用于Http、FTP以及email等多项服务,将一台服务器虚拟化分为多个虚拟服务器,从而充分利用服务器硬件资源,从外界看来,一台虚拟主机与一台独立的服务器是一样的。

Nginx服务器利用虚拟主机技术避免为每一个网站配置单独的Nginx服务器,同一台服务器只需要一组Nginx就可以运行多个网站或服务。
server块也有自己的全局块,在全局块中,最常见的是本虚拟主机的监听配置listen指令和本虚拟主机名称或ip配置的server_name指令。

listen指令

用于配置监听端口,有三种配置语法。

conf 复制代码
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]];

字段含义说明:

  • address:监听的ip地址(请求来源的IP地址)。
  • port:端口号,默认80端口。多个虚拟主机端口号可以相同,但是server_name需要设置为不同域名或标识。
  • default_serve:匹配失败后,转向默认虚拟主机处理。
  • ssl:标识符,设置会话连接使用SSL模式进行,需要SSL证书,采用Https连接。
server_name指令

配置虚拟主机的名称。

conf 复制代码
server_name [name];

可以由多个名称并列,之间用空格隔开。

location

每个server块中可以包含多个location块。主要用于Nginx服务器接收到的请求字符串对除虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。

该块的定义为:

conf 复制代码
location [ = | ~ | ~* | ^~ ] uri { ... }

location进行命名,用@标识:

conf 复制代码
location @name {...}

uri指待匹配的请求字符串,可以为字符串,也可以为正则表达式。

方括号中为可选项,用来说明请求字符串与 uri 的匹配方式:

  • = :精确匹配,内容要与表达式完全一致。
  • ~:执行正则匹配,区分大小写。
  • ~*:执行正则匹配,忽略大小写。
  • ^~:标识普通字符串匹配以上后不再进行正则匹配。
  • null:不加任何规则时,默认大小写敏感,前缀匹配。
  • 以上四种匹配顺序为=>^~>~|~*>最长前缀匹配>/
proxy_set_header

proxy_set_header用来设定被代理服务器接收到的header信息,语法如下:

conf 复制代码
proxy_set_header [field] [value];
  • field:标识需要更改的项目。
  • value:标识更改项目的值。
  • 如果不设置proxy_set_header,则默认的host值为proxy_pass+代理端口。
nginx.conf案例
conf 复制代码
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

worker_rlimit_nofile 51200;

events {
    use epoll;
    worker_connections 10240;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    server_names_hash_bucket_size 128;
    client_header_buffer_size     32k;
    large_client_header_buffers   4 32k;

    client_max_body_size          50m;
    limit_conn_zone $binary_remote_addr zone=perip:256k;
    limit_conn_log_level notice;

    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 /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush     on;

    keepalive_timeout 65;
    tcp_nodelay on;

    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

    upstream mywebsite {
        server wps:80;
    }

    server {
        listen 80;

        sendfile on;
        keepalive_timeout 65;

        charset utf-8;

        location / {
            charset utf-8;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_pass http://mywebsite;
            proxy_redirect off;
        }
    }
}

说一说

Nginx可以说十分精妙,这篇博文就作为一个种子,象征着一个方向学习的开始,海纳百川,皆由点滴汇聚,望行走人生小路,无限进步。

参考

相关推荐
2201_7548647830 分钟前
学习日记(2026年3月23日)
学习
今晚务必早点睡1 小时前
Nginx 从入门到精通:一篇讲透原理、功能、配置与实战场景
运维·nginx·负载均衡
givemeacar1 小时前
Nginx如何实现 TCP和UDP代理?
tcp/ip·nginx·udp
xw-busy-code2 小时前
Prettier 学习笔记
javascript·笔记·学习·prettier
毕设源码-郭学长2 小时前
【开题答辩全过程】以 课程学习过程性评价系统为例,包含答辩的问题和答案
学习
酸奶乳酪2 小时前
IIC学习笔记
笔记·单片机·学习
xuefeiniao3 小时前
Docker 部署宝塔面板 Nginx 反向代理 502 踩坑实录
nginx·docker·容器
小陈phd3 小时前
系统架构师学习笔记(二)——计算机体系结构之指令系统
笔记·学习·系统架构
吃杠碰小鸡4 小时前
前端 IndexedDB 完全指南
学习
yaaakaaang4 小时前
(一)前端,如此简单!---下载Nginx
前端·nginx