Articles of nginx

对Nginx没有Gzip支持

我需要在某些情况下禁用gzip,而不pipe客户端的Accept-*请求头。 我的Nginx的conf入口有以下指令: gzip off; more_clear_input_headers -t 'text/html' Accept Accept-Encoding; proxy_set_header Accept ""; proxy_set_header Accept-Encoding ""; 但是,下面的curl: curl '$URL' -H 'Pragma: no-cache' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: en-US,en;q=0.8,he;q=0.6' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: no-cache' -H 'Cookie: […]

如果满足条件,更改proxy_pass?

我想在大多数情况下使用上游,而其他人则希望允许基于X-Target-Server请求标头指定目标服务器。 我有一个服务器,查找请求variables,并将其映射为我的nginx.conf的一部分。 然后,我有一个虚拟服务器conf,执行以下操作: proxy_pass https://backend_dev_test; if ($is_target_specified) { proxy_pass https://$http_x_target_server; } 当指定proxy_pass指令时会发生什么? 它会立即运行吗? 这会导致它运行两次? 或者只有在条件满足的情况下,才会针对第二个呢? 它似乎在一些位置块,但不是其他人,我不明白为什么。 有没有更好的方法来解决这个问题? 下面的全部位置 似乎工作 location ~* /v3/(test|other)/ { proxy_cache_bypass "1"; proxy_no_cache "1"; resolver 8.8.8.8; proxy_ignore_client_abort on; rewrite ^/v3/(.*)$ /$1 break; proxy_pass https://backend_dev_test; if ($is_target_specified) { proxy_pass https://$http_x_target_server; } } 似乎不工作 location ~* /v3 { proxy_cache_bypass "1"; proxy_no_cache "1"; resolver 8.8.8.8; […]

使用nginx进行Web应用程序路由

我尝试使用nginx服务webapp,并且一切正常,而我请求的根URL,如http://xxx.xxx.xxx.xxx:8002/ (我没有一个域名,所以IP地址和端口是用过的) 该应用程序有它自己的内部路由,我希望能够从浏览器的地址栏,如http://xxx.xxx.xxx.xxx:8002/profile使用它。 我得到404,因为nginx查找根文件夹中的目录,我猜。 我改变了我的configuration看起来像这样: server { listen 8002 default_server; server_name _; root /home/ubuntu/sites/mysite-frontend; location ~ /.* { rewrite "/.*" / last; } } 现在我得到状态代码500,日志显示如下: 2016/09/08 08:36:27 [error] 29869#0:* 3在处理“/”时重写或内部redirect周期,client:yyy.yyy.yyy.yyy,server:_,request:“GET / profile HTTP / 1.1“,主机:”xxx.xxx.xxx.xxx:8002“ 我应该如何改变我的configuration,使其工作?

Nginx负载均衡https

