Nginx服务器

一:什么是Nginx?

我们生活的世界中,有的时候需要上网。我们可以浏览很多很多的网页,这些网页都是由一系列的程序组成,但是我们是否想过,这些程序存储在什么地方呢?没错,这些程序都是存储在一种名叫服务器的硬件上,比如我们的电脑也是一种服务器,只不过我们的个人电脑作为服务器的话性能会比较低。我们的网页程序存储在服务器硬件上,是否可以随意存储呢?不是的,我们需要在服务器硬件的操作系统中搭建一个服务器软件,那么这样,有服务器软件跟服务器硬件配合,才形成一个完整的服务器。服务器软件有非常多,比如Apache、tomcat等等都是服务器软件,而我们今天要学习的Nginx也是一种服务器软件之一。

Nginx是一种服务器软件,故而其最主要、最基本的功能当然是可以与服务器硬件结合,让程序员可以将程序放在Nginx服务器上,将程序发布出去,让成千上万的网民可以浏览。除此之外,Nginx是一种高性能的HTTP和反向代理服务器,同时也是一个代理邮件服务器。也就是说,我们Nginx上可以发布网站,也可以实现负载均衡的功能,还可以作为邮件服务器实现收发邮件等功能。所谓的负载均衡是指,当同时有N多用户访问我们服务器的时候,为了减少服务器压力,我们需要将用户分别引入各服务器,分担服务器的压力。

什么是Nginx — Nginx与其他服努器的性能比较

首先说IIS, IIS服务器只能在Windows上运行,Windows服务器性能不如Linux— 类服务器。其次说Tomcat,Tomcat服务器面向的是Java语言,是一种重量级的服 务器,而Nginx是轻量级服务器,Tomcat与Nginx不具备可比性。最后,我们讲一 下Apache,Apache优点非常多,比如稳定、幵源、跨平台等等,但是Apache不支 持高并发。Nginx能支持处理百万级的TCP连接,10万以上的并发连接,并且是一 个很好的跨平台服务器。

Nginx的主要优点有可以实现高并发、部署简单、内存消耗少、成本低等等。

Nginx的主要缺点有rewrite功能不够强大,模块没有Apache的多。

二:如何在Linux中搭建Nginx服务器?

新建压缩包下载位置(可选)

新建目录
mkdir /usr/local/nginx_down
切换目录
cd /usr/local/nginx_down

下载解压 Nginx

下载
wget http://nginx.org/download/nginx-1.14.0.tar.gz
解压
tar -zxvf nginx-1.14.0.tar.gz
切换目录
cd nginx-1.14.0

配置 Nginx

./configure --with-http_ssl_module
  1. 这样会默认安装nginx在 /usr/local/nginx 目录,可以使用--prefix=/usr/local/nginx指定安装位置。

  2. 如果需要HTTPS(SSL)的支持,需要指定参数--with-http_ssl_module

如果提示错误,那么需要其它环境,请参考下面

安装 make

yum -y install gcc automake autoconf libtool make

安装 g++

yum -y install gcc gcc-c++

安装 PCRE库

yum -y install pcre pcre-devel

安装 Zlib

yum -y install zlib zlib-devel

安装 GD library

yum -y install gd-devel

安装 openssl

yum -y install openssl openssl-devel

-y:跳过所有手动确认输入

如果./configure安装成功,只需要再执行两个命令:

make
make install

查看是否安装成功

cd /usr/local/nginx

如果安装成功,则会出现下列目录:

conf  html  logs  sbin

切换到sbin目录

cd /sbin

启动程序

./nginx

常见的错误

在Linux操作系统下搭建Nginx服务器,很多时候会出现不同的错误,在此,我们对搭建过程中出现的错误进行一些总结。主要有这些类型:

防火墙问题,缺少gc++,缺少pcre、zlib等库。

三:Nginx的反向代理和负载均衡

什么是反向代理

