前言
在配置我的网站的过程中,深觉自己功力尚浅,不由黯然伤神,遂有奋进之意,针对这个过程中的不自然优雅的操作,得加强学习。在配置整个虚拟网络的过程中,由于对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
文件存放路径、日志的类型和存放路径。
# 定义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
的网络连接进行序列化,每个线程支持的最大并发连接数,选取哪种驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
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
块。
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
指令
用于配置监听端口,有三种配置语法。
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
指令
配置虚拟主机的名称。
server_name [name];
可以由多个名称并列,之间用空格隔开。
location
块
每个server
块中可以包含多个location
块。主要用于Nginx服务器接收到的请求字符串对除虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。
该块的定义为:
location [ = | ~ | ~* | ^~ ] uri { ... }
uri
指待匹配的请求字符串,可以为字符串,也可以为正则表达式。
方括号中为可选项,用来说明请求字符串与 uri
的匹配方式。
nginx.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可以说十分精妙,这篇博文就作为一个种子,象征着一个方向学习的开始,海纳百川,皆由点滴汇聚,望行走人生小路,无限进步。
参考
- W3C Nginx教程
- Nginx文档