我正在使用 nginx 和 NginxHttpUpstreamModule 进行负载平衡。我的配置很简单:
upstream lb {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 89;
server_name localhost;
location / {
proxy_pass http://lb;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Run Code Online (Sandbox Code Playgroud)
但是使用此配置,当 2 个后端服务器之一关闭时,nginx 仍将请求路由到它,并且导致一半时间超时:(
是否有任何解决方案可以让 nginx 在检测到关闭的服务器时自动将请求路由到另一台服务器。
谢谢你。
我最近一直在研究 Apache 和 Nginx 之间的差异,并且对我应该选择哪个感到困惑。
我做了一些搜索,但两者之间没有明确的比较,我想知道这里是否有人可以就两者之间的差异发表意见。
我目前的知识让我明白 mod_php 比 fastcgi 更快、更安全,但是 Apache 在同时连接和内存消耗方面要差得多。
我的网站使用了大量的长轮询,但有一个非 AJAX 网络基础(即 Apache 的顶部有长轮询)。
我对 Apache 内存问题的原始解决方案是通过 node.js 发送长轮询,然后让 node.js 每 2 秒访问一次 Apache,在这种情况下,Apache 不会有一个开放的连接,而是 node.js 会。我已经意识到这可能还不够好,正在寻找不同的解决方案。我仍然对我最初的想法是否可行很感兴趣。
那么哪个更适合现代网络?Apache 还是 Nginx?
更新:给出的所有建议都是好的和有效的。我已经采用了最初的第二个想法,即使用完整的 Nginx 服务器。我很满意作为专用服务器,我不会受到 fastcgi 的安全问题的困扰,并且由于我的长轮询脚本需要用 PHP 编写,我需要一个可以处理高负载同时连接的服务器,而 Apache 无论如何都无法做到这一点我改变了结构,它仍然会占用大量内存。
我已经标记了 Martin F 的答案,因为他对我的问题给出了如此清晰和完整的答案,我觉得他应该得到这个分数,但是,所有三个答案都很好且有效,并且肯定会考虑为我拥有的另一个网站使用反向代理因为我刚刚发现了 Nginx 可以在代理中做的非常非常酷的事情。
谢谢,
我之所以要这样做,是因为用户使用 JavaScript 针对我们的 API 进行开发,并且一些开发人员搞砸了并导致访问者使用 AJAX 请求猛烈抨击服务器。发生这种情况时,我希望能够将 API 请求限制为每分钟 50 个请求,或者类似的效果。
注意:(特别是数据库密集型资源,所以可能在路径级别,而不是服务器范围内(例如,节流“/json_api/”,但不是“/static/”)。
HAProxy 和 Nginx 在作为反向代理的能力方面有什么区别?
我正在为内部 API 构建代理,以允许客户端连接而无需安装自签名证书。
客户端(构建、拥有和仅在内部使用)将通过 SSL 连接到 nginx 框,在那里我使用XSendfile在应用程序级别(一个 Rails 应用程序)验证凭据。如果凭据有效,则连接将传递回 nginx,在那里它使用 proxy_pass 将连接发送到上游服务器。
现在这适用于标准的 http 连接,但我正在尝试弄清楚如何将我们的证书添加到混合中。
这个问题几乎是相同的这一个,但尴尬的证书要求。
这甚至可能与 nginx 一起使用吗?有更好的解决方案吗?
我也满足于从客户端的 http -> nginx,以及从 nginx 到 API 的自签名证书。
我们有一个运行 nginx 和 PHP-FPM 的负载相当大的服务器。我们在这台服务器上有 6 个网站,运行 PHP-FPM 和 nginx。软件都是 vBulletin 3.8 和 WordPress。数据库位于单独的服务器上。
现在,因为这些是非常受欢迎的网站,我们通常一次有 7-8,000 名访问者在线,每个页面大部分都会访问数据库。我相信这是我们问题的根源。
因为我们在 MySQL 服务器上有这么多大型数据库,而且因为查询可以,老实说,在软件中会好很多,我认为 MySQL 有时会无法及时将结果返回给 PHP,从而产生级联效应,最终导致一切停止,直到我们重新加载 PHP-FPM。在我们这样做之后,一切又开始正常了。
我在解决此问题时遇到问题的原因是我无法从日志中真正辨别出任何内容。在 MySQL 慢查询日志中,当停机发生时,我看不到任何有趣的内容。在 nginx 日志中,我看到数以千计的条目说读取请求超时或连接超时(到 PHP-FPM)。在 PHP-FPM 日志中,我看到很多行说“执行超时(31 秒),终止
所以在这一点上我完全不知道去哪里寻找问题。显然,无论发生什么事,都是因为这些脚本有时执行得不够快(通常它们会在一秒钟内加载,但会发生一些事情导致加载时间猛增)。这种情况一天发生很多次,对我们来说已经成为一个相当大的问题。
现在我只有一个 crontab 来每 10 分钟为 php5-fpm 重新加载提供服务,它可以解决崩溃问题。当然,当PHP重新加载时,nginx会抛出502网关错误,所以也不是很好的解决方案。
PHP 正在运行 APC 缓存,如果这很重要的话。我在一些地方读到 APC 在某些情况下会导致挂起。
任何指针都会有所帮助。我真的不想一直担心这台机器。
当然可以提供更多信息。只要让我知道你需要什么。
更新:我只是将 apc.php 复制到一个网络根目录并访问它以查看我们的统计信息。事情看起来不错。然后我单击链接转到用户统计数据,然后 BOOM 服务器立即挂起。我重新加载了 php-fpm,然后重新加载了用户统计页面,它运行良好。等了一分钟,再次重新加载,服务器再次挂起。
所以这肯定似乎与 APC 相关。问题是 - 我们如何解决它?
APC 配置:
[apc]
apc.enabled="1"
apc.stat = "1"
apc.max_file_size = "2M"
apc.localcache = "1"
apc.localcache.size = "256"
apc.shm_segments = "1" …Run Code Online (Sandbox Code Playgroud) 尝试将https://example.com重定向到https://www.example.com时出错。
当我转到https://example.com 时,它不会重定向并返回 page/200 状态。
我不想要这个,我想让它重定向到https://www.example.com。
当我去http://example.com 时,它重定向到https://www.example.com
有人能告诉我我哪里出错了吗?
这是我的默认和默认 ssl 配置文件:
默认配置文件
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
Run Code Online (Sandbox Code Playgroud)
默认 ssl.conf
upstream app_server_ssl {
server unix:/tmp/unicorn.sock fail_timeout=0;
}
server {
server_name example.com;
return 301 https://www.example.com$request_uri
}
server {
server_name www.example.com;
listen 443;
root /home/app/myproject/current/public;
index index.html index.htm;
error_log /srv/www/example.com/logs/error.log info;
access_log /srv/www/example.com/logs/access.log combined;
ssl on;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /srv/www/example.com/keys/ssl.crt;
ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
ssl_ciphers …Run Code Online (Sandbox Code Playgroud) 我的 nginx 默认配置文件变得很大。我想将它拆分为较小的配置文件,每个文件只包含一个,每个文件最多 4 个位置,以便我可以快速启用/禁用它们。
实际文件如下所示:
server {
listen 80 default_server;
root /var/www/
location /1 {
config info...;
}
location /2 {
config info....;
}
location /abc {
proxy_pass...;
}
location /xyz {
fastcgi_pass....;
}
location /5678ab {
config info...;
}
location /admin {
config info....;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想将其拆分为每个文件中只有几个位置(属于一起的位置),那么在不引起混乱的情况下执行此操作的正确方法是什么(例如在每个文件中声明根,因此有奇怪的路径是 nginx尝试查找文件)?
我见过人们使用过多的引号:
add_header 'Access-Control-Allow-Origin' '*';
Run Code Online (Sandbox Code Playgroud)
我见过人们不使用引号:
add_header Access-Control-Allow-Origin *;
Run Code Online (Sandbox Code Playgroud)
据我所知,两者都可以正常工作,所以你什么时候真正需要使用引号?
我正在尝试使用运行 nginx 的 Ubuntu 机器建立一个网站。出于某种原因,我可以在 Safari 和 Firefox 中通过域名访问该站点,但在 Chrome 中它无法访问服务器。但是,我可以使用 curl、Postman 等,并且可以根据需要返回 index.html。
我发现在 Chrome 中,我可以使用 IP 地址访问该站点,但我完全不知道接下来要检查的位置。
这是我的配置文件:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
Run Code Online (Sandbox Code Playgroud)
我更改了响应代码只是为了确保这是我实际使用的配置。
任何帮助,将不胜感激!
编辑:域是 gwilliam.dev