参考视频:尚硅谷Nginx教程(2019发布)

参考链接:Windows下Nginx负载均衡实现

一、前言

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,特点是占有内存少,并发能力强。在百度、腾讯、淘宝等网站广泛应用。有测试表明,nginx能支持高达50000个并发连接数。

在官网下载nginx,直接下载zip解压



我们打开conf/nginx.conf,这是nginx的配置文件,里面分成三块:

1、全局块



范围:从开始到events块

中间有这样一句配置worker_processes 1;,这个值越大,可以支持的并发处理量越大。

#user  nobody;
worker_processes 1; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid;

2、events块(主要影响nginx和用户的网络连接)



范围:events部分

events {
worker_connections 1024;
}

3、http块(包含http全局块server块



范围:http部分(配置最频繁的部分)

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;

server块

server {
listen 80;
server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / {
root html;
index index.html index.htm;
} #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;
#}
}

二、反向代理

(1)首先了解正向代理,国内用户正常情况下不能直接使用google搜索,如果要使用需要先请求代理服务器(浏览器需配置代理服务器),然后通过代理服务器向www.google.com发送请求,这个过程就是正向代理。代理服务器代表的是客户端。

(2)反向代理,反向代理服务器代理的是服务端,用户只需要将请求发送给反向代理服务器,反向代理服务器会自己去寻找对应的服务器。这时服务器的地址就不会暴露给用户





接下来我们来实现简单的反向代理

需求:准备两个tomcat作为服务器,一个通过访问www.tomcat1.com:8080可以访问主页,一个通过访问www.tomcat2.com:8081看到主页,配置nginx反向代理后,只需要发送www.tomcat1.com和www.tomcat2.com就可以访问到各自主页。

  1. 配置DNS。首先要在windows系统的host文件里配置DNS,使得访问www.tomcat1.comwww.tomcat2.com就和访问localhost一样,见tomcat学习中有详细方法(因为我没有服务器,nginx也在window系统中,所以只能用端口号来区别两个服务器了),windows下host文件添加配置如下:
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 www.tomcat1.com
127.0.0.1 www.tomcat2.com
  1. 修改其中一个server.xml文件,将端口号设置为8081(其余两个端口都要改变!!!否则无法同时启动两个tomcat)。删除两个tomcat下webapps下的所有文件,只留下ROOT文件夹,文件夹中都只留下一个index.html文件(以下是tomcat2服务器下的)
<html>
<meta charset="UTF-8">
<head>
<title>tomcat2</title>
</head>
<body>
<h1>这是tomcat2</h1>
</body>
</html>
  1. 此时启动两个tomcat,分别输入www.tomcat1.com:8080和www.tomcat2.com:8081可以访问到各自服务器下的index.html
  2. 配置nginx。打开conf/nginx.conf,(先复制保存原版本)删除原来的server{…},添加以下代码:
	server {
listen 80;
server_name www.tomcat1.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.tomcat2.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8081;
index index.html index.htm;
}
}
  1. 点击nginx.exe启动。

输入www.tomcat1.com和www.tomcat2.com,也可以显示页面了

三、负载均衡

平常我们开发web项目时,请求和响应的流程满足三层c/s架构如下:



但是当并发量很大时,单一的服务端很难及时响应。

负载均衡就是增加服务器数量,把大量的请求分散在各个服务器上(将负载分布在多个服务器)



windows平台下nginx负载均衡的实现

  1. 配置nginx文件



    所有动态请求都是通过localhost:8999转发。我们创建两个web项目,分别配置不同的tomcat服务器。只贴关键代码(两个web项目只有返回的字符串不同):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"> <servlet>
<servlet-name>indexServlet</servlet-name>
<servlet-class>indexServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>indexServlet</servlet-name>
<url-pattern>/index</url-pattern>
</servlet-mapping>
</web-app>
import java.io.IOException;
import java.util.Date; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class indexServlet extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response){ try {
response.getWriter().println("<h1>This is tomcat server 2!</h1>");
response.getWriter().println(new Date().toLocaleString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

然后访问localhost:8999/index,不断刷新,结果在这两个页面中不断变化(可以设置权重来设置两个服务器的访问频率):



四、动静分离

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

在一般的web应用中,一个服务器tomcat管理所有的动态资源和静态资源



动静分离:



在windows下实现nginx与springboot的动静分离

  1. nginx配置动态请求的拦截静态资源的拦截
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; server {
listen 8999; #监听8999端口
server_name localhost; #拦截动态请求
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
} #拦截静态资源(设置主页为html文件夹下的index.html)
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root html;
index index.html index.htm;
} } }
  1. 在nginx的html文件夹下放置如下文件作为静态资源



  2. 编写主页index.html代码(作用:向后端发送请求,将返回值打印到界面):

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
{{result.data}}
</div> <script type="text/javascript" src="./vue.min.js"></script>
<script type="text/javascript" src="./axios.min.js"></script>
<script>
new Vue({
el: '#app',
data(){
return {
result: null
}
},
mounted () {
axios
.get('index/list')
.then(response => (this.result = response))
.catch(function (error) { // 请求失败处理
console.log(error);
});
}
})
</script>
</body>
</html>
  1. springboot后台indexController代码如下(返回一个list):
@RestController
@RequestMapping(value = "/index")
public class IndexController { @RequestMapping(value = "/list",method = RequestMethod.GET)
public List<Integer> list(){
List<Integer> list = new ArrayList<>();
for(int i = 0; i < 10; i++){
list.add(i);
}
return list;
}
}
  1. 运行springboot项目(端口号8080)和nginx(端口号8999),发送请求到localhost:8999/index.html,nginx会把html文件夹下的index.html返回(静态资源),index.html中向后台使用了get方法,所以属于动态请求。nginx把请求发送给localhost:8080/index/list,获取返回数据后发送到前端。

