常常会听到一些关于反向代理和负载均衡的话题,但是具体如何实现呢?
nginx 是什么
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、PHP等,但是不支持java,java 程序只能通过 tomcat 配合完成,nginx 专为性能优化而开发,非常注重效率,能经受高负载的考验,最高可以承受5万并发数。
nginx 基本概念
我们常说的代理指的是正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务器并不知道真实的客户端是谁,客户端请求的服务都被代理服务器来代替请求。
nginx 不仅可以做反向代理,还能用作正向代理来进行上网。
如果把局域网外的 Internet 想像成一个资源库,局域网中的客户端想要访问 Internet ,则需要代理服务器来访问,这个代理服务器就是所谓的正向代理。
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
客户端对反向代理是无感知的,因为客户端不需要配置就可以访问,反向代理隐藏了真实的服务端。客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后返回给客户端,此时反向代理服务器和目标服务器对外就是一台服务器,暴露的是代理服务器地址,隐藏了真实服务器的IP地址。
一个简单的请求如下图,但是往往实际情况并不是如此,如果大量请求同时发送,就会导致服务器崩溃的情况,可以通过提高服务器的配置来解决问题,但是并不能从根本上解决问题。
单个服务器解决不了,我们可以增加服务器的数量,然后请求分发到各个服务器上,将负载分发到不同的服务器,也就是我们说的负载均衡。
公司会建立很多的服务器,这些服务器组成了服务器集群,当用户访问网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入选择的服务器。用户每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
静态资源: CSS HTML JS 、、、
动态资源: JSP servelet、、、
单服务: 把动态资源和静态资源都部署到tomcat里面。
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
nginx 安装
也可以直接在官网下载,并且安装一些依赖。因为我用的mac,下面是我比较推荐的方式。
安装homebrew
Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。
如果之前尝试过其他脚本安装,请移除Homebrew后再安装
将脚本复制到终端 enter
/bin/bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"
如果页面出现下面的卡顿
==> Tapping homebrew/core
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
ctrol + c 中断,然后执行下面的命令
cd "$(brew --repo)/Library/Taps/"
mkdir homebrew && cd homebrew
git clone git://mirrors.ustc.edu.cn/homebrew-core.git
安装cask 同样也有安装失败或者卡住的问题,解决方法也是一样
cd "$(brew --repo)/Library/Taps/"
cd homebrew
git clone https://mirrors.ustc.edu.cn/homebrew-cask.git
安装成功后会有下图提示
homebrew更新
brew update
git -C "$(brew --repo)" remote set-url origin https://mirrors.ustc.edu.cn/brew.git
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git
brew update
清华大学源
git -C "$(brew --repo)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git
git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git
brew update
恢复默认源
git -C "$(brew --repo)" remote set-url origin https://github.com/Homebrew/brew.git
git -C "$(brew --repo homebrew/core)" remote set-url origin https://github.com/Homebrew/homebrew-core.git
git -C "$(brew --repo homebrew/cask)" remote set-url origin https://github.com/Homebrew/homebrew-cask.git
brew update
卸载 Homebrew
使用官方脚本同样会遇到uninstall地址无法访问问题,可以使用下面脚本
/bin/bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/uninstall.sh)"
安装nginx
brew install nginx 安装nginx
nginx -v即可查看版本
nginx 常用命令
使用 nginx 操作命令前提条件,必须进入到 nginx 的目录
进入到nginx文件夹
cd /usr/local/etc/nginx
启动nginx
nginx
在浏览器输入 http://localhost:8080/
这样nginx就启动好了
关闭nginx
nginx -s stop
重启nginx
nginx -s reload
nginx -t
进入到 nginx 文件后在终端输入 ls 即可查看 nginx 的目录文件,其中nginx.conf就是配置文件/
配置文件组成:
执行下面的命令打开nginx配置文件
vim Nginx.conf
可以看到大部分就是井号注释掉的内容。
#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;
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;
server {
listen 8080;
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;
上面是我复制出来的 nginx.conf 文件,可以看出来由三部分组成。
从配置文件开始,到 events 块之间的内容,只要会设置一些影响 nginx 服务器整体运行的配置指令,只要包括配置运行 Nginx 服务器的用户组,允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入。
worker_processes 1;
这是 nginx 服务器并发处理的关键配置,worker_processes的值越大,可以支持的并发数量也越多,但是也会受到硬件、软件的影响。
events 块
events 块涉及的指令主要影响 nginx 服务器与用户的网络连接,常用的设置包括是否开启对 worker_processes 下的网络连接进行序列化,是否允许同时接受多个网络连接,选取哪种事件驱动模型来处理连接请求,多个 worker_processes 可以同时支持的最大连接数等。
1024表示 worker_processes 的最大连接数是1024,这部分的配置对 nginx 的性能影响比较大,在实际中应该灵活配置。
http块
nginx 配置中最频繁的一部分,代理,缓存,日志等绝大部分功能和第三方模块的配置都在这里。http块也可以包括http全局块,server块。
http 全局块
http 全局块配置的指令包括文件引入、MIME- TYPE 定义,日志自定义,连接超时时间,单链接请求数上限等。
serve 块
与虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,技术产生是为了节约更多的互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
listen 8080;
server_name localhost;
nginx 反向代理
nginx反向代理主要通过配置proxy_pass
server {
listen 9001;
server_name localhost;
location ~ /oss/ {
proxy_pass http://localhost:8001;
nginx 负载均衡
通过 upstream 实现负载均衡
upstream test{
server 11.22.333.11:6666 weight=1;
server 11.22.333.44:5555 weight=2;
配置完成后保存文件,重启nginx即可。
nginx 动静分离
nginx 配置高可用集群
nginx 原理