查看“Nginx:配置文件”的源代码
←
Nginx:配置文件
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Nginx]] == 关于 == <pre> nginx本身作为一个完成度非常高的负载均衡框架,和很多成熟的开源框架一样,大多数功能都可以通过修改配置文件来完成,使用者只需要简单修改一下 nginx 配置文件,便可以非常轻松的实现比如反向代理,负载均衡这些常用的功能。 </pre> nginx 配置文件“'''nginx.conf'''”默认都放在 nginx 安装路径下的 '''conf''' 目录: <syntaxhighlight lang="bash" highlight=""> # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { 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; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } } </syntaxhighlight> 通常将 nginx 配置文件分为三大块: # '''全局块''': #: 设置一些影响 nginx 服务器整体运行的配置指令。主要包括:配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。 #: <syntaxhighlight lang="bash" highlight=""> user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/doc/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; </syntaxhighlight> # '''events块''': #: 主要影响 Nginx 服务器与用户的'''网络连接'''。常用的设置包括:是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。 #: <syntaxhighlight lang="bash" highlight=""> events { worker_connections 1024; } </syntaxhighlight> # '''http块''': #: http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。 #: <syntaxhighlight lang="bash" highlight=""> http { server { } } </syntaxhighlight> #: http是一个大块,里面也可以包括很多小块,比如: ## “'''http全局块'''”: ## “'''server块'''”:相当于一个'''虚拟主机''',一个http块可以拥有多个“server块”。 ##*: server块又包括: ##*# “全局server块”:包括了本虚拟机主机的监听配置,和本虚拟主机的名称或 IP 配置; ##*# “location块”:用来对虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。包括:地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。 == 反向代理 == 通过“http块”中的“'''server块'''”来配置不同的虚拟机(监听端口、服务器IP),并在“'''location块'''”配置需要代理的服务器。 === “location块”匹配说明 === “location块”:位于“http全局块”的“server块”中。 * 学会 location 指令匹配路径,就可以配置不同的代理规则。 location 指令:用于'''匹配 URL'''。 <syntaxhighlight lang="bash" highlight=""> location / { } </syntaxhighlight> 语法如下: # '''=''':'''严格匹配'''请求字符串与 uri,如果匹配成功,就停止继续向下搜索并立即处理该请求;(用于'''不含正则表达式'''的 uri) # '''~''':正则表达式'''匹配''',大小写敏感; # '''!~''':正则表达式'''不匹配''',大小写敏感; # '''~*''':正则表达式'''匹配'''(大小写不敏感); # '''!~*''':正则表达式'''不匹配'''(大小写不敏感); # '''^~''':要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后既使用,不再使用 location 块中的正则 uri 和请求字符串做匹配。 * 如果 uri 包含正则表达式,则必须要有 '''~''' 或者 '''~*''' 标识。 === Http 反向代理 === 示例: <syntaxhighlight lang="bash" highlight=""> server { listen 8888 ; ## 设置 nginx 监听端口为 8888 server_name xxx.xxx.xxx.xxx; ## 服务器的地址(ip 或 域名) # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location /hi/ { proxy_pass http://127.0.0.1:8080; ## 需要代理的服务器地址 index index.html; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } </syntaxhighlight> 如上,请求服务器:“xxx.xxx.xxx.xxx:80”的所有请求,都会转发至服务器本地的8080端口:即“xxx.xxx.xxx.xxx:8080”。 也可以配置根据请求后缀分发: <syntaxhighlight lang="bash" highlight=""> location /hi/ { proxy_pass http://127.0.0.1:8080; ## 需要代理的服务器地址 index index.html; } location /hello/ { proxy_pass http://127.0.0.1:8081; ## 需要代理的服务器地址 index index.html; } </syntaxhighlight> 如上:类似“xxx.xxx.xxx.xxx::8888/hi/hi.html”、“xxx.xxx.xxx.xxx::8888/hello/hello.html”的请求会被分别转发至“xxx.xxx.xxx.xxx::8080/hello/hello.html”、“xxx.xxx.xxx.xxx::8081/hello/hello.html”; === Https 反向代理 === 一些对安全性要求比较高的站点,可能会使用 HTTPS(一种使用 ssl 通信标准的安全 HTTP 协议): * HTTPS 的固定端口号是 '''443''',不同于 HTTP 的 80 端口; * SSL 标准需要引入安全证书,所以在 nginx.conf 中你需要指定证书和它对应的 key; 其他和 http 反向代理基本一样,只是在 Server 部分配置有些不同: <syntaxhighlight lang="bash" highlight=""> server { listen 443 ssl; ## 设置 nginx 监听端口为 443(用于HTTPS协议) server_name www.eijux.com; ## 服务器的地址(ip 或 域名) # ssl 证书配置 ssl_certificate cert.pem; ## ssl证书文件位置(常见证书文件格式为:crt/pem) ssl_certificate_key cert.key; ## ssl证书key位置 # ssl 配置参数(选择性配置) ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; # 数字签名,此处使用MD5 ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root /root; index index.html index.htm; } } </syntaxhighlight> == 负载均衡 == <syntaxhighlight lang="bash" highlight=""> 负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。 </syntaxhighlight> 负载均衡是在反向代理的基础上实现的。 <syntaxhighlight lang="bash" highlight=""> http { ### 此处省略一大堆没有改的配置 ## 自定义的服务列表 upstream load_balance_server{ server 192.168.1.11:80; server 192.168.1.12:80; server 192.168.1.13:80; } server { listen 8888 ; ## 设置 nginx 监听端口为 8888 server_name www.eijux.com; ## 服务器的地址 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass http://load_balance_server; ## 请求转向 load_balance_server 定义的服务器列表 proxy_connect_timeout 10; ## 超时时间(秒) } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } } </syntaxhighlight> 如上,对于“www.eijux.com”的请求会被均衡地转发到“load_balance_server”定义的三个服务器中; === 负载均衡策略 === Nginx 提供了多种负载均衡策略。 * 负载均衡策略在各种分布式系统中基本上原理一致; 常用的三种均衡策略: # '''轮询'''(默认方式):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。 #: <syntaxhighlight lang="bash" highlight=""> upstream bck_testing_01 { # 默认所有服务器权重为 1 server 192.168.250.220:8080 server 192.168.250.221:8080 server 192.168.250.222:8080 } </syntaxhighlight> # '''权重'''(weight):weight 代表权重(默认为 1),权重越高被分配的客户端越多,权重越大,能力越大,责任越大,处理的请求就越多。 #: <syntaxhighlight lang="bash" highlight=""> upstream bck_testing_01 { server 192.168.250.220:8080 weight=3 server 192.168.250.221:8080 # default weight=1 server 192.168.250.222:8080 # default weight=1 } </syntaxhighlight> # '''ip_hash''':每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,'''可以解决 session 的问题'''。 #: <syntaxhighlight lang="bash" highlight=""> upstream bck_testing_01 { ip_hash; ## 可与weight配合使用 # with default weight for all (weight=1) server 192.168.250.220:8080 server 192.168.250.221:8080 server 192.168.250.222:8080 } </syntaxhighlight> 其他的均衡策略: # '''fair'''(第三方):按后端响应时间进行分配,响应时间越短分配的请求越多。 #: <syntaxhighlight lang="bash" highlight=""> upstream myserver{ server 127.0.0.1:8080; server 127.0.0.1:8081; fair; } </syntaxhighlight> # 普通 Hash: #: <syntaxhighlight lang="bash" highlight=""> upstream bck_testing_01 { hash $request_uri; # with default weight for all (weight=1) server 192.168.250.220:8080 server 192.168.250.221:8080 server 192.168.250.222:8080 } </syntaxhighlight> # 最少连接: #: <syntaxhighlight lang="bash" highlight=""> upstream bck_testing_01 { least_conn; # with default weight for all (weight=1) server 192.168.250.220:8080 server 192.168.250.221:8080 server 192.168.250.222:8080 } </syntaxhighlight> # 加权最少连接: #: <syntaxhighlight lang="bash" highlight=""> upstream bck_testing_01 { least_conn; server 192.168.250.220:8080 weight=3 server 192.168.250.221:8080 # default weight=1 server 192.168.250.222:8080 # default weight=1 } </syntaxhighlight> === 多 webapp 网站的配置 === 当一个网站功能越来越丰富时,往往需要将一些功能相对独立的模块剥离出来,独立维护。这样的话,通常,会有多个 webapp。 示例:假如 www.helloworld.com 站点有好几个 webapp:finance(金融)、product(产品)、admin(用户中心)。访问这些应用的方式通过上下文(context)来进行区分: : www.helloworld.com/finance/ : www.helloworld.com/product/ : www.helloworld.com/admin/ 如果在一台服务器上同时启动这 3 个 webapp 应用,则需要分别绑定不同的端口号, 而用户在实际访问 www.helloworld.com 站点时并不会带有端口号,那么此处就需要使用类似于负载均衡的方式来配置反向代理: <syntaxhighlight lang="bash" highlight=""> http { #此处省略一些基本配置 upstream product_server{ server www.helloworld.com:8081; } upstream admin_server{ server www.helloworld.com:8082; } upstream finance_server{ server www.helloworld.com:8083; } server { # 此处省略一些基本配置 # 默认指向 product 的 server location / { proxy_pass http://product_server; } location /product/{ proxy_pass http://product_server; } location /admin/ { proxy_pass http://admin_server; } location /finance/ { proxy_pass http://finance_server; } } } </syntaxhighlight> == 动静分离 == <pre> 动静分离就是把很少会发生修改的诸如图像,视频,css样式等静态资源文件放置在单独的服务器上,而动态请求则由另外一台服务器上进行。 这样一来,负责动态请求的服务器则可以专注在动态请求的处理上,从而提高了我们程序的运行效率,与此同时,我们也可以针对我们的静态资源服务器做专属的优化,增加我们静态请求的响应速度。 </pre> 示例:准备两个文件夹:“data”用来存放 js,css 这些静态资源文件;“html”用来存放 html 文件。 <syntaxhighlight lang="bash" highlight=""> server { listen 8886; server_name [服务器ip地址]; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { root /html/; index index.html; } # 拦截静态资源,static 里面存放的我们图片什么的静态资源 location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|js|css)$ { root /data/; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } </syntaxhighlight> == 其他 == === 搭建文件服务器 === 有时候,团队需要归档一些数据或资料,那么文件服务器必不可少。使用 Nginx 可以非常快速便捷的搭建一个简易的文件服务。 Nginx 中的配置要点: * '''autoindex''' 开启可以显示目录,默认不开启。 * '''autoindex_exact_size''' 开启可以显示文件的大小。 * '''autoindex_localtime''' 开启可以显示文件的修改时间。 * '''root''' 用来设置开放为文件服务的根路径。 * '''charset''' 设置为“charset utf-8,gbk;”,可以避免中文乱码问题(windows 服务器下依然乱码)。 最简化的配置如下: <syntaxhighlight lang="bash" highlight=""> autoindex on;# 显示目录 autoindex_exact_size on;# 显示文件大小 autoindex_localtime on;# 显示文件时间 server { charset utf-8,gbk; listen 9050 default_server; listen [::]:9050 default_server; server_name _; root /share/fs; } </syntaxhighlight> === 解决跨域 === web 领域开发中,经常采用前后端分离模式。这种模式下,前端和后端分别是独立的 web 应用程序,各自独立的 web app 在互相访问时,势必存在跨域问题。 : 例如:后端是 Java 程序,前端是 React 或 Vue 应用。 解决跨域问题一般有两种思路: # '''CORS''':在后端服务器设置 HTTP 响应头,把你需要允许访问的域名加入 '''Access-Control-Allow-Origin''' 中。 # '''jsonp''':把后端根据请求,构造 '''json''' 数据,并返回,前端用 '''jsonp''' 跨域。 nginx 根据第一种思路,也提供了一种解决跨域的解决方案。 示例:www.helloworld.com 网站是由一个前端 app ,一个后端 app 组成的。前端端口号为 9000,后端端口号为 8080。 : 前端和后端如果使用 http 进行交互时,请求会被拒绝,因为存在跨域问题。 Nginx 配置步骤: # 首先,在 '''enable-cors.conf''' 文件中设置 '''cors''' : #: <syntaxhighlight lang="bash" highlight=""> # allow origin list set $ACAO '*'; # set single origin if ($http_origin ~* (www.helloworld.com)$) { set $ACAO $http_origin; } if ($cors = "trueget") { add_header 'Access-Control-Allow-Origin' "$http_origin"; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; } if ($request_method = 'OPTIONS') { set $cors "${cors}options"; } if ($request_method = 'GET') { set $cors "${cors}get"; } if ($request_method = 'POST') { set $cors "${cors}post"; } </syntaxhighlight> # 接下来,在你的服务器中 “include enable-cors.conf” 来引入跨域配置: #: (以下为项目的 nginx 配置片段。) #: <syntaxhighlight lang="bash" highlight="21,23"> # ---------------------------------------------------- # 此文件为项目 nginx 配置片段 # 可以直接在 nginx config 中 include(推荐) # 或者 copy 到现有 nginx 中,自行配置 # www.helloworld.com 域名需配合 dns hosts 进行配置 # 其中,api 开启了 cors,需配合本目录下另一份配置文件 # ---------------------------------------------------- upstream front_server{ server www.helloworld.com:9000; } upstream api_server{ server www.helloworld.com:8080; } server { listen 80; server_name www.helloworld.com; location ~ ^/api/ { include enable-cors.conf; proxy_pass http://api_server; rewrite "^/api/(.*)$" /$1 break; } location ~ ^/ { proxy_pass http://front_server; } } </syntaxhighlight> == 配置文件内容说明 == 反向代理: <syntaxhighlight lang="bash" highlight=""> #运行用户 #user somebody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志 error_log D:/Tools/nginx-1.10.1/logs/error.log; error_log D:/Tools/nginx-1.10.1/logs/notice.log notice; error_log D:/Tools/nginx-1.10.1/logs/info.log info; #PID文件,记录当前启动的nginx的进程ID pid D:/Tools/nginx-1.10.1/logs/nginx.pid; #工作模式及连接数上限 events { worker_connections 1024; #单个后台worker process进程的最大并发链接数 } #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { #设定mime类型(邮件支持类型),类型由mime.types文件定义 include D:/Tools/nginx-1.10.1/conf/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 D:/Tools/nginx-1.10.1/logs/access.log main; rewrite_log on; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件 #对于普通应用,必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime. sendfile on; #tcp_nopush on; #连接超时时间 keepalive_timeout 120; tcp_nodelay on; #gzip压缩开关 #gzip on; #gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript image/jpeg image/gif image/png; #gzip_vary on; #设定实际的服务器列表 upstream zp_server1{ server 127.0.0.1:8089; } #HTTP服务器 server { #监听80端口,80端口是知名端口号,用于HTTP协议 listen 80; #定义使用www.xx.com访问 server_name www.helloworld.com; #首页 index index.html #指向webapp的目录 root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp; #编码格式 charset utf-8; #代理配置参数 proxy_connect_timeout 180; proxy_send_timeout 180; proxy_read_timeout 180; proxy_set_header Host $host; proxy_set_header X-Forwarder-For $remote_addr; #反向代理的路径(和upstream绑定),location 后面设置映射的路径 location / { proxy_pass http://zp_server1; } #静态文件,nginx自己处理 location ~ ^/(images|javascript|js|css|flash|media|static)/ { root D:\01_Workspace\Project\github\zp\SpringNotes\spring-security\spring-shiro\src\main\webapp\views; #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。 expires 30d; } #设定查看Nginx状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; } #禁止访问 .htxxx 文件 location ~ /\.ht { deny all; } #错误处理页面(可选择性配置) #error_page 404 /404.html; #error_page 500 502 503 504 /50x.html; #location = /50x.html { # root html; #} } } </syntaxhighlight> 负载均衡: <syntaxhighlight lang="bash" highlight=""> http { #设定mime类型,类型由mime.type文件定义 include /etc/nginx/mime.types; default_type application/octet-stream; #设定日志格式 access_log /var/log/nginx/access.log; #设定负载均衡的服务器列表 upstream load_balance_server { #weigth参数表示权值,权值越高被分配到的几率越大 server 192.168.1.11:80 weight=5; server 192.168.1.12:80 weight=1; server 192.168.1.13:80 weight=6; } #HTTP服务器 server { #侦听80端口 listen 80; #定义使用www.xx.com访问 server_name www.helloworld.com; #对所有请求进行负载均衡请求 location / { root /root; #定义服务器的默认网站根目录位置 index index.html index.htm; #定义首页索引文件的名称 proxy_pass http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表 #以下是一些反向代理的配置(可选择性配置) #proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 } } } </syntaxhighlight>
返回至“
Nginx:配置文件
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息