Nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD协议下发行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及 Microsoft Windows等操作系统中运行。
Nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler(俄文:PaM6nep)使用。其特点是占有内存少,并发能力强(用于解决C10K问题),事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。

Nginx做为一个强大的Web服务器软件,具有高性能、高并发性和低内存占用的特点。此外,其也能够提供强大的反向代理功能。俄罗斯大约有超过20%的虚拟主机采用Nginx作为反向代理服务器,在国内也有腾讯、新浪、网易等多家网站在使用Nginx作为反向代理服务器。据Netcraft统计,世界上最繁忙的网站中有11.48%使用Nginx作为其服务器或者代理服务器。
- 高并发连接
- 内存消耗少
- 配置文件非常简单
- 成本低廉
- 支持Rewrite重写规则
- 内置的健康检查功能
- 节省带宽
- 稳定性高


即正向代理服务器是将请求转发向外,而反向代理则是将请求转发向内,此时反向代理中具体的web服务器是不能使用外网IP进行访问的。
- 保证内网的安全,可以使用反向代理提供WAF功能,组织web攻击。大型网站,通常将反向代理作为公网访问地址,Web服务器则是内网的。
- 负载均衡,通过反向代理服务器来优化网站的负载。

负载均衡,单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机和某台服务器闲置的情况。那么负载均衡的前提就是要2台以上服务器才能实现。
Nginx 负载均衡有4种方案配置
轮询
轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器上。
最少连接 least_conn;
Web请求会被转发到连接数最少的服务器上。
IP地址哈希 ip_hash;
前述的两种负载均衡方案中,同一客户端连续的Web请求可能会被分发到不同的后端服务器进行处理,因此如果涉及到会话Session,那么会话会比较复杂。常见的是基于数据库的会话持久化。要克服上面的难题,可以使用基于IP地址哈希的负载均衡方案。这样的话,同一客户端连续的Web请求都会被分发到同一服务器进行处理。
基于权重weight
基于权重的负载均衡即Weighted Load Balancing,这种方式下,我们可以配置Nginx把请求更多地分发到高配置的后端服务器上,把相对较少的请求分发到低配服务器。
- 缺省配置就是轮询策略
- nginx负载均衡支持http和https协议,只需要修改proxy_pass后协议即可
- nginx支持FastCGl, uwsgi, sCGl,memcached的负载均衡,只需将proxy_pass改为fastcgi_pass,uwsgi_pass,scgi_pass,memcached_pass即可。
- 此策略适合服务器配置相当,无状态且短平快的服务使用。
user www-data;
worker_processes auto; #表示服务器有几个内核就起几个work
pid /run/nginx.pid; #进程编号
events {
use epoll; #指定多路复用的形式
worker_connections 65535;
}
http {
upstream test.lazyfennec.cn {
server 127.0.0.1:8081; # 第一台服务器
server 127.0.0.1:8082; # 第二台服务器
server 127.0.0.1:8083; # 第三台服务器
}
server {
listen 80; # 监听80端口
server_name test.lazyfennec.cn; # 自己的域名或者IP
location / {
proxy_pass http://test.lazyfennec.cn;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
- ip哈希负载均衡使用ip_hash指令定义;
- nginx使用请求客户端的ip地址进行哈希计算,确保使用同一个服务器响应请求;
- 此策略适合有状态的服务,比如session;
user www-data;
worker_processes auto; #表示服务器有几个内核就起几个work
pid /run/nginx.pid; #进程编号
events {
use epoll; #指定多路复用的形式
worker_connections 65535;
}
http {
upstream test.lazyfennec.cn {
ip_hash; # 表示使用ip_hash的负载均衡
server 127.0.0.1:8081; # 第一台服务器
server 127.0.0.1:8082; # 第二台服务器
server 127.0.0.1:8083; # 第三台服务器
}
server {
listen 80; # 监听80端口
server_name test.lazyfennec.cn; # 自己的域名或者IP
location / {
proxy_pass http://test.lazyfennec.cn;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
- 最少链接负载均衡通过least_conn指令定义;
- 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况;
user www-data;
worker_processes auto; #表示服务器有几个内核就起几个work
pid /run/nginx.pid; #进程编号
events {
use epoll; #指定多路复用的形式
worker_connections 65535;
}
http {
upstream test.lazyfennec.cn {
least_conn; # 表示使用least_conn的负载均衡
server 127.0.0.1:8081; # 第一台服务器
server 127.0.0.1:8082; # 第二台服务器
server 127.0.0.1:8083; # 第三台服务器
}
server {
listen 80; # 监听80端口
server_name test.lazyfennec.cn; # 自己的域名或者IP
location / {
proxy_pass http://test.lazyfennec.cn;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
- 权重负载均衡需要使用weight指令定义;
- 权重越高分配到需要处理的请求越多;
- 此策略可以与最少链接负载和ip哈希策略结合使用;
- 此策略比较适合服务器的硬件配置差别比较大的情况;
user www-data;
worker_processes auto; #表示服务器有几个内核就起几个work
pid /run/nginx.pid; #进程编号
events {
use epoll; #指定多路复用的形式
worker_connections 65535;
}
http {
upstream test.lazyfennec.cn {
least_conn; # 表示使用least_conn的负载均衡
server 127.0.0.1:8081 weight=3; # 第一台服务器,权重为3
server 127.0.0.1:8082 weight=2; # 第二台服务器,权重为2
server 127.0.0.1:8083 weight=1; # 第三台服务器,权重为1
}
server {
listen 80; # 监听80端口
server_name test.lazyfennec.cn; # 自己的域名或者IP
location / {
proxy_pass http://test.lazyfennec.cn;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
const http = require('http')
const hostname = '127.0.0.1'
const port = 8881
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World from 8881\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})
这里只写一个就好了,剩下的两个分别把其中的8881 改成 8882 和 8883 即可
具体node的语法,可以查看网站,不用纠结这个(http://nodejs.cn/learn)
添加下面一行
127.0.0.1 test.lazyfennec.cn
在http下添加以下内容即可
####################### 轮询方式Demo #################################
upstream test.lazyfennec.cn {
server 127.0.0.1:8881; # 第一台服务器
server 127.0.0.1:8882; # 第二台服务器
server 127.0.0.1:8883; # 第三台服务器
}
server {
listen 80;
server_name test.lazyfennec.cn;
location / {
proxy_pass http://test.lazyfennec.cn;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}


可以看见虽然并不是按照顺序8881->8882->8883 访问的,但是的确是按照轮询的方式访问着不同的服务。
如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(
我有带有gemwebsocket-rails0.7的Rails3.2应用程序。在开发机上,一切正常在生产环境中,我使用Nginx/1.6作为代理服务器,Unicorn作为http服务器。Thin用于独立模式(在https://github.com/websocket-rails/websocket-rails/wiki/Standalone-Server-Mode之后)。nginx配置:location/websocket{proxy_passhttp://localhost:3001/websocket;proxy_http_version1.1;proxy_set_headerUp
Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect
我有一个EC2实例正在运行。我有一个负载均衡器,它与EC2实例相关联。PingTarget:HTTP:3001/healthCheckTimeout:5secondsInterval:24secondsUnhealthythreshold:2Healthythreshold:10现在该实例显示为OutofService。我什至尝试更改监听端口等等。一切正常,直到重新启动我的EC2实例。任何帮助将不胜感激。仅供引用:我有一个在端口3001上运行的Rails应用程序,我有一个用于HTTP:80(loadbalancer)到HTTP:3001的监听器。我还在终端中通过ssh检查了正在运行的应
我目前正在运行Foreman在暂存(Ubuntu)上,一旦我开始工作,就会切换到使用upstart。我的Procfile.staging看起来像这样:nginx:sudoservicenginxstartunicorn:bundleexecunicorn-c./config/unicorn.rbredis:bundleexecredis-serversidekiq:bundleexecsidekiq-v-C./config/sidekiq.yml我可以使用以下方法成功启动nginx:$sudoservicenginxstart然而,当我运行$foremanstart时,当其他三个进程成
我对为我的RubyonRails3.1.3应用优化我的Unicorn设置的方法很感兴趣。我目前正在高CPU超大实例上生成14个工作进程,因为我的应用程序在负载测试期间似乎受CPU限制。在模拟负载测试中,每秒大约20个请求重放请求,我的实例上的所有8个内核都达到峰值,盒子负载飙升至7-8个。每个unicorn实例使用大约56-60%的CPU。我很好奇可以通过哪些方式对其进行优化?我希望能够每秒将更多请求汇集到这种大小的实例上。内存和所有其他I/O一样完全正常。在我的测试过程中,CPU越来越低。 最佳答案 如果您受CPU限制,您希望使用
Nginx安装1.官网下载Nginx2.使用XShell和Xftp将压缩包上传到Linux虚拟机中3.解压文件nginx-1.20.2.tar.gz4.配置nginx5.启动nginx6.拓展(修改端口和常用命令)(一)修改nginx端口(二)常用命令1.官网下载Nginxhttp://nginx.org/en/download.html这里我下载的是1.20.2版本,大家按需下载对应稳定版即可2.使用XShell和Xftp将压缩包上传到Linux虚拟机中没有XShell可以参考《Linux操作系统CentOS7连接XShell》3.解压文件nginx-1.20.2.tar.gz1)检查是否存
我正在ubuntu14.04和ruby2.2.4上安装passenger+nginx。passenger-install-nginx-module有bundler错误$passenger-install-nginx-module/home/ubuntu/.rvm/gems/ruby-2.2.4/gems/bundler-1.13.1/lib/bundler/rubygems_ext.rb:45:in`full_gem_path':uninitializedconstantBundler::Plugin::API::Source(NameError)from/home/ubuntu/.r
一、前言最近,在测试环境的nginx里增加了一个https配置:location/api-meeting-qq/{proxy_passhttps://api.meeting.qq.com/;}然后,执行命令://这个是nginx启动文件的路径,根据实际情况自行更改sudo/home/useradmin/nginx/sbin/nginx-sreload结果,nginx就报错了:nginx:[emerg]httpsprotocolrequiresSSLsupportin/home/useradmin/nginx/conf.d/trainNginx.conf:9二、解决方法百度发现,是之前安装ngi