我们有时候,用自己的计算机A想访问国外的某个网站B,但是访问不了,此时,有一台中间服务器C可以访问国外的网站B,那么,我们可以用自己的电脑访问服务器C,通过C来访问B这个网站。那么这个时候,服务器C称为代理服务器,这种访问方式叫做正向代理。正向代理有一个特点,就是我们明确知道要访问哪个网站。再如,当我们有一个服务器集中,并且服务器集群中的每台服务器的内容一样的时候,同样我们要直接从个人电脑访问到服务器集中的服务器的时候无法访问,且此时第三方服务器能访问集群,这个时候,我扪通过第三方服务器访问服务器集群的内容,但是此吋我们并不知道是哪一台服务器提供的内容,此时的代理方式称为反向代理。

正向代理

反向代理

什么是负载均衡

当一台服务器的单位时间内的访问量越大的时候,服务器的压力会越大。当一台服务器压力大得超过自身的承受能力的时候,服务器会崩溃。为了避免服务器崩溃,让用户有更好地体验,我们通常通过负载均衡的方式来分担服务器的压力。那么什么是负载均衡呢?是这样,我们可以建立很多很多个服务器,这些服务器组成一个服务器集群,然后,当用户访问我们网站的时候,先访问一个中间服务器,再让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该选择的服务器。这样,用户的每次访问,都会保证服务器集群中的每个服务器的压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。

基于反向代理的原理实现负载均衡

四:Nginx负载均衡的实现

Nginx 是一款可以通过反向代理实现负载均衡的服务器,使用 Nginx 服务实现负载均衡的时候,用户的访问首先会访问到 Nginx 服务器,然后 Nginx 服务器再从服务器集群表中选择压力较小的服务器,然后将该访问请求引向该服务器。若服务器集群中的某个服务器崩溃,那么从待选服务器列表中将该服务器删除,也就是说一个服务器假如崩溃了,那么 Nginx 就肯定不会将访问请求引入该服务器了。那么下面,我们通过实例来讲解一下 Nginx 负载均衡的实现。

负载均衡配置文件

默认配置文件nginx.conf 很重要,我们一般是新建一个配置文件,在启动时指定加载。

[root@yueshutong conf]# ls  //查看目录
fastcgi.conf            koi-win             scgi_params
fastcgi.conf.default    mime.types          scgi_params.default
fastcgi_params          mime.types.default  uwsgi_params
fastcgi_params.default  nginx.conf          uwsgi_params.default
koi-utf                 nginx.conf.default  win-utf
[root@yueshutong conf]# touch fzjh.conf  //新建负载均衡配置文件

编辑fzjh.conf配置文件

vi fzjh.conf
worker_processes  1;#工作进程的个数,一般与计算机的cpu核数一致  

events {
    worker_connections  1024;#单个进程最大连接数(最大连接数=连接数*进程数) 并发
}  

http {
    include       mime.types; #文件扩展名与文件类型映射表
    default_type  application/octet-stream;#默认文件类型  

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

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

    gzip  on;#启用Gizp压缩  

    #服务器的集群
    upstream  myproject {  #服务器集群名字
        server    220.181.111.188:80  weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。
        server    42.121.252.58:80  weight=2;
    }     

    #当前的Nginx的配置
    server {
        listen       80;  #监听80端口,可以改成其他端口
        server_name  localhost; ##############   当前服务的域名  

        location / {  ##配置路径/下实现负载均衡
            proxy_pass http://myproject;  ##对应哪个服务器集群
            proxy_redirect default;
        }  

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
           root   html;  #根目录
        }
    }
}  

我们在nginx目录下执行命令,启动负载均衡

./sbin/nginx -c ./conf/fzjh.conf

然后尝试访问你的服务器,多访问几次,你会发现它会访问2次csdn网站,1次百度。说明我们的负载均衡已经部署完毕。

如何重启Nginx

./sbin/nginx -s reload

如何关闭Nginx服务器

1.查看nginx进程号

ps -ef|grep nginx

2.kill掉进程即可 (1709是第二列的进程号)

kill 1709

或者

killall -9 nginx

五:HTTP Upstream 模块

HTTP Upstream 模块

Upstream 模块是 Nginx 服务器的一个重要模块。 Upstream 模块实现在轮询和客户端 iP 之间实现后端的负载均衡。常用的指令有 ip_hash指令、 server 指令和 upstream 指令等,下面我们分别来讲一下。

Http Upstream模块- ip_hash指令