当通过nginx作为负载平衡器提供https服务时,我遇到了问题。 我有以下configuration: server { listen 443 ssl; listen [::]:443 ssl; server_name sub.domain.com; root /usr/share/nginx/html; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ssl_certificate /etc/ssl/[cert].crt; ssl_certificate_key /etc/ssl/private/wildcard.[cert].com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers '[…]' ssl_prefer_server_ciphers on; ssl_dhparam /etc/pki/tls/certs/dhparams.pem; location /application { proxy_pass http://server0; } location / { return 301 http://www.domain.com; } } 我正在服务一个运行在“server0”上的tomcat的站点。 […]

当上游服务器不能被parsing并且仍然有proxy_pass URI / URI重写规则时启动nginx?

这个nginxconfiguration适用于我: location /foo/ { proxy_pass http://a.bar.mesos/; } 请注意, locationselect器和proxy_pass值都是URI。 所以你知道,这影响了上游服务器URL的重写。 例如, http://…/foo/bar被重写为http://a.bar.mesos/bar 。 如果proxy_pass值是http://a.bar.mesos而没有结尾的斜杠,那么URL将被重写为http://a.bar.mesos/foo/bar ,这对我来说是不正确的。 也许你也知道,如果a.bar.mesos在nginx开始时间不能parsing,那么nginx将不会启动。 在这个网站的其他问题中提到了一个resolver ,它是使用一个resolver指令和一个像这样的variables: location /foo/ { resolver 127.0.0.1; set $a_bar_mesos a.bar.mesos; proxy_pass http://$a_bar_mesos/; } 事实上,这解决了nginx不是以一个无法parsing的主机名开头的问题,但也使得nginx不再认识到proxy_pass值有一个URI,所以URL重写对我来说是不正确的。 也就是说,它使用与http://a.bar.mesos的proxy_pass值相关的重写规则而不是http://a.bar.mesos/ 。 我的问题是,有谁知道如何启动nginx与无法parsing的主机名,并获得URI / URI的URL重写规则? 所以你知道我的用例,我使用Mesos来启动程序到一个机器集群上。 这些程序有着众所周知的名字,比如a.bar 。 然后,我使用mesos-dns将程序名称a.bar与主机名a.bar.mesos和Mesos分配给它的机器的IP地址相关联。 当程序没有运行时, mesos-dns从registry中删除名称a.bar.mesos 。 我使用nginx通过上述configuration将HTTP请求转发给程序。 当我重新启动托pipenginx的服务器时,并不能保证所有被代理的程序都能正常运行。

优化Apache服务作为Nginx的后端

Apache(2.4.x)是一个众所周知的服务器,性能优化已经被广泛讨论和logging。 不过,对于Apache反向代理(Nginx或其他任何其他软件背后)的情况,我想知道什么最适合Apache,只要涉及到性能。 考虑到这个非常简单的Nginxconfiguration: server { keepalive_timeout 300s; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://localhost:8080; proxy_pass_header Content-type; } } 没有给出实际值(与硬件,交通和应用types紧密相关),与通常用于前端服务器的逻辑相比,逻辑应该在某些方面有所不同? 例如,当我们正在谈论服务器到服务器(硬件)时(甚至两台服务器(软件)通常在本地主机上进行通信), keepalive是一个很好的做法? 如果是的话,是否有一个基准开始? Apache将所有的Nginx请求视为同一个客户端还是X-Real-IPX-Real-IP或X-Forwarded-For将会使Apache考虑来自不同客户端的请求? 我猜就Apache而言,客户端是IP_SRC:Port 。 我的意思是,如果所有通过Nginx代理的请求被认为是一个客户端,那么Apache将如何尊重MaxConnectionsPerChild ? Apache与mod_prefork将如何分叉(或不)工人? 在这个MOD中,客户和工人是1:1的关系。 而且,由于工人一次不能处理多个客户,请求将会排队,直到有免费的工作人员可用? 有什么最好的做法应该注意这种设置? 有没有一种模式可以比另一种更好? 还是应该避免一个国防部?

NGINX http转发

我是nginx的新手,因为某些原因在nginx上设置转发失败。 我已经看了几个指南,我的设置看起来很好,从我读过的。 我想要做的是将诸如www.example.com之类的请求转发到其他url,例如http://example2.com/get/to/information 。 我没有做任何端口转发,所以一切都将使用端口80。 这是我目前的configuration: 服务器{ 听80; server_name www.example.com; 位置 / { proxy_pass http://example2.com/access/this/information } } 附加信息 – 它不会将信息转发到另一个nginx服务器。 我只是希望它转发到端口80上的另一台服务器上的URL。到目前为止,我试图做的是去www.example.com(这是一个Alogging,指向Nginx服务器的IP地址)但它仍然只是送我到nginx主页 任何帮助,将不胜感激!

nginx不在条件GET上从原始服务器返回更新的头文件

除了一个小问题,我还有nginx和它的caching工作。 当第一次发出请求时,它会触发原始服务器,返回一个200和nginxcaching的响应。 如果我提出另一个请求,我可以从X-Cache-Status头看到caching已经被命中。 当我等待一段时间知道caching将过期时,我可以看到nginx命中我的原始服务器做一个条件的GET,因为我有proxy_cache_revalidate on; 定义。 当我检查源服务器上的应用程序中的资源是否发生变化时,我发现它没有,并返回一个带有新的Expires标题的304。 有些人可能会说,如果原始服务器没有任何变化,并且你返回304,你为什么要返回一个新的Expires头文件。答案是HTTP RFC说可以这样做https://tools.ietf.org/html/ rfc7234#部分-4.3.4 有一件事我注意到了,无论我添加或修改什么标题,当源服务器返回304时,nginx都会给出一个响应,并为它提供第一组响应头。 另外,如果我从第一个请求更改Cache-Control:max-age标头值,当我返回304响应时,它似乎nginx服从新值,因为我的资源被caching的那个时候,但响应头值是给定的在第一个请求不是我修改的304响应的价值。 我正在运行nginx version: nginx/1.10.1

避免双重redirectNGINX

我正在使用301redirect到Nginx,将我的网站用户redirect到网站的HTTPS版本。 我使用Google的PageSpeedtesting了我的网站,发现我是从主页面redirect的。 这是因为我的CMS。 例: http:// domain.tld – > NGINX 301 – > https:// domain.tld – > CMSredirect – > https:// domain.tld / homepage 我希望能用NGINXredirect直接根连接 location = / { return 301 https:// domain.tld/homepage; } 这适用于主页,但是,这将给404任何其他http页面的错误比主页,我试图添加return 301 https://$host$request_uri; 在位置块,但不知何故这覆盖了根域的规则。 (这再次提供了一个双redirect)有没有办法redirect所有链接与他们相应的request_uri,除了根域? PS我希望没有iffunction做到这一点:请参阅: https : //www.nginx.com/resources/wiki/start/topics/depth/ifisevil/ 这里是我的完整configuration文件的示例: server { listen 80; server_name domainname.tld; location = / { return 301 […]

将值设为ulimit

我从我所了解的worker_connections值中设置nginx的值不得超过由ulimit -n重新创build的打开的文件描述符的最大数目。 在我刚刚安装的16.04 ubuntu上, ulimit -n返回1024 ,与cat /proc/sys/fs/file-max – > 3269456相比非常低。 1)这两个值是相关的吗? 2)如果是,我应该将得到的值分为cat /proc/sys/fs/file-max以确保安全的ulimit和worker_connections值?