Nginx 配置文件、多web站点、应用场景

解决 nginx 部署前端post请求405 not allowed。nginx 静态资源访问不支持post请求

location / {
    root  /usr/local/dist;
    try_files $uri $uri/ /index.html;
    index  index.html index.htm;
    error_page 405 =200 @405;  #405页面处理
}

#加入下面代码
location @405 {
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
     #ip为后端服务地址
     proxy_pass http://192.168.3.129:8081$request_uri;
}

1、Nginx 简介

Nginx 概述

Nginx 是一款轻量级的 HTTP 服务器 ( 或叫 web服务器 ),采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的 反向代理 和 负载均衡。Nginx 是由俄罗斯人 伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点开发的,并于2004年首次公开发布的。

Nginx 特点:

  • 一种轻量级的 web 服务器
  • 基于事件驱动的异步非阻塞处理(类node.js),可以支持数以百万级别的 TCP 连接。
  • 使用C语言开发,占用内存少、启动速度快、并发能力强。
  • 扩展性好,高度的模块化,第三方模块(插件)层出不穷。

web服务器:负责处理和响应用户请求,一般也称为http服务器,如 Apache、IIS、Nginx

应用服务器:存放和运行系统程序的服务器,负责处理程序中的业务逻辑,如 Tomcat、Weblogic、Jboss(现在大多数应用服务器也包含了web服务器的功能)

Nginx 是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。在Nginx网站上,其功能包括:

  • HTTP和HTTPS(TLS / SSL / SNI)
  • 超快速的 Web 服务器用于静态内容
  • FastCGI,WSGI,SCGI用于动态内容
  • 具有负载平衡和缓存功能的加速Web代理
  • 不间断实时二进制升级和配置
  • 压缩和内容过滤器
  • 虚拟主机
  • FLV和MP4的媒体流
  • 带宽和连接策略
  • 全面的访问控制
  • 自定义日志
  • 嵌入式脚本
  • 带有TLS的SMTP / IMAP / POP3的邮件代理
  • 逻辑,灵活,可扩展的配置
  • 跨平台,可以运行在 Linux、Windows、FreeBSD、Solaris、AIX、Mac OS 等操作系统上,在互联网项目中广泛应用。

IO多路复用 epoll(IO复用)

如何理解呢?举个例子吧!

  • 有A、B、C三个老师,他们都遇到一个难题,要帮助一个班级的学生解决课堂作业。
  • 老师A采用从第一排开始一个学生一个学生轮流解答的方式去回答问题,老师A浪费了很多时间,并且有的学生作业还没有完成呢,老师就来了,反反复复效率极慢。
  • 老师B是一个忍者,他发现老师A的方法行不通,于是他使用了影分身术,分身出好几个自己同一时间去帮好几个同学回答问题,最后还没回答完,老师B消耗光了能量累倒了。
  • 老师C比较精明,他告诉学生,谁完成了作业举手,有举手的同学他才去指导问题,他让学生主动发声,分开了“并发”。

这个老师C就是Nginx。

轻量级

功能模块少 - Nginx仅保留了HTTP需要的模块,其他都用插件的方式,后天添加
代码模块化 - 更适合二次开发,如阿里巴巴Tengine

CPU 亲和

把CPU核心和Nginx工作进程绑定,把每个worker进程固定在一个CPU上执行,减少切换CPU的cache miss,从而提高性能。

Nginx 常用命令

nginx            # 启动 Nginx
nginx -s stop    # 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务
nginx -s quit    # 平稳关闭Nginx,保存相关信息,有安排的结束web服务
nginx -s reload  # 热加载。因改变了Nginx相关配置,需要重新加载配置而重载
nginx -s reopen  # 重新打开日志文件
nginx -c filename  # 为 Nginx 指定一个配置文件,来代替缺省的
nginx -t           # 不运行,而仅仅测试配置文件。
nginx -v           #  显示 nginx 的版本
nginx -V           # 显示 nginx 的版本,编译器版本和配置参数
pkill -9 nginx     # 强制停止 Nginx
# 格式换显示 nginx 配置参数
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua

Nginx 配置

英文文档:http://nginx.org/en/docs/
中文文档:https://blog.redis.com.cn/doc/

学习nginx配置,这一篇就够了:https://zhuanlan.zhihu.com/p/355440492

Nginx 配置详解:https://www.runoob.com/w3cnote/nginx-setup-intro.html

经常要用到的几个文件路径:

/usr/local/etc/nginx/nginx.conf (nginx配置文件路径)
/usr/local/var/www (nginx服务器默认的根目录)
/usr/local/Cellar/nginx/1.17.9 (nginx的安装路径)
/usr/local/var/log/nginx/error.log (nginx默认的日志路径)

Nginx 配置在线调试工具:https://github.com/Momo707577045/nginx-online-config-debug

Nginx 配置 在线生成器,打开官方网站,按需求配置相关参数

NginxWebUI (强大的nginx可视化配置工具)

