关于Nginx
安装的部分也不再赘述,直接参考官网即可
主要介绍基础配置,进阶的部分以后单独总结
反向代理和正向代理
平时常说的代理不特指的话一般都是指正向代理。
正向代理
正向代理是为客户端服务的,它作为正向代理帮助客户端访问一些服务,这时被访问的服务实际上是不知道真正的客户端,对服务端来说,请求是谁发的,就把响应发给谁。
那为什么我们自己不直接访问,非得找个代理帮我们访问呢?当然是因为有些内容只有代理能访问到,而我们访问不到,但我们能访问代理,那么就可以让代理来帮我们。
也就是说,正向代理对客户端是透明的,对服务端是非透明的。
反向代理
反向代理是为服务端服务的,它用来将客户端的请求发送给真正的服务端,此时客户端并不知道真正的服务端是谁,也就是代理向客户端隐藏了真实的服务端。
也就是说,反向代理对于服务端是透明的,对客户端是非透明的。
Nginx常用命令
说是常用,但也不常用,因为一般会把Nginx加入系统服务中,使用systemctl
操作。
nginx -s stop # 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务
nginx -s quit # 平稳关闭Nginx,保存相关信息,有安排的结束web服务
nginx -s reload # 因改变了Nginx相关配置,需要重新加载配置而重载
nginx -s reopen # 重新打开日志文件
nginx -c filename # 为 Nginx 指定一个配置文件,来代替缺省的
nginx -t # 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
nginx -v # 显示 nginx 的版本
nginx -V # 显示 nginx 的版本,编译器版本和配置参数
Nginx配置文件
Nginx的所有核心内容都在配置文件中,这个配置文件在Debian系统中会默认在/etc/nginx/nginx.conf
,编译安装默认为/usr/local/nginx
。
基本配置概览
主配置文件大概长这个样子(不是默认配置):
user www-data www-data;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65535;
events {
accept_mutex on;
multi_accept on;
use epoll;
worker_connections 65535;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
#autoindex off;
sendfile on;
sendfile_max_chunk 128k;
keepalive_timeout 120;
tcp_nopush on;
tcp_nodelay on;
proxy_buffers 32 512k;
proxy_buffer_size 8k;
client_header_timeout 120s;
client_body_timeout 120s;
client_max_body_size 50000m;
client_header_buffer_size 64k;
client_body_buffer_size 512k;
gzip on;
gzip_min_length 1k;
gzip_buffers 16 256k;
gzip_http_version 1.1;
gzip_comp_level 1;
gzip_vary on;
gzip_types text/plain application/x-javascript text/css text/javascript image/jpeg image/gif image/png;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 64k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 256k;
include /etc/nginx/conf.d/*.conf;
}
其中include /etc/nginx/conf.d/*.conf;
表示将/etc/nginx/conf.d/
的所有.conf
文件都包括进来,也就是说,我们可以在这个目录下分开写各个服务器(虚拟主机)的配置。
虚拟主机的配置位于配置文件http块中的server块,类似于:
http {
...
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
...
}
下面是 nginx
一些配置中常用的内置全局变量,可以在配置的任何位置使用它们。
变量名 | 功能 |
---|---|
$host |
请求信息中的 Host ,如果请求中没有 Host 行,则等于设置的服务器名 |
$request_method |
客户端请求类型,如 GET 、POST |
$remote_addr |
客户端的 IP 地址 |
$args |
请求中的参数 |
$content_length |
请求头中的 Content-length 字段 |
$http_user_agent |
客户端 agent 信息 |
$http_cookie |
客户端 cookie 信息 |
$remote_addr |
客户端的 IP 地址 |
$remote_port |
客户端的端口 |
$server_protocol |
请求使用的协议,如 HTTP/1.0 、HTTP/1.1 |
$server_addr |
服务器地址 |
$server_name |
服务器名称 |
$server_port |
服务器的端口号 |
从上面可以看出,配置文件主要分为三部分,全局配置,events块和http块,下面将对此一一介绍。
全局配置
user [user] [group]; # 指定运行nginx进程的用户和用户组,只能在全局块配置
worker_processes [number | auto]; # 指定工作的进程数,通常可以设为cpu的核心数的1-2倍或者auto,只能在全局块配置
error_log [path] [debug | info | notice | warn | error | crit | alert | emerg]; # 指定错误日志的保存路径和错误级别,可以在全局块、http块、server块以及location块中配置
pid [path]; # 指定pid文件的存放位置,只能在全局块配置
worker_rlimit_nofile [number]; # 指定一个nginx进程打开的最多文件描述符数目,可以尽量设大就不会出现Too many open files的报错,linux2.6内核下开启的文件打开数为65535,所以可以设为该值。
events块
events {
accept_mutex [on | off]; # 设置网络连接序列化,防止多个进程对连接的争抢,默认为on,只能在events块中进行配置
multi_accept [on | off]; # 设置一个进程是否同时接受多个网络连接,默认为off,只能在events块中进行配置
use [option]; # 指定网络IO模型,可选的选项有select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport,其中select和poll是标准工作模式,kqueue和epoll是高效的工作模式(epoll用于Linux,kqueue用于BSD),通常对于Linux系统,epoll是首选,不支持时才会用select。
worker_connections [number]; # 用于指定每一个worker进程可以开启的最大连接数,只能在events块中进行配置
}
http块
http {
include [path]; # 用于将其他位置的配置文件包含进来,比如mime.types,这个文件提供了文件扩展名和文件类型的映射
default_type [option]; # 用于设置默认文件类型,默认为text/plain
log_format [format_name] [format]; # 定义日志的格式,它的第一个参数是用来给格式自定义一个名字,第二个参数是具体的格式,参考上面的基本配置。
access_log [path] [format_name]; # 用于配置访问日志,第一个参数是日志文件的路径,第二个参数指定日志格式(由上面的log_format指令定义,默认为combined格式)
autoindex [on | off]; # 用于开启或关闭目录列表访问,适合下载服务器,默认off
sendfile [on | off]; # 配置是否开启sendfile,默认为on
sendfile_max_chunk [size]; # 配置每个进程每次调用sendfile()传输的数据量不能大于设定的值,默认为0,即不设上限
tcp_nopush [on | off]; # 用于定义发送响应是是否做缓存,启用后,会调用tcp_cork方法,数据包会累计到一定大小后才会发送,减小开销,只有在启用了sendfile后才会生效
keepalive_timeout [time]; # 表示连接超时时间,单位是秒,如果上传文件比较大,规定时间内没有上传完成就会自动断开
tcp_nodelay [on | off]; # 启用后会禁用Nagle算法,表示要尽快发送数据,只会针对keep-alive的连接才会启用
client_header_timeout [time]; # 配置等待client发送请求头的超时时间
client_body_timeout [time]; # 配置等待client发送请求体的超时时间
client_max_body_size [size]; # 限制了上传文件的大小
client_header_buffer_size [size]; # 指定客户端请求头的buffer大小
client_body_buffer_size [size]; # 指定客户端请求体的buffer大小
gzip [on | off]; # 配置是否开启gzip压缩
gzip_min_length [size]; # 设置最小压缩文件大小,建议设置大于1k
gzip_buffers [number] [size]; # 设置用于处理请求压缩的缓冲区数量和大小,建议使用默认就好
gzip_http_version [version]; # 用于识别http版本,因为早期浏览器不支持gzip,为了支持前期版本加入此选项,默认为1.1
gzip_comp_level [number]; # 用于设置压缩级别,级别越低压缩速度越快文件压缩比越小,反之速度越慢文件压缩比越大,通常1就够用,设置太大会吃性能
gzip_vary [on | off]; # 增加响应头"Vary: Accept-Encoding",告诉接收方发送的数据经过了压缩处理,开启后的效果是在响应头部添加了Accept-Encoding:gzip,这对于本身不支持gzip压缩的客户端浏览器有用
gzip_types [mime-type1] [mime-type2] ...; # 指定对除了"text/html"之外的其他类型进行gzip,使用*可以匹配任何类型
fastcgi_connect_timeout [size]; # 定义用于与FASCGI服务器建立连接的超时,默认60s
fastcgi_send_timeout [size]; # 设置用于向FASTCGI服务器发送请求的超时时间,默认60s
fastcgi_read_timeout [size]; # 定义用于从FASCGI服务器读取响应的超时,默认60s
fastcgi_buffer_size [size]; # 设置用于读取从FASCGI服务器接收的响应的第一部分的缓冲区的大小,默认4k或8k
fastcgi_buffers [number] [size]; # 为单个连接设置用于从FASCGI服务器读取响应的缓冲区的数量和大小,默认4k或8k
fastcgi_busy_buffers_size [size]; # 表示当启用对来自FastCGI服务器的响应的缓冲时,限制可能忙于向客户端发送响应而响应尚未完全读取的缓冲区的总大小,默认8k或16k
fastcgi_temp_file_write_size [size]; # 表示在启用从FastCGI服务器到临时文件的响应缓冲时,限制一次写入临时文件的数据的大小,默认8k或16k
}
部分指令解释:
sendfile
系统调用可以让网络数据直接在内核空间之间传输,不需要复制到用户空间,可以显著提高传输性能
tcp_nopush
和tcp_nodelay
二者看似互斥但可以同时启用,tcp_nopush
可以确保数据包在发送前已经充分填满,当存在最后一个因为没有填满而暂停发送的数据包时,tcp_nodelay
会强制套接字发送数据,更为详细的解释可以参考这篇博客的内容
CGI和FastCGI:
CGI(Common Gateway Interface, 公共网关接口),它是一种在Web服务器上运行程序的标准方法,比如需要处理
index.php
这类需要在服务器调用php
解释器来运行的程序,用于处理和显示一些动态内容。每次Web服务器遇到这类动态程序都要fork一个cgi进程,结束后再kill掉,这样性能就比较差,于是就有了FastCGI,它每次处理完后不会被kill,FastCGI使用持续的进程来处理一连串的请求,这些进程由FastCGI进程管理器管理,而不是web服务器。
http-server块
server {
listen [port]; # 主要设置监听端口,但后面可以跟很多参数比如ssl,default_server,http2等等
server_name [domain_name]; # 设置虚拟主机名或IP,通常是域名
root [path]; # 设置网站的根路径,也可以在location块中配置
index [file_name]; # 设置默认的索引文件,也可以在location块中配置
ssl_certificate [path]; # 表示开启ssl时需要设置的证书路径
ssl_certificate_key [path]; # 表示开启ssl时需要设置的ssl私钥路径
}
http-server-location块
location的两种语法:
location [ = | ~ | ~* | ^~ ] /URI { … }
location @/name/ { … }
location的匹配语法解释(优先级按照序号降低):
location =
# 精准匹配,匹配成功则立即处理,停止搜索其他匹配
location ^~
# 前缀匹配,用于标准uri前,一旦匹配立即处理,不再进行正则匹配,一般用来匹配目录
location ~
# 正则匹配(区分大小写),用于正则uri前
location ~*
# 正则匹配(不区分大小写),用于正则uri前
location /a
# 前缀匹配,用于标准uri前,优先级较低
location /
# 任何没有匹配成功的,都会匹配这里处理
location的匹配顺序:
-
先精准匹配
=
,精准匹配成功则会立即停止其他类型匹配; -
没有精准匹配成功时,进行前缀匹配。先查找带有
^~
的前缀匹配,带有^~
的前缀匹配成功则立即停止其他类型匹配,普通前缀匹配(不带参数^~
)成功则会暂存,继续查找正则匹配; -
=
和^~
均未匹配成功前提下,查找正则匹配~
和~*
。当同时有多个正则匹配时,按其在配置文件中出现的先后顺序优先匹配,命中则立即停止其他类型匹配; -
所有正则匹配均未成功时,返回步骤 2 中暂存的普通前缀匹配(不带参数
^~
)结果
location ~ \.php$ {
root /var/www/html; # 绝对路径,表示网站根目录
# root html; # 相对路径,相对于该配置文件的所在目录
# index index.html index.htm; # 索引文件
}
http-upstream块
用于配置负载均衡
upstream myapps {
# least_conn; # 表示使用least_conn负载均衡算法,把请求分配到连接数最少的server
# ip_hash; # 表示使用ip hash负载均衡算法,根据访问客户端 ip 的 hash 值分配,这样同一客户端的请求都会被分配到同一个server上,如果牵扯到session的问题,用这个是最好的选择
# 默认使用round robin算法,把每个请求逐一分配到不同的server,如果分配到的server不可用,则分配到下一个,直到可用
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}