在负载均衡系统中,假如用户在某台服务器上登录,那么如果该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的一个服务器,那么此时如果将已经登录服务器A的用户再定位到其他服务器,显然不妥。故而,我们可以采用 ip_hash指令解决这个问题,如果客户端请求已经访问了服务器A并登录,那么第二次请求的时候,会将该请求通过哈希算法自动定位到该后端服务器中。下面我们通过实例讲解。

实例

此时不应该使用weight权重。


http {
     ....
    upstream  myproject {
        ip_hash; #实现会话跟踪
        server 140.205.140.234;
        server 61.135.169.125;

    }
   ....
} 

Http Upstream 模块一 upstream 指令及相关变量

upstream 指令主要是用于设置一组可以在 proxy_pass 和 fastcgi_pass 指令中使用代理服务器,默认负载均衡方式为轮询。

六:其他负载均衡实现方式

负载均衡的实现方法除了可以使用 Nginx服务器实现外,还可以通过很多种方法来实现。负载均衡的核心就是建立一个服务器集群,然后用户首先访问到第三方代理服务器,然后由代理服务器选择一个集群中的服务器,然后将请求引入选定的服务器。那么代理服务器可以使用多种方式来充当,故而实现负载均衡的方式也是多种。总的来说,负载均衡实现的方式分为软件实现和硬件实现两种,如果中间的代理机构是硬件,那么就是通过硬件设备来实现负载均衡的方式,如果中间的代理机构为软件,就是软件实现负载均衡的方式。而其中,软件又可以是服务器软件、系统软件以及应用软件等充当。

负载均衡实现方式小结

下面我们简单总结一下负载均衡不同实现方式的优缺点:

假如使用硬件的方式实现负载均衡,那么中间的转发机构就是硬件,这个时候运行的效率非常高,但是对应的成本也非常高。如果我们采用软件的方式来实现负载均衡,那么中间的转发机构就是软件,这个时候,运行效率不如硬件,但是成本相对来说低得多。而使用Nginx服务器实现负载均衡,那么就是通过软件的方式来实现负载均衡,并且 Nginx本身支持高并发等。故而使用 Nginx服务器实现负载均衡,能大大节约企业的成本,并且由于 Nginx是服务器软件,其执行效率也是非常高。

七:location匹配顺序

  1. "="前缀指令匹配,如果匹配成功,则停止其他匹配
  2. 普通字符串指令匹配,顺序是从长到短,匹配成功的location如果使用^~,则停止其他匹配(正则匹配)
  3. 正则表达式指令匹配,按照配置文件里的顺序,成功就停止其他匹配
  4. 如果第三步中有匹配成功,则使用该结果,否则使用第二步结果

注意点

  1. 匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。另外普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。
  2. 一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。

匹配模式及顺序

  location = /uri    =开头表示精确匹配,只有完全匹配上才能生效。

  location ^~ /uri   ^~ 开头对URL路径进行前缀匹配,并且在正则之前。

  location ~ pattern  ~开头表示区分大小写的正则匹配。

  location ~* pattern  ~*开头表示不区分大小写的正则匹配。

  location /uri     不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。

  location /      通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。

八:配置HTTPS

1.获取证书

获得SSL证书文件 1_www.domain.com_bundle.crt 和私钥文件 2_www.domain.com.key

2.证书安装

将域名 www.domain.com 的证书文件1_www.domain.com_bundle.crt 、私钥文件2_www.domain.com.key保存到同一个目录,例如/usr/local/nginx/conf目录下。

3.配置conf

打开nginx.conf文件,找到nginx.conf的下段配置内容:

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.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;
    #    }
    #}

打开注释,修改server_name为绑定证书的域名(如:www.domain.com),修改ssl_certificate 为 1_www.domain.com_bundle.crt,修改 ssl_certificate_key 为 2_www.domain.com.key 即可。

4.HTTP自动跳转HTTPS

对于用户不知道网站可以进行https访问的情况下,让服务器自动把http的请求重定向到https。 在服务器这边的话配置的话,可以在页面里加js脚本,也可以在后端程序里写重定向,当然也可以在web服务器来实现跳转。