NginxWebUI 功能说明

  • 项目基于springBoot的web系统,数据库使用sqlite,因此服务器上不需要安装任何数据库。
  • 项目可管理多个nginx服务器集群, 随时一键切换到对应服务器上进行nginx配置, 也可以一键将某台服务器配置同步到其他服务器, 方便集群管理。
  • nginx本身功能复杂, 项目并不能涵盖nginx所有功能, 只能配置常用功能, 更高级的功能配置仍然需要在最终生成的nginx.conf中进行手动编写。
  • 项目部署后, 配置nginx再也不用上网各种搜索, 再也不用手动申请和配置ssl证书, 只需要在本项目中进行增删改查就可方便的配置nginx。

NginxWebUI 两种安装方式:

  • jar 包运行方式
  • Docker 运行方式

首先需要安装 JDK 和 Nginx 环境

  • 下载 jar 包:wget https://craccd.oss-cn-beijing.aliyuncs.com/nginxWebUI-1.3.5.jar
  • 启动程序:nohup java -jar -Xmx64m nginxWebUI-1.3.5.jar --server.port=8080 ----project.home=/home/nginxWebUI/ &
    启动参数说明:
    -Xmx64m 最大分配内存数
    --server.port 占用端口, 默认以8080端口启动
    --project.home 项目配置文件目录,存放数据库文件,证书文件,日志等, 默认为/home/nginxWebUI/
    命令最后加一个&号, 表示项目后台运行

NginxWebUI使用演示:在浏览器直接输入地址:http://serve_ip:8080/ ,第一次登录,需要初始化用户,输入你的用户与密码,点击添加即可。登录完成之后的界面如下:

  • 在http参数配置中可以配置nginx的http项目,进行http转发, 默认会给出几个常用配置, 其他需要的配置可自由增删改查。可以勾选开启日志跟踪, 生成日志跟踪配置项, 每天0点时刻可生成上一天的日志分析报告。由于日志文件access.log文件过大, 默认只保留7天的log文件, 但分析报告可一直保留。
  • 在TCP参数配置中可以配置nginx的steam项目参数, 进行tcp转发。
  • 在反向代理中可配置nginx的反向代理即server项功能, 可开启ssl功能, 可以直接从网页上上传pem文件和key文件, 或者使用系统内申请的证书, 可以直接开启http转跳https功能,也可开启http2协议。
  • 在负载均衡中可配置nginx的负载均衡即upstream项功能, 在反向代理管理中可选择代理目标为配置好的负载均衡。
  • 在html静态文件上传中可直接上传html压缩包到指定路径,上传后可直接在反向代理中使用,省去在Linux中上传html文件的步骤。
  • 在证书管理中可添加证书, 并进行签发和续签, 开启定时续签后, 系统会自动续签即将过期的证书。
  • 最终生成conf文件,可在此进行进一步手动修改,确认修改无误后,可覆盖本机conf文件,并进行效验和重启, 可以选择生成单一nginx.conf文件还是按域名将各个配置文件分开放在conf.d下。
  • 备份文件管理, 这里可以看到nginx.cnf的备份历史版本, nginx出现错误时可以选择回滚到某一个历史版本。
  • log管理, 在http配置中如果开启了log监控的话, 会每天在这里生成日志分析报告。
  • 远程服务器管理, 如果有多台nginx服务器, 可以都部署上nginxWebUI, 然后登录其中一台, 在远程管理中添加其他服务器的ip和用户名密码, 就可以在一台机器上管理所有的nginx服务器了。提供一键同步功能, 可以将某一台服务器的数据配置和证书文件同步到其他服务器中。

nginx.conf 是典型的分段配置文件。