nginx的基础学习+实战的更多相关文章

  1. 【Nginx】基础学习概览【汇总】

    一.Nginx 简介安装启动 二.Nginx的应用场景 三.Nginx中的配置命令 四.实现动态负载均衡 五.四层负载均衡 六.主从热备 七.动静分离 一.Nginx 简介安装启动 [Nginx]简介 ...

  2. MongoDB实战开发 【零基础学习,附完整Asp.net示例】

    MongoDB实战开发 [零基础学习,附完整Asp.net示例] 阅读目录 开始 下载MongoDB,并启动它 在C#使用MongoDB 重构(简化)代码 使用MongoDB的客户端查看数据 使用Mo ...

  3. 推荐学习《Python与量化投资从基础到实战》PDF及代码+《量化投资以Python为工具》PDF及代码

    利用python分析量化投资问题是现在研究的热点,推荐两份资料用于学习 <Python与量化投资:从基础到实战>主要讲解如何利用Python进行量化投资,包括对数据的获取.整理.分析挖掘. ...

  4. 『深度应用』NLP机器翻译深度学习实战课程·零(基础概念)

    0.前言 深度学习用的有一年多了,最近开始NLP自然处理方面的研发.刚好趁着这个机会写一系列NLP机器翻译深度学习实战课程. 本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内 ...

  5. Nginx web基础入门

    目录 Nginx web基础入门 如何升级nginx或者添加功能 使用systemd管理nginx nginx相关配置文件 nginx的配置文件详解 日志格式 game日志记录实战 日志切割 手写虚拟 ...

  6. Yaf零基础学习总结3-Hello Yaf

    Yaf零基础学习总结3-Hello Yaf 上一次我们已经学习了如何安装yaf了,准备工作做好了之后我们来开始实际的编码了,码农都知道一个经典的语句就是“Hello World”了,今天我们开始入手Y ...

  7. RabbitMQ-从基础到实战(4)— 消息的交换(下)

    0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换(上) 1.简介 ...

  8. RabbitMQ-从基础到实战(5)— 消息的交换(下)

    转载请注明出处 0.目录 RabbitMQ-从基础到实战(1)- Hello RabbitMQ RabbitMQ-从基础到实战(2)- 防止消息丢失 RabbitMQ-从基础到实战(3)- 消息的交换 ...

  9. 零基础学习Hadoop

    零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了.整个过程整理一下,给大家参考,欢迎讨论,共同学习. ...

随机推荐

  1. JavaWeb网上图书商城完整项目--25.注册页面之隐藏没有内容的错误信息实现

    在上一章中我们显示的效果如下所示: 上面后面都有错误的红色×的显示,这样是不对的,我们要解决该问题 我们要循环遍历每一个错误的信息,看它的内容有没有,如果有内容我们就显示错误的×,如果没有就不显示× ...

  2. android handle详解2 主线程给子线程发送消息

    按照android handler详解分析的原理我们可以知道,在主线程中创建handle对象的时候,主线程默认创建了一个loop对象使用threalocal函数将loop对象和主线程绑定. 我们能不能 ...

  3. vue环境配置脚手架搭建,生命周期,钩子

    Vue项目环境搭建 """ node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内 ...

  4. 新来的"大神"用策略模式把if else给"优化"了,技术总监说:能不能想好了再改?

    本文来自作者投稿,原作者:上帝爱吃苹果 目前在魔都,贝壳找房是我的雇主,平时关注一些 java 领域相关的技术,希望你们能在这篇文章中找到些有用的东西.个人水平有限,如果文章有错误还请指出,在留言区一 ...

  5. 关于idea的一些快捷键

    最近在用idea写代码,熟悉一些快捷键的使用能够让写代码的速度提高,以下快捷键是默认idea的快捷键,当然我们可以自己修改的: 自动补全代码快捷键:CTRL+alt+V 自动格式化代码:CTRL+al ...

  6. 入门大数据---Anaconda安装

    1. 什么是Anaconda? Anaconda是一个开源的Python发行版本,python是一个编译器,如果不使用Anaconda那么安装起来会比较痛苦,各个库之间的依赖性就很难连接的很好.Ana ...

  7. C++ Primer Plus(四)

    完整阅读C++ Primer Plus 系统重新学习C++语言部分,记录重要但易被忽略的,关键但易被遗忘的. 友元.异常和其他 1.抛出异常类时,虽然catch的是一个引用,但是也会产生一次拷贝,因为 ...

  8. 前端进阶笔记之核心基础知识---那些HTML标签你熟悉吗?

    目录 1.交互实现 1.1 meta标签:自动刷新/跳转 1.2 title标签:消息提醒 2.性能优化 2.1 script标签:调整加载顺序提升渲染速度 2.2 link标签:通过预处理提升渲染速 ...

  9. 【MyBtis】获取数据插入postgresql后返回的自增id

    问题描述 数据库采用的是postgresql,以下面的rule表为例,该表的id设置为自增,那么经常有这样的需求,在执行insert操作后,紧接着需要获取该记录的自增id往中间表中插入数据,或者是再根 ...

  10. Zuul请求超时

    最近在弄springcloud的时候发现在发送短信的时候zuul总是报错,错误信息如下 com.netflix.zuul.exception.ZuulException: at org.springf ...