nginx反向代理 nginx.conf配制

Nginx是什么?

由俄罗斯开发的反向代理服务器。Nginx 是Web服务器或反向代理服务器。

优点:

  • 跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本。
  • 配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置
  • 非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数.(这得益于Nginx使用了最新的epoll模型)
  • 事件驱动:通信机制采用epoll模型,支持更大的并发连接。

特点:

  • nginx代理和后端web服务器间无需长连接;
  • 接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送后后端web服务器,极大的减轻后端web服务器的压力
  • 发送响应报文时,是边接收来自后端web服务器的数据,边发送给客户端的
  • 网络依赖型低。NGINX对网络的依赖程度非常低,理论上讲,只要能够ping通就可以实施负载均衡,而且可以有效区分内网和外网流量

5、支持服务器检测。NGINX能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其它节点上

通过一个实例了解nginx

假设有三台服务器,一台是nginx服务器,两台是tomcat服务器(至少两台)

服务器 地址   用途
Nginx 192.168.129.10 反向代理
Tomcat1 192.168.129.11 运行tomcat
Tomcat1 192.168.129.12 运行tomcat

当浏览器发送请求时,是通过nginx来访问tomcat,获得数据后再由nginx传给浏览器显示。浏览器只能获得数据,不能知道是哪一个tomcat把数据传给他的,当然浏览器更是不想知道这些数据的,这样保护了tomcat服务器上的资源安全,这就是反向代理

下图是实际用户通过nginx访问数据,原始资源服务器被防火墙和nginx同时保护:

用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。

实例步骤:

在linux环境下,在两个tomcat1和tomcat2服务器下,启动tomcat

-1.上传tomcat的压缩包,解压到指定目录

tar zxvf apache-tomcat-7.0.68.tar.gz

-2.到解压目录找到批处理文件,开启tomcat

cd apache-tomcat-7.0.68

./bin/startup.sh

-3.可以查看一下日志文件,看是否成功

tailf ./logs/catalina.out

修改nginx.conf

vi /usr/local/nginx/conf/nginx.conf

在http节点下添加upstream(服务器集群),server设置的是集群服务器的信息,我这里搭建了两个站点,配置了两条信息。

#新加服务器集群名称为Jq_one
    upstream localhost_jp{
   server  192.168.129.11:8080; 
   server  192.168.129.12:8080;
    }

#在http节点下找到location节点修改

location / {
            root  /home/ftpuser/www;
            index  index.html index.htm;

#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
     proxy_set_header   Host             $host;
     proxy_set_header   X-Real-IP        $remote_addr;
     proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

#连接超时时间

proxy_connect_timeout 10;

#发送超时时间
     proxy_send_timeout 10;

#接收超时时间
     proxy_read_timeout 10;

#反向代理配置
     proxy_pass http://localhost_jp;
 }

保存之后,你就可以试一下访问192.168.129.10,返回的页面有可能是tomcat1,有可能是tomcat2中的数据

关于nginx选哪一个tomcat服务器,是有五种负载均衡策略的,下面介绍一下:

-1.轮循
默认采用此策略,根据访问的先后的时间,循环的访问代理服务。

-2.Ip_hash
同一ip,始终访问同一代理的服务。

upstream localhost_jp{

   ip_hash;
   server  192.168.129.11:8080; 
   server  192.168.129.12:8080;
   }
 
-3.权重
根据设置权重的值,自动计算百分比。

upstream localhost_jp{
   server  192.168.129.11:8080 weight=800; 
   server  192.168.129.12:8080 weight=200;
   }
 
-4.Fair
根据每个地址响应的时间,分配资源。时间越短,越优先访问。

-5.Url_hash
更具url地址计算hash值,同一url始终从同一服务器获取内容,常用于cdn。

Nginx的内部(进程)模型

nginx是以多进程的方式来工作的,当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式。nginx采用多进程的方式有诸多好处 .

(1) nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控 worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。而基本的网络事件,则是放在worker进程中来处理了 。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的 。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。 worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的 。

(2)Master接收到信号以后怎样进行处理(./nginx -s reload )?首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的进程,并向所有老的进程发送信号,告诉他们可以光荣退休了。新的进程在启动后,就开始接收新的请求,而老的进程在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出 .

(3) worker进程又是如何处理请求的呢?我们前面有提到,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket之后,然后再fork出多个worker进程,这样每个worker进程都可以去accept这个socket(当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)。一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接,其它的则accept失败,这是所谓的惊群现象。当然,nginx也不会视而不见,所以nginx提供了一个accept_mutex这个东西,从名字上,我们可以看这是一个加在accept上的一把共享锁。有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了。accept_mutex是一个可控选项,我们可以显示地关掉,默认是打开的。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

(4):,nginx采用这种进程模型有什么好处呢?采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。当然,好处还有很多,大家可以慢慢体会。

(5).有人可能要问了,nginx采用多worker的方式来处理请求,每个worker里面只有一个主线程,那能够处理的并发数很有限啊,多少个worker就能处理多少个并发,何来高并发呢?非也,这就是nginx的高明之处,nginx采用了异步非阻塞的方式来处理请求,也就是说,nginx是可以同时处理成千上万个请求的 .对于IIS服务器每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求了。这对操作系统来说,是个不小的挑战,线程带来的内存占用非常大,线程的上下文切换带来的cpu开销很大,自然性能就上不去了,而这些开销完全是没有意义的。我们之前说过,推荐设置worker的个数为cpu的核数,在这里就很容易理解了,更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,提供了cpu亲缘性的绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效