上一个配置文件,作为理解。

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}
http {
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    error_page 404 https://www.baidu.com; #错误页
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

在http 区域内,可以配置无数个 server ,每一个 server 对应着一个虚拟主机(站点)或者域名。server{ } 是包含在 http{ } 内部的。

http {
    ... ...    # http 相关配置项目
    
    # 当 nginx 接到请求后,会匹配其配置中的 server 区域段
    # 匹配方法就是将请求携带的host和port去跟配置中的server_name和listen相匹配
    server {
        listen 80;                # 监听端口;
        server_name localhost;    # 地址。定义当前虚拟主机(站点)匹配请求的主机名
        
        location / {                     # 访问首页路径
            root /xxx/xxx/index.html;     # 默认目录
            index index.html index.htm;   # 请求时返回的默认文件。先找根目录下的index.html,如果没有再找index.htm
        }        
        
        error_page  500 504   /50x.html;    #当出现以上状态码时从新定义到50x.html
        location = /50x.html {             #当访问50x.html时
            root /xxx/xxx/html;             #50x.html 页面所在位置
        }        
    }
    
    server {
        ... ... 
    } 
}

http 区域段 的配置

http {
    sendfile  on;                  #高效传输文件的模式 一定要开启
    keepalive_timeout   65;        #客户端服务端请求超时时间
    log_format  main   XXX;        #定义日志格式 代号为main
    access_log  /usr/local/access.log  main;     #日志保存地址 格式代码 main
}

下面是 nginx 一些配置中常用的内置全局变量,你可以在配置的任何位置使用它们。

打开默认配置文件:vim /usr/local/nginx/conf/nginx.conf

Nginx 配置参数中文详细说明

#定义Nginx运行的用户和用户组
user www www;
#
#nginx进程数,建议设置为等于CPU总核心数.
worker_processes 8;
#
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#
#进程文件
pid /var/run/nginx.pid;
#
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致.
worker_rlimit_nofile 65535;
#
#工作模式与连接数上限
events
{
	#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型.
	use epoll;
	#单个进程最大连接数(最大连接数=连接数*进程数)
	worker_connections 65535;
}
#
#设定http服务器
http
{
	include mime.types; #文件扩展名与文件类型映射表
	default_type application/octet-stream; #默认文件类型
	#charset utf-8; #默认编码
	server_names_hash_bucket_size 128; #服务器名字的hash表大小
	client_header_buffer_size 32k; #上传文件大小限制
	large_client_header_buffers 4 64k; #设定请求缓
	client_max_body_size 8m; #设定请求缓

	# 开启目录列表访问,合适下载服务器,默认关闭.
	autoindex on; # 显示目录
	autoindex_exact_size on; # 显示文件大小 默认为on,显示出文件的确切大小,单位是bytes 改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
	autoindex_localtime on; # 显示文件时间 默认为off,显示的文件时间为GMT时间 改为on后,显示的文件时间为文件的服务器时间

	sendfile on; # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载.注意:如果图片显示不正常把这个改成off.
	tcp_nopush on; # 防止网络阻塞
	tcp_nodelay on; # 防止网络阻塞

	keepalive_timeout 120; # (单位s)设置客户端连接保持活动的超时时间,在超过这个时间后服务器会关闭该链接

	# FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度.下面参数看字面意思都能理解.
	fastcgi_connect_timeout 300;
	fastcgi_send_timeout 300;
	fastcgi_read_timeout 300;
	fastcgi_buffer_size 64k;
	fastcgi_buffers 4 64k;
	fastcgi_busy_buffers_size 128k;
	fastcgi_temp_file_write_size 128k;

	# gzip模块设置
	gzip on; #开启gzip压缩输出
	gzip_min_length 1k; #允许压缩的页面的最小字节数,页面字节数从header偷得content-length中获取.默认是0,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大
	gzip_buffers 4 16k; #表示申请4个单位为16k的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
	gzip_http_version 1.1; #压缩版本(默认1.1,目前大部分浏览器已经支持gzip解压.前端如果是squid2.5请使用1.0)
	gzip_comp_level 2; #压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,但是因为压缩比最大,所以包最小,传输速度快
	gzip_types text/plain application/x-javascript text/css application/xml;
	#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn.
	gzip_vary on;#选项可以让前端的缓存服务器缓存经过gzip压缩的页面.例如:用squid缓存经过nginx压缩的数据

	#开启限制IP连接数的时候需要使用
	#limit_zone crawler $binary_remote_addr 10m;

	##upstream的负载均衡,四种调度算法(下例主讲)##

	#虚拟主机的配置
	server
	{
		# 监听端口
		listen 80;
		# 域名可以有多个,用空格隔开
		server_name ably.com;
		# HTTP 自动跳转 HTTPS
		rewrite ^(.*) https://$server_name$1 permanent;
	}

	server
	{
		# 监听端口 HTTPS
		listen 443 ssl;
		server_name ably.com;

		# 配置域名证书
		ssl_certificate C:\WebServer\Certs\certificate.crt;
		ssl_certificate_key C:\WebServer\Certs\private.key;
		ssl_session_cache shared:SSL:1m;
		ssl_session_timeout 5m;
		ssl_protocols SSLv2 SSLv3 TLSv1;
		ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
		ssl_prefer_server_ciphers on;

		index index.html index.htm index.php;
		root /data/www/;
		location ~ .*\.(php|php5)?$
		{
			fastcgi_pass 127.0.0.1:9000;
			fastcgi_index index.php;
			include fastcgi.conf;
		}

		# 配置地址拦截转发,解决跨域验证问题
		location /oauth/ {
			proxy_pass https://localhost:13580/oauth/;
			proxy_set_header HOST $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}

		# 图片缓存时间设置
		location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
			expires 10d;
		}

		# JS和CSS缓存时间设置
		location ~ .*\.(js|css)?$ {
			expires 1h;
		}

		# 日志格式设定
		log_format access '$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 access;

		# 设定查看Nginx状态的地址.StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用
		location /NginxStatus {
			stub_status on;
			access_log on;
			auth_basic "NginxStatus";
			auth_basic_user_file conf/htpasswd;
			#htpasswd文件的内容可以用apache提供的htpasswd工具来产生.
		}
	}
}

配置文件语法格式

配置文件由注释行,指令块配置项和一系列指令配置项组成。每一条指令由配置项名称和值参数组成,值参数可以是一个或多个附加参数,取决于解析该条指令的模块。

  • 块配置项:由一个块配置项名和一对大括号组成。块配置后面是否带有参数,如 location /webstatic {},取决于解析该配置块的模块。
  • 指令配置项总是以分号结尾 (;)
  • 字符 "#" 表示该行是注释行,nginx 在读取配置文件时将忽略的文本。

当然 nginx 的配置非常多,用的时候可以根据文档进行配置。

