在项目使用中,使用最多的三个核心功能是静态服务器、反向代理和负载均衡。
这三个不同的功能的使用,都跟 Nginx 的配置息息相关,Nginx 服务器的配置都集中在 nginx.conf 这个配置文件中,并且所有的可配置选项大致分为以下几个部分。
main # 全局配置
events { # 工作模式配置
....
}
http { # http设置
....
server { # 服务器主机配置(虚拟主机、反向代理等)
....
location { # 路由配置(虚拟目录等)
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 负载均衡配置
....
}
}
一、main 模块
-
user
:用来指定 nginx worker 进程运行用户以及用户组,默认 nobody 账号运行 -
worker_processes
:指定 nginx 要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是 CPU 内核数量的整数倍 -
error_log
:定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】 -
pid
:用来指定进程 id 的存储文件的位置 -
worker_rlimit_nofile
:用于指定一个进程可以打开最多文件数量的描述 -
...
二、event 模块
-
worker_connections
:指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和 worker processes 共同决定的。 -
multi_accept
:配置指定 nginx 在收到一个新连接通知后尽可能多的接受更多的连接 -
use epoll
:配置指定了线程轮询的方法,如果是 linux2.6+,使用 epoll,如果是 BSD 如 Mac 请使用 Kqueue -
...
三、http 模块
作为 web 服务器,http 模块是 nginx 最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置。
1)基础配置
-
sendfile on
:配置 on 让 sendfile 发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处 -
tcp_nopush on
:让 nginx 在一个数据包中发送所有的头文件,而不是一个一个单独发 -
tcp_nodelay on
:让 nginx 不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦
-
keepalive_timeout 10
:给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让 nginx 工作持续性更好 -
client_header_timeout 10
:设置请求头的超时时间 -
client_body_timeout 10
:设置请求体的超时时间 -
send_timeout 10
:指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接
-
limit_conn_zone $binary_remote_addr zone=addr:5m
:设置用于保存各种key的共享内存的参数, -
limit_conn addr 100
: 给定的key设置最大连接数
-
server_tokens
:虽然不会让 nginx 执行速度更快,但是可以在错误页面关闭 nginx 版本提示,对于网站安全性的提升有好处哦 -
include /etc/nginx/mime.types
:指定在当前文件中包含另一个文件的指令 -
default_type application/octet-stream
:指定默认处理的文件类型可以是二进制 -
type_hash_max_size 2048
:混淆数据,影响三列冲突率,值越大消耗内存越多,散列 key 冲突率会降低,检索速度更快;值越小 key,占用内存较少,冲突率越高,检索速度变慢
2)日志配置
-
access_log logs/access.log
:设置存储访问记录的日志 -
error_log logs/error.log
:设置存储记录错误发生的日志
3)SSL 证书配置
-
ssl_protocols
:指令用于启动特定的加密协议,nginx 在 1.1.13 和 1.0.12 版本后默认是 ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1 与 TLSv1.2 要确保 OpenSSL >= 1.0.1,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。 -
ssl prefer server ciphers
:设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件
4)压缩配置
-
gzip
:是告诉 nginx 采用 gzip 压缩的形式发送数据。这将会减少我们发送的数据量。 -
gzip_disable
:为指定的客户端禁用 gzip 功能。我们设置成 IE6 或者更低版本以使我们的方案能够广泛兼容。 -
gzip_static
:告诉 nginx 在压缩资源之前,先查找是否有预先 gzip 处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样 nginx 就不用再压缩这些文件了(想要更详尽的 gzip_static 的信息,请点击这里)。 -
gzip_proxied
:允许或者禁止压缩基于请求和响应的响应流。我们设置为 any,意味着将会压缩所有的请求。 -
gzip_min_length
:设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。 -
gzip_comp_level
:设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。 -
gzip_type
:设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。
5)文件缓存配置
-
open_file_cache
:打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。 -
open_file_cache_valid
:在 open_file_cache 中指定检测正确信息的间隔时间。 -
open_file_cache_min_uses
:定义了 open_file_cache 中指令参数不活动时间期间里最小的文件数。 -
open_file_cache_errors
:指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。
四、sever 模块
srever 模块配置是 http 模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。
server {
listen 80;
server_name localhost 192.168.1.100;
charset utf-8;
access_log logs/access.log;
error_log logs/error.log;
......
}
-
server
:一个虚拟主机的配置,一个 http 中可以配置多个 server -
server_name
:用来指定 ip 地址或者域名,多个配置之间用空格分隔 -
charset
:用于设置 www/ 路径中配置的网页的默认编码格式 -
access_log
:用于指定该虚拟主机服务器中的访问记录日志存放路径 -
error_log
:用于指定该虚拟主机服务器中访问错误日志的存放路径
五、location 模块
location 模块是 Nginx 配置中出现最多的一个配置,主要用于配置路由访问信息。
在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以 location 模块也是一个非常重要的配置模块。
1)基本配置
location / {
root /nginx/www;
index index.php index.html index.htm;
}
-
location /
:表示匹配访问根目录 -
root
:用于指定访问根目录时,访问虚拟主机的 web 目录 -
index
:在不指定访问具体资源时,默认展示的资源文件列表
2)反向代理配置
通过反向代理代理服务器访问模式,通过 proxy_set 配置让客户端访问透明化。
location / {
proxy_pass http://localhost:8888;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
}
3)uwsgi 配置
location / {
include uwsgi_params;
uwsgi_pass localhost:8888
}
六、负载均衡模块(upstream)
upstream 模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。简单的配置方式如下。
upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 max_fails=3;
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
-
ip_hash
:指定请求调度算法,默认是weight权重轮询调度,可以指定 -
server host:port
:分发服务器的列表配置 -
-- down
:表示该主机暂停服务 -
-- max_fails
:表示失败最大次数,超过失败最大次数暂停服务 -
-- fail_timeout
:表示如果请求受理失败,暂停指定的时间之后重新发起请求
七、Nginx 主要配置
1)静态Http服务器配置
首先,Nginx 是一个 HTTP 服务器,可以将服务器上的静态文件(如HTML、图片)通过 HTTP 协议展现给客户端。
配置:
server {
listen 80; # 端口
server_name localhost 192.168.1.100; # 域名
location / { # 代表这是项目根目录
root /usr/share/nginx/www; # 虚拟目录
}
}
2)反向代理服务器配置
什么是反向代理?
客户端本来可以直接通过 HTTP 协议访问某网站应用服务器,如果网站管理员在中间加上一个 Nginx,客户端请求 Nginx,Nginx 请求应用服务器,然后将结果返回给客户端,此时 Nginx 就是反向代理服务器。
反向代理配置:
server {
listen 80;
location / {
proxy_pass http://192.168.0.112:8080; # 应用服务器HTTP地址
}
}
既然服务器可以直接 HTTP 访问,为什么要在中间加上一个反向代理,不是多此一举吗?反向代理有什么作用?继续往下看,下面的负载均衡、虚拟主机,都基于反向代理实现,当然反向代理的功能也不仅仅是这些。
3)负载均衡配置
当网站访问量非常大,也摊上事儿了。因为网站越来越慢,一台服务器已经不够用了。于是将相同的应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。Nginx 可以通过反向代理来实现负载均衡。
负载均衡配置:
upstream myapp {
server 192.168.0.111:8080; # 应用服务器1
server 192.168.0.112:8080; # 应用服务器2
}
server {
listen 80;
location / {
proxy_pass http://myweb;
}
}
4)虚拟主机配置
有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。
例如将 www.aaa.com 和 www.bbb.com 两个网站部署在同一台服务器上,两个域名解析到同一个 IP 地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
虚拟主机配置:
server {
listen 80 default_server;
server_name _;
return 444; # 过滤其他域名的请求,返回444状态码
}
server {
listen 80;
server_name www.aaa.com; # www.aaa.com域名
location / {
proxy_pass http://localhost:8080; # 对应端口号8080
}
}
server {
listen 80;
server_name www.bbb.com; # www.bbb.com域名
location / {
proxy_pass http://localhost:8081; # 对应端口号8081
}
}
在服务器 8080 和 8081 分别开了一个应用,客户端通过不同的域名访问,根据 server_name 可以反向代理到对应的应用服务器。
虚拟主机的原理是通过 HTTP 请求头中的 Host 是否匹配 server_name 来实现的,有兴趣的同学可以研究一下HTTP协议。
另外,server_name 配置还可以过滤有人恶意将某些域名指向你的主机服务器。
八、全局变量
-
$args
:这个变量等于请求行中的参数,同 $query_string。 -
$is_args
:如果已经设置 $args,则该变量的值为 "?",否则为 ""。 -
$content_length
:请求头中的 Content-length 字段。 -
$content_type
:请求头中的 Content-Type 字段。 -
$document_uri
:与 $uri 相同。 -
$document_root
:当前请求在 root 指令中指定的值。 -
$host
:请求主机头字段,否则为服务器名称。 -
$http_user_agent
:客户端 agent 信息。 -
$http_cookie
:客户端 cookie 信息。 -
$limit_rate
:这个变量可以限制连接速率。 -
$request_method
:客户端请求的动作,通常为 GET 或 POST。 -
$remote_addr
:客户端的 IP 地址。 -
$remote_port
:客户端的端口。 -
$remote_user
:已经经过 Auth Basic Module 验证的用户名。 -
$request_body_file
:客户端请求主体的临时文件名。 -
$request_uri
:请求的 URI,带参数 -
$request_filename
:当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成。 -
$scheme
:所用的协议,比如 http 或者是 https,比如 rewrite ^(.+)$ $scheme://example.com$1 redirect;。 -
$server_protocol
:请求使用的协议,通常是 HTTP/1.0 或 HTTP/1.1。 -
$server_addr
:服务器地址,在完成一次系统调用后可以确定这个值。 -
$server_name
:服务器名称。 -
$server_port
:请求到达服务器的端口号。 -
$request_uri
:包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz,它无法修改。 -
$uri
:不带请求参数的当前 URI,$uri 不包含主机名,如 /foo/bar.html 可能和最初的值有不同,比如经过重定向之类的。它可以通过内部重定向,或者使用 index 指令进行修改。不包括协议和主机名,例如 /foo/bar.html。
例子:
访问链接是:http://localhost:88/test/index.html
网站路径是:/var/www/html
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test/index.html
$document_uri:/test/index.html
$document_root:/var/www/html
$request_filename:/var/www/html/test/index.html
@ 版权声明:本文为CSDN博主「一个有梦想的混子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
@ 原文链接:https://blog.csdn.net/qq_33454884/article/details/89212702