Nginx常见配置说明

worker_processes 8;

#nginx进程数,建议设置为等于CPU总核心数

worker_connections 65535;

#单个进程最大连接数(最大连接数=连接数*进程数)

client_header_buffer_size 32k; #上传文件大小限制

large_client_header_buffers 4 64k; #设定请求缓

client_max_body_size 8m; #设定请求缓

autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。

tcp_nopush on; #防止网络阻塞

tcp_nodelay on; #防止网络阻塞

keepalive_timeout 120; #长连接超时时间,单位是秒

gzip on; #开启gzip压缩输出

gzip_min_length 1k; #最小压缩文件大小

gzip_buffers 4 16k; #压缩缓冲区

gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)

gzip_comp_level 2; #压缩等级

upstream blog.ha97.com {

#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。

server 192.168.80.121:80 weight=3;

server 192.168.80.122:80 weight=2;

server 192.168.80.123:80 weight=3;

}

#虚拟主机的配置

server

{

#监听端口

listen 80;

#域名可以有多个,用空格隔开

server_name www.ha97.com ha97.com;

index index.html index.htm index.php;

root /data/www/ha97;

location ~ .*.(php|php5)?$

{

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi.conf;

}

时间: 2024-08-23 04:27:48

nginx反向代理 nginx.conf配制的相关文章

Nginx安装配置|Nginx反向代理|Nginx支持HTTPS|Nginx重定向

Nginx安装配置 可以直接看到最下面的HTTPS. Nginx安装 我的系统如下: No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.3 LTS Release: 16.04 Codename: xenial 安装(如果有apache服务器, 建议卸载了, 或者改Nginx的默认端口): sudo apt-get install nginx 此时已经开启了80端口, 并且配置处在etc/

利用nginx反向代理,后端Web如何获取真实客户ip

利用nginx反向代理,后端Web如何获取真实客户端ip 一.nginx反向代理nginx,后端的nginx该如何配置才能获取到客户端的真实IP地址呢. 1.首先需要在nginx代理服务器上的配置文件nginx.conf上的 location 中添加一行参数: proxy_set_header  X-Real-IP  $remote_addr; 重启nginx服务 2.对后面的nginx进行配置 vim /usr/local/nginx/conf/nginx.conf 加入下面参数: set_r

Nginx反向代理、CORS、JSONP等跨域请求解决方法总结

由于 Javascript 同源策略的存在使得一个源中加载来自其它源中资源的行为受到了限制.即会出现跨域请求禁止. 通俗一点说就是如果存在协议.域名.端口或者子域名不同服务端,或一者为IP地址,一者为域名地址(在跨域问题上,域仅仅是通过“ url的首部 ”来识别而不会去尝试判断相同的IP地址对应着两个域或者两个域是否同属同一个IP),之中任意服务端旗下的客户端发起请求其它服务端资源的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源. 但很多时候我们却又不得不

ASP.NET Core 2.1发布/部署到Ubuntu并配置Nginx反向代理实现ip访问

一.准备 我用的是Ubuntu服务器器 [Ubuntu 18.04 x64] 和终端管理工具[Xshell] 二.安装 在服务器上安装.NET Core 三.部署程序 1.创建实例程序 可以直接使用.NET Core 的命令创建一个ASP.NET Core 示例网站应用程序,创建目录 /home/myuser/firstapp,执行命令: dotnet new mvc 接着,发布刚才创建的ASP.NET Core 网站发网站目录,所以,我们先创建一个网站发布目录:/var/www/firstap

nginx.conf nginx反向代理配置文件

nginx反向代理配置文件 nginx.conf proxy_default.conf vhost/*.conf upstream/*.conf cache/*.conf nginx.conf 配置 user www; worker_processes 2; pid /var/run/nginx.pid; worker_cpu_affinity auto; worker_rlimit_nofile 65535; events { use epoll; worker_connections 655

Nginx反向代理的配置

Chapter: Nginx基本操作释疑 1. Nginx的端口修改问题 2. Nginx 301重定向的配置 3. Windows下配置Nginx使之支持PHP 4. Linux下配置Nginx使之支持PHP 5. 以源码编译的方式安装PHP与php-fpm 6. Nginx多站点配置的一次实践 7. Nginx反向代理的配置 Nginx 作为 web 服务器一个重要的功能就是反向代理.其实我们在前面的一篇文章<Nginx多站点配置的一次实践>里,用的就是 Nginx 的反向代理,这里简单再

nginx反向代理

1. 操作系统 CentOS 6.4 x86_64 2.软件版本 Nginx 1.4.2 3.实验拓扑 注,实验拓扑见下文. 4.安装yum源 1 2 3 [root @nginx ~]# rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm [[email protected] ~]# rpm -ivh http://download.fedoraproject.org/

Nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第三部分

Nginx反向代理.动静分离.负载均衡及rewrite隐藏路径详解 (Nginx Apache MySQL Redis) 楓城浪子原创,转载请标明出处! 更多技术博文请见个人博客:https://fengchenglangzi.000webhostapp.com 微信bh19890922 QQ445718526.490425557 三.Nginx动静分离及负载均衡 3.1 Nginx安装 请参考:https://fengchenglangzi.000webhostapp.com/?p=511 亦

Nginx反向代理,负载均衡,redis session共享,keepalived高可用

相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此处可搭建服务器集群. redis服务器一台,用于session的分离共享. nginx主服务器:192.168.50.133 nginx备服务器:192.168.50.135 tomcat项目服务器1:192.168.50.137 tomcat项目服务器2:192.168.50.139 redis服