#user  nobody;
worker_processes  auto;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    autoindex on;            # 显示目录
    autoindex_exact_size on; # 显示文件大小
    autoindex_localtime on;  # 显示文件时间

    server {
        listen 80;
        server_name  www.myself_1.com laowang.com www.myself_2.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
            try_files  $uri $uri/ /index.html;
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    
    server {
        listen       443 ssl;
        server_name  www.myself_1.com laowang.com www.myself_2.com;

        ssl_certificate      /usr/local/nginx/cert/laowang.com.pem;
        ssl_certificate_key  /usr/local/nginx/cert/laowang.com.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /upload_file {
            alias /data/upload/;
        }        
        
        location /upload_file_test { 
            alias  /data/upload_test/;
        }

        location /img {
            proxy_pass  http://myself_domain:8888/img;
        }

        location /alias_test {
            alias  /data/alias_test;
        }

        location /forward_server {
            proxy_pass http://10.10.10.10:9010/;
        }
    
        location /algc {
            proxy_pass http://10.10.10.20:9020/algc;
        }

        location /llma {
            proxy_pass http://10.10.10.20:9020/llma;
        }        
    }
    
    server {
        listen 8500;
        server_name  www.myself_1.com laowang.com www.myself_2.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   /data/web/;
            index  index.html index.htm;
            try_files  $uri $uri/ /index.html;
        }
        location /prd-api {
            proxy_pass  https://www.myself.com:8888/;
            proxy_buffering     off;
        }
        location /dev-api {
            proxy_pass  https://www.myself.com:7777/;
            proxy_buffering     off;
        }
    }
   
    server {
        listen 8600;
        server_name  www.myself_1.com laowang.com www.myself_2.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   /data/test/web;
            index  index.html index.htm;
            try_files  $uri $uri/ /index.html;
        }
        location /prd-api/ {
            proxy_pass  http://laowang.com:6666/;
        }
    }
    
    server {
        listen 8700;    
        server_name  www.myself_1.com laowang.com www.myself_2.com;
		location /glm {
		    proxy_pass http://10.10.10.30:9530/;
		}

		location /cs-glm {
			proxy_pass http://10.10.10.40:9540/;
		}

        location /tts/ {
            proxy_pass http://10.10.10.50:9550/;
		}
    }
}

  • 第一:location 可以进行正则匹配,应该注意正则的几种形式以及优先级。(这里不展开)
  • 第二:Nginx 能够提高速度的其中一个特性就是:动静分离,就是把静态资源放到 Nginx 上,由Nginx 管理,动态请求转发给后端。
  • 第三:可以在 Nginx下把静态资源、日志文件归属到不同域名下(也即是目录),这样方便管理维护。
  • 第四:Nginx 可以进行IP访问控制,有些电商平台,就可以在 Nginx 这一层做一下处理,内置一个黑名单模块,那么就不必等请求通过 Nginx 达到后端在进行拦截,而是直接在 Nginx 这一层就处理掉。

默认配置

Nginx 安装目录下, 复制一份nginx.conf 成 nginx.conf.default 作为备份,然后修改 nginx.conf