Nginx是支持rewrite的(只要在编译的时候没有去掉pcre) 在http的server里增加rewrite ^(.*) https://$host$1 permanent; 这样就可以实现80进来的请求,重定向为https了。

还是在此配置文件中,加入下面一句:

server {
        listen       80;
        server_name  localhost;

        rewrite ^(.*) https://$host$1 permanent;
        ...

Nginx服务器的使用与反向代理负载均衡的更多相关文章

  1. 如何使用Weave以及Docker搭建Nginx反向代理/负载均衡服务器

    Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动 ...

  2. 项目实战2.2—nginx 反向代理负载均衡、动静分离和缓存的实现

    实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备注 nginx VIP:172.17.11.11 反向代理服务器 开启代理功能 设置监控,调度 rs01 RIP ...

  3. Nginx 反向代理 负载均衡 虚拟主机配置

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  4. nginx 详解反向代理负载均衡

    什么是反向代理负载均衡 使用代理服务器可以将请求转发给内部的Web服务器,使用这种加速模式显然可以提升静态网页的访问速度.因此也可以考虑使用这种技术,让代理服务器将请求 均匀转发给多台内部Web服务器 ...

  5. Nginx 反向代理 负载均衡 虚拟主机

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  6. 十.nginx反向代理负载均衡服务实践部署

    期中集群架构-第十章-nginx反向代理负载均衡章节章节====================================================================== 0 ...

  7. 项目实战2.1—nginx 反向代理负载均衡、动静分离和缓存的实现

    总项目流程图,详见 http://www.cnblogs.com/along21/p/8000812.html 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备 ...

  8. 项目实战02:nginx 反向代理负载均衡、动静分离和缓存的实现

    目录 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 2.下载编译安装tengine 3.设置代理服务器的配置文件 4.启动tengine服务 5.开启后端的web服务 6.测试 实验二:ng ...

  9. 【转】Nginx 反向代理 负载均衡 虚拟主机配置

    原文:http://www.cnblogs.com/itdragon/p/8059000.html Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代 ...

随机推荐

  1. 生成器(generator,yield),next,send

    #生成器 def generator(): for i in range(200): yield '哇哈哈%s' %i g = generator() #调用生成数函数,接受作用 ret = g.__ ...

  2. 使用Visual Studio Team Services进行压力和性能测试(一)——创建基础的URL压力测试

    使用Visual Studio Team Services进行压力和性能测试(一)--创建基础的URL压力测试 概述 压力测试使应用程序更加健壮,并审核在用户负载下的行为,这样我们可以在当前的基础设施 ...

  3. Oracle解锁scott用户

    解决: (1)conn sys/sys as sysdba;//以DBA的身份登录 (2)alter user scott account unlock;// 然后解锁 (3)conn scott/t ...

  4. ASP.NET中的参数与特殊类型和特性

    一.可选参数和命名参数        1.可选参数            语法:                [修饰符] 返回类型 方法名(必选参数1...必选参数n,可选参数1...可选参数n)  ...

  5. python爬虫工程师各个阶段需要掌握的技能和知识介绍

    本文主要介绍,想做一个python爬虫工程师,或者也可以说是,如何从零开始,从初级到高级,一步一步,需要掌握哪些知识和技能. 初级爬虫工程师: Web前端的知识:HTML, CSS, JavaScri ...

  6. cve-2017-11882 poc分析

    目录 CVE-2017-11882 poc分析 0x00 工具&实验环境 0x01 分析行为 第一步:观察poc行为 第二步:找出计算器被弹出的地方 0x02 调试定位漏洞触发点 0x03 分 ...

  7. Windows7安装Bitvise开启ssh服务

    Windows7安装Bitvise开启ssh服务 by:铁乐猫 在Liunx和windows10上配置SSH服务是一件很容易的事,毕竟系统己经自带了ssh的服务功能. 不过在windows7上可不容易 ...

  8. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  9. February 21st, 2018 Week 8th Wednesday

    Our life is what our thoughts make it. 我们的思想成就了我们的生活. The mind is everything. What you think, you be ...

  10. C#基础知识之托管代码和非托管代码

    什么是托管代码(managed code)? 托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行.编译器把代码编译成中间语言,当方法被调用时,CLR把具体的 ...