# 工作进程的数量
worker_processes  1;
events {
    worker_connections  1024; # 每个工作进程连接数
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # 日志格式
    log_format  access  '$remote_addr - $remote_user [$time_local] $host "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$clientip"';
    access_log  /srv/log/nginx/access.log  access; # 日志输出目录
    gzip  on;
    sendfile  on;

    # 链接超时时间,自动断开
    keepalive_timeout  60;

    # 虚拟主机
    server {
        listen       8080;
        server_name  localhost; # 浏览器访问域名

        charset utf-8;
        access_log  logs/localhost.access.log  access;

        # 路由
        location / {
            root   www; # 访问根目录
            index  index.html index.htm; # 入口文件
        }
    }

    # 引入其他的配置文件
    include servers/*;
}

搭建站点

    # 引入其他的配置文件
    include servers/*;

在其他配置文件`servers`目录下,添加新建站点配置文件 xx.conf。电脑 hosts 文件添加  127.0.0.1   xx_domian

# 虚拟主机
server {
    listen       8080;
    server_name  xx_domian; # 浏览器访问域名

    charset utf-8;
    access_log  logs/xx_domian.access.log  access;

    # 路由
    location / {
        root   www; # 访问根目录
        index  index.html index.htm; # 入口文件
    }
}

执行命令 nginx -s reload,成功后浏览器访问  xx_domian 就能看到你的页面

根据文件类型设置过期时间

location ~.*\.css$ {
    expires 1d;
    break;
}
location ~.*\.js$ {
    expires 1d;
    break;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    access_log off;
    expires 15d;    #保存15天
    break;
}

#测试图片的max-age
# curl -x127.0.0.1:80 http://www.test.com/static/image/common/logo.png -I

禁止文件缓存

开发环境经常改动代码,由于浏览器缓存需要强制刷新才能看到效果。这是我们可以禁止浏览器缓存提高效率

location ~* \.(js|css|png|jpg|gif)$ {
    add_header Cache-Control no-store;
}

防盗链

可以防止文件被其他网站调用

location ~* \.(gif|jpg|png)$ {
    # 只允许 192.168.0.1 请求资源
    valid_referers none blocked 192.168.0.1;
    if ($invalid_referer) {
       rewrite ^/ http://$host/logo.png;
    }
}

静态文件压缩

server {
    # 开启gzip 压缩
    gzip on;
    # 设置gzip所需的http协议最低版本 (HTTP/1.1, HTTP/1.0)
    gzip_http_version 1.1;
    # 设置压缩级别,压缩级别越高压缩时间越长  (1-9)
    gzip_comp_level 4;
    # 设置压缩的最小字节数, 页面Content-Length获取
    gzip_min_length 1000;
    # 设置压缩文件的类型  (text/html)
    gzip_types text/plain application/javascript text/css;
}

执行命令 nginx -s reload,成功后浏览器访问

指定定错误页面

# 根据状态码,返回对于的错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /source/error_page;
}

执行命令 nginx -s reload,成功后浏览器访问

跨域问题

跨域的定义

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。

同源的定义

如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。

nginx解决跨域的原理

例如:

  • 前端server域名为:http://xx_domain
  • 后端server域名为:https://github.com

现在http://xx_domainhttps://github.com发起请求一定会出现跨域。

不过只需要启动一个nginx服务器,将server_name设置为xx_domain,然后设置相应的location以拦截前端需要跨域的请求,最后将请求代理回github.com。如下面的配置:

## 配置反向代理的参数
server {
    listen    8080;
    server_name xx_domain

    ## 1. 用户访问 http://xx_domain,则反向代理到 https://github.com
    location / {
        proxy_pass  https://github.com;
        proxy_redirect     off;
        proxy_set_header   Host             $host;        # 传递域名
        proxy_set_header   X-Real-IP        $remote_addr; # 传递ip
        proxy_set_header   X-Scheme         $scheme;      # 传递协议
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

这样可以完美绕过浏览器的同源策略:github.com访问nginxgithub.com属于同源访问,而nginx对服务端转发的请求不会触发浏览器的同源策略。

配置 多个web站点 ( 虚拟主机 ) 

虚拟主机

虚拟主机( Virtual Host )可以在一台服务器上绑定多个域名,架设多个不同的网站,一般在开发机或者要部署多个小网站的服务器上需要配置虚拟主机。为了使得配置文件清晰,可以给每一个虚拟主机建立一个配置文件,然后在主配置文件(nginx.conf)里使用include语句包含所有的虚拟主机配置文件。

nginx 的虚拟主机配置其实也挺简单,

建立存放虚拟主机配置文件的文件夹:sudo mkdir /usr/local/etc/nginx/vhosts

建立虚拟主机配置文件:sudo vim /usr/local/etc/nginx/vhosts/domain1.com.conf

在配置文件中,填写如下内容(其中 domain1.com 需要替换成你自己的域名):

server {
    listen 80;
    server_name domain1.com www.domain1.com;
    access_log /var/log/access_domain1.log main;
    location / {
        root /var/www/domain1.com;
        index index.php index.html index.htm;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ .php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/domain1.com/$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~ /.ht {
        deny all;
    }
}

在主配置文件中,include 所有的虚拟主机配置:sudo vim /usr/local/etc/nginx/nginx.conf 

# 在 http 配置节的结束花括号 } 前一行加入如下语句 
include /usr/local/etc/nginx/vhosts/*;

执行:nginx -s reload  重新加载 Nginx 配置文件即可完成配置

配置 虚拟主机的3种方法:

  • 基于域名的虚拟主机 : 不同的域名、相同的IP(此方式应用最广泛)
  • 基于端口的虚拟主机 : 不使用域名、IP来区分不同站点的内容,而是用不同的TCP端口号
  • 基于IP地址的虚拟主机 : 不同的域名、不同的IP ( 需要加网络接口 ,应用的不广泛) 基于IP地址

方式 1:基于 IP

两个物理网卡,两个IP

# 两张物理网卡ens32和ens34
[root@nginx network-scripts]# ifconfig ens32 | awk 'NR==2 {print $2}'  
192.168.126.41

[root@nginx network-scripts]# ifconfig ens34 | awk 'NR==2 {print $2}'  
192.168.126.42

编辑配置文件,基于每个 IP 创建一个虚拟主机

# 为防止 /etc/nginx/conf.d/default.conf 配置文件影响,对其进行重命名
[root@nginx ~]# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default     

[root@nginx ~]# vim /etc/nginx/conf.d/ip.conf
# ens32网卡对应的虚拟主机
server {
  listen 192.168.126.41:80;

  location / {
    root /ip_ens32;
    index index.html;
  }
}

# ens34 网卡对应的虚拟主机
server {
  listen 192.168.126.42:80;

  location / {
    root /ip_ens34;
    index index.html;
  }
}

创建虚拟主机的网页文件目录及文件

[root@nginx ~]# mkdir /ip_ens32
[root@nginx ~]# mkdir /ip_ens34

[root@nginx ~]# echo "ens32" > /ip_ens32/index.html
[root@nginx ~]# echo "ens34" > /ip_ens34/index.html

检查配置文件的语法

[root@nginx ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重载 nginx 服务

[root@nginx ~]# systemctl reload nginx

测试

[root@nginx ~]# curl 192.168.126.41
ens32
[root@nginx ~]# curl 192.168.126.42
ens34

方式 2:基于端口

为一个物理网卡配置多个ip

ip addr add IP/MASK dev 网卡名

# 删除
ip addr del IP/MASK dev 网卡名

其余步骤同上面多网卡多IP的配置

基于端口

配置

[root@nginx ~]# vim /etc/nginx/conf.d/port.conf
server {
  listen 81;

  location / {
    root /port_81;
    index index.html;
  }
}

server {
  listen 82;

  location / {
    root /port_82;
    index index.html;
  }
}

[root@nginx ~]# mkdir /port_{81..82}
[root@nginx ~]# echo "81" > /port_81/index.html
[root@nginx ~]# echo "82" > /port_82/index.html

[root@nginx ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@nginx ~]# systemctl reload nginx

测试

[root@nginx ~]# curl 192.168.126.41:81
81
[root@nginx ~]# curl 192.168.126.41:82
82

方式 3:基于域名

一般一个域名对应一个配置文件,便于管理

[root@nginx ~]# vim /etc/nginx/conf.d/test1.dxk.com.conf
server {
  listen 80;
  server_name test1.dxk.com;

  location / {
    root /test1;
    index index.html;
  }
}

[root@nginx ~]# vim /etc/nginx/conf.d/test2.dxk.com.conf
server {
  listen 80;
  server_name test2.dxk.com;

  location / {
    root /test2;
    index index.html;
  }
}

[root@nginx ~]# mkdir /test{1..2}
[root@nginx ~]# echo "test1" > /test1/index.html
[root@nginx ~]# echo "test2" > /test2/index.html

[root@nginx ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@nginx ~]# systemctl reload nginx

测试

# 配置域名解析
[root@nginx ~]# echo -e "192.168.126.41 test1.dxk.com\n192.168.126.41 test2.dxk.com" >> /etc/hosts
[root@nginx ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.126.41 test1.dxk.com
192.168.126.41 test2.dxk.com

[root@nginx ~]# curl test1.dxk.com
test1
[root@nginx ~]# curl test2.dxk.com
test2

这里有个问题:

如果在配置域名解析时由于写错了,那么访问该错误域名(未配置该错误域名的虚拟主机)时竟然还会返回网页内容。

[root@nginx ~]# vim /etc/hosts
192.168.126.41 test1.dxk.com
192.168.126.41 test3.dxk.com   # 这里本应该是 test2.dxk.com ,但是由于写错了,而且对应test3.dxk.com域名的虚拟主机并不存在

访问该错误域名

[root@nginx ~]# curl test3.dxk.com
test1

# 可以看到,还是会返回网页信息

因为在配置域名解析时,虽然域名写错了,但是IP是对的,那么此时服务端默认会返回满足是该IP且端口为80的排在第一个的虚拟主机的网页信息给客户端

[root@nginx ~]# ll /etc/nginx/conf.d/
-rw-r--r--. 1 root root  112 Jul  3 21:23 test1.dxk.com.conf
-rw-r--r--. 1 root root  112 Jul  3 21:22 test2.dxk.com.conf

Nginx 的 Master-Worker 模式

Master 进程的作用

读取并验证配置文件 nginx.conf;管理 worker 进程;

Worker 进程的作用

worker 进程负责处理具体的请求。每一个 Worker 进程都维护一个线程(避免线程切换),处理连接和请求;注意 Worker 进程的个数由配置文件决定,一般和 CPU 个数相关(有利于进程切换),配置几个就有几个Worker进程。

Nginx 热部署

所谓热部署,就是配置文件 nginx.conf 修改后,不需要 stop Nginx,不需要中断请求,就能让配置文件生效!

重新加载:nginx -s reload

检查配置:nginx -t

停止:nginx -s stop

Nginx 如何做到高并发下的高效处理

一般 Nginx 的 worker 进程个数与CPU绑定、worker进程内部包含一个线程高效回环处理请求,这的确有助于效率,但这是不够的。

作为专业的程序员,我们可以开一下脑洞:BIO/NIO/AIO、异步/同步、阻塞/非阻塞...

Nginx采用了Linux的epoll模型,epoll模型基于事件驱动机制,它可以监控多个事件是否准备完毕,如果OK,那么放入epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。

Nginx 挂了怎么办

Nginx既然作为入口网关,很重要,如果出现单点问题,显然是不可接受的。

答案是:Keepalived+Nginx实现高可用

Keepalived是一个高可用解决方案,主要是用来防止服务器单点发生故障,可以通过和Nginx配合来实现Web服务的高可用。(其实,Keepalived不仅仅可以和Nginx配合,还可以和很多其他服务配合)

Keepalived+Nginx 实现高可用的思路:

  • 第一:请求不要直接打到Nginx上,应该先通过Keepalived(这就是所谓虚拟IP,VIP)
  • 第二:Keepalived应该能监控Nginx的生命状态(提供一个用户自定义的脚本,定期检查Nginx进程状态,进行权重变化,,从而实现Nginx故障切换)


 

2、Nginx 应用场景

主要有4大应用场景

动静分离

为了加快服务器的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

动静分离的一种做法是将静态资源部署在nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求全部请求nginx服务器,达到动静分离的目标。

动静分离其实就是 Nginx 服务器将接收到的请求分为 动态请求 和 静态请求

  • 静态请求直接从 nginx 服务器所设定的根目录路径去取对应的资源,
  • 动态请求转发给真实的后台(前面所说的应用服务器,如图中的Tomcat)去处理。

nginx 动静分离的好处

  • api 接口服务化:动静分离之后,后端应用更为服务化,只需要通过提供api接口即可,可以为多个功能模块甚至是多个平台的功能使用,可以有效的节省后端人力,更便于功能维护。
  • 前后端开发并行:前后端只需要关心接口协议即可,各自的开发相互不干扰,并行开发,并行自测,可以有效的提高开发时间,也可以有些的减少联调时间
  • 减轻后端服务器压力,提高静态资源访问速度:后端不用再将模板渲染为html返回给用户端,且静态服务器可以采用更为专业的技术提高静态资源的访问速度。

示例配置

server {  
        listen       8080;        
        server_name  localhost;

        location / {
            root   html; # Nginx默认值
            index  index.html index.htm;
        }
        
        # 静态化配置,所有静态请求都转发给 nginx 处理,存放目录为 my-project
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
            root /usr/local/var/www/my-project; # 静态请求所代理到的根目录
        }
        
        # 动态请求匹配到path为'node'的就转发到8002端口处理
        location /node/ {  
            proxy_pass http://localhost:8002; # 充当服务代理
        }
}

访问静态资源 nginx 服务器会返回 my-project 里面的文件,如获取 index.html:

访问动态请求 nginx 服务器会将它从8002端口请求到的内容,原封不动的返回回去:

正向代理

正向代理(forward)意思是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标 (原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。

正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。

图示:关于正向代理和反向代理

举个例子:内网一台机子A不能访问 https://www.baidu.com,另一台B能访问https://www.baidu.com,那在B上安装 nginx 并做一个正向代理

Nginx 做代理服务器代理支持HTTPS请求:https://www.jianshu.com/p/b1b5ef4636dd

原生 nginx 只支持 http 正向代理,为了 nginx 支持 https 正向代理,可以打ngx_http_proxy_connect_module-master 补丁+ ssl模块支持,没有这个 nginx 就无法代理https 的请求。地址:https://github.com/chobits/ngx_http_proxy_connect_module
ngx_http_proxy_connect_module模块主要用于隧道SSL请求的代理服务器

nginx正向代理http, https亲测可用:https://www.cnblogs.com/chenjinxi/p/13265877.html

Nginx之正向代理与反向代理进阶(支持https):https://zhuanlan.zhihu.com/p/629353778

Module ngx_http_proxy_module:https://nginx.org/en/docs/http/ngx_http_proxy_module.html

反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。

反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。

反向代理的作用

  1. 保障应用服务器的安全(增加一层代理,可以屏蔽危险攻击,更方便的控制权限)
  2. 实现负载均衡
  3. 实现跨域(号称是最简单的跨域方式)

配置反向代理

server {  
    listen       8080;        
    server_name  localhost;
    location / {
        root   html; # Nginx默认值
        index  index.html index.htm;
    }
    proxy_pass http://localhost:8000; # 反向代理配置,请求会被转发到8000端口
}

反向代理的表现很简单。上面的代码块其实就是向 nginx 请求 localhost:8080 跟请求 http://localhost:8000 是一样的效果。这是一个反向代理最简单的模型,只是为了说明反向代理的配置。但是现实中反向代理多数是用在负载均衡中。

nginx 就是充当图中的 proxy。左边的3个 client 在请求时向 nginx 获取内容,是感受不到3台 server 存在的。此时,proxy就充当了3个 server 的反向代理。

反向代理应用十分广泛,CDN 服务就是反向代理经典的应用场景之一。除此之外,反向代理也是实现负载均衡的基础,很多大公司的架构都应用到了反向代理。

反向代理过程中,对请求来说是透明的,比如说 request -> Nginx -> Tomcat,那么对于 Tomcat 而言,请求的 IP 地址就是 Nginx 的地址,而非真实的 request 地址,这一点需要注意。不过好在Nginx 不仅仅可以反向代理请求,还可以由用户 自定义设置HTTP HEADER

负载均衡

负载均衡是什么?

如果请求数过大,一台服务已经满足不了系统要求,则可以增加服务器的数量,这个时候就出现了服务器 集群然后将请求 "均匀地"(严格讲并不一定均匀,可以通过设置权重)分发到各个服务器上,将原先集中到单个服务器的情况改为分配到这个集群中所有的服务器上。这个就叫做 "负载均衡"。

负载均衡的作用

  • 分摊服务器集群压力
  • 保证客户端访问的稳定性

负载均衡 可以解决分摊服务器集群压力的问题。除此之外,Nginx 还带有健康检查(服务器心跳检查)功能,会定期轮询向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态。一旦发现某台服务器异常,那么在这以后代理进来的客户端请求都不会被发送到该服务器上(直健康检查发现该服务器已恢复正常),从而保证客户端访问的稳定性。

配置负载均衡并不复杂:

  • Upstream 指定后端服务器地址列表,还可以指定负载策略( IPHASH、加权论调、最少连接),健康检查策略( Nginx可以监控这一组Tomcat的状态)等。
  • 在 server 中拦截响应请求,并将请求转发到 Upstream 中配置的服务器列表。即将 proxy_pass 替换成 upstream 指定的值即可。

代码如下:

upstream balanceServer {
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;

    server 10.1.22.35:12345;
}

server { 
    server_name  fe.server.com;
    listen 80;
    location /api {
        proxy_pass http://balanceServer;
  }
}

上面的配置只是指定了 nginx 需要转发的服务端列表,并没有指定分配策略。默认情况下采用的是轮询策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。

Nginx支持的负载均衡调度算法方式如下:

  • weight轮询(默认,常用):接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。ip_hash(常用):每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
  • fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。

Nginx 多台服务器实现负载均衡

1.Nginx负载均衡服务器:IP:192.168.0.4  (Nginx-Server)
2.Web服务器列表:
        Web1:192.168.0.5  (Nginx-Node1/Nginx-Web1)
        Web2:192.168.0.7  (Nginx-Node2/Nginx-Web2)
3.实现目的:用户访问 Nginx-Server (http://mongo.demo.com:8888)时,通过Nginx负载均衡到Web1和Web2服务器

Nginx 负载均衡服务器的nginx.conf配置注释如下:

events
{
    use epoll;
    worker_connections 65535;
}
http
{
    ##upstream的负载均衡,四种调度算法##
    #调度算法1:轮询.每个请求按时间顺序逐一分配到不同的后端服务器,
    # 如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响
    upstream webhost {
        server 192.168.0.5:6666 ;
        server 192.168.0.7:6666 ;
    }
    #调度算法2:weight(权重).可以根据机器配置定义权重.权重越高被分配到的几率越大
    upstream webhost {
        server 192.168.0.5:6666 weight=2;
        server 192.168.0.7:6666 weight=3;
    }
    #调度算法3:ip_hash. 每个请求按访问IP的hash结果分配,
    # 这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题
    upstream webhost {
        ip_hash;
        server 192.168.0.5:6666 ;
        server 192.168.0.7:6666 ;
    }
    #调度算法4:url_hash(需安装第三方插件).此方法按访问url的hash结果来分配请求,
    # 使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率.
    # Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包
    upstream webhost {
        server 192.168.0.5:6666 ;
        server 192.168.0.7:6666 ;
        hash $request_uri;
    }
    #调度算法5:fair(需安装第三方插件).这是比上面两个更加智能的负载均衡算法.
    # 此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,
    # 也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配.Nginx本身是不支持fair的,
    # 如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块
    #
    #虚拟主机的配置(采用调度算法3:ip_hash)
    server
    {
        listen 80;
        server_name mongo.demo.com;
        #对 "/" 启用反向代理
        location / {
            proxy_pass http://webhost;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #以下是一些反向代理的配置,可选.
            proxy_set_header Host $host;
            client_max_body_size 10m; #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
            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服务器传
        }
    }
}

负载均衡操作演示如下:
操作对象:192.168.0.4(Nginx-Server)
# 创建文件夹准备存放配置文件
$ mkdir -p /opt/confs
$ vim /opt/confs/nginx.conf

# 编辑内容如下:
events
{
	use epoll;
	worker_connections 65535;
}

http
{
	upstream webhost {
		ip_hash;
		server 192.168.0.5:6666 ;
		server 192.168.0.7:6666 ;
	}

	server
	{
		listen 80;
		server_name mongo.demo.com;
		location / {
			proxy_pass http://webhost;
			proxy_redirect off;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Host $host;
			client_max_body_size 10m;
			client_body_buffer_size 128k;
			proxy_connect_timeout 90;
			proxy_send_timeout 90;
			proxy_read_timeout 90;
			proxy_buffer_size 4k;
			proxy_buffers 4 32k;
			proxy_busy_buffers_size 64k;
			proxy_temp_file_write_size 64k;
		}
	}
}

然后保存并退出

# 启动负载均衡服务器 192.168.0.4(Nginx-Server)

docker run -d -p 8888:80 --name nginx-server -v /opt/confs/nginx.conf:/etc/nginx/nginx.conf --restart always nginx
操作对象:192.168.0.5(Nginx-Node1/Nginx-Web1)
# 创建文件夹用于存放web页面
$ mkdir -p /opt/html
$ vim /opt/html/index.html

# 编辑内容如下:
<div>
<h1>
The host is 192.168.0.5(Docker02) - Node 1!
</h1>
</div>
# 然后保存并退出

# 启动192.168.0.5(Nginx-Node1/Nginx-Web1)

$ docker run -d -p 6666:80 --name nginx-node1 -v /opt/html:/usr/share/nginx/html --restart always nginx
操作对象:192.168.0.7(Nginx-Node2/Nginx-Web2)
# 创建文件夹用于存放web页面
$ mkdir -p /opt/html
$ vim /opt/html/index.html

# 编辑内容如下:
<div>
<h1>
The host is 192.168.0.7(Docker03) - Node 2!
</h1>
</div>
# 然后保存并退出

# 启动192.168.0.7(Nginx-Node2/Nginx-Web2)

$ docker run -d -p 6666:80 --name nginx-node2 -v $(pwd)/html:/usr/share/nginx/html --restart always nginx

缓存

缓存,是 Nginx 提供的,可以加快访问速度的机制,说白了,在配置上就是一个开启,同时指定目录,让缓存可以存储到磁盘上。具体配置,可以参考Nginx官方文档,这里不再多说。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值