Nginx详解

1、Nginx简介

1.1 什么是Nginx

Nginx(engine x)是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。

Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。

Nginx是免费开源的,同时Nginx也有收费的商业版本,商业版本提供了性能优化、宕机等紧急问题处理等技术支持和服务。

1.2 正向代理和反向代理概念

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

正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。正向代理应用最广泛的就是“科学上网工具”。

综上所述:==正向代理代理对象是客户端,反向代理代理对象是服务端。==

==软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。==

2、Nginx环境搭建

2.1 下载

wget http://nginx.org/download/nginx-1.14.2.tar.gz

2.2 安装

Nginx的安装需要确定Linux安装相关的几个库,否则配置和编译会出现错误,安装的命令为:

yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y

开始安装:

  1. tar -zxvf nginx-1.14.2.tar.gz
  2. cd nginx-1.14.2
  3. ./configure --prefix=/usr/local/nginx(--prefix是指定安装路径)
  4. make
  5. make install

2.3 Nginx常用命令

启动:

  1. 普通启动:cd nginx/sbin/;./nginx
  2. 通过配置文件启动: ./nginx -c /usr/local/nginx/conf/nginx.conf
  3. 查看进程,检查Nginx是否启动:ps -ef | grep nginx

关闭:

  1. kill -QUIT 主pid(这种关闭方式会处理完请求后再关闭)
  2. kill -TERM 主pid(暴力关闭)

重启Nginx:
./nginx -s reload

检查配置文件是否正确:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf –t

3、Nginx配置文件说明

Nginx核心配置文件在/nginx/conf目录下,名字为nginx.conf,内容如下:

#配置worker进程运行用户 nobody也是一个linux用户,一般用于启动程序,没有密码
user  nobody;  
#配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
worker_processes  1;  

#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log  logs/error.log;  
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;  #配置进程pid文件 


###====================================================


#配置工作模式和连接数
events {
    worker_connections  1024;  #配置每个worker进程连接数上限,nginx支持的总连接数就等于worker_processes * worker_connections
}

###===================================================


#配置http服务器,利用它的反向代理功能提供负载均衡支持
http {
    #配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
    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日志及存放路径,并使用上面定义的main日志格式
    #access_log  logs/access.log  main;

    sendfile        on;  #开启高效文件传输模式
    #tcp_nopush     on;  #防止网络阻塞

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

    #gzip  on;  #开启gzip压缩输出
    
    ###-----------------------------------------------
    

    #配置虚拟主机,可以有多个
    server {
        listen       80;  #配置监听端口
        server_name  localhost;  #配置服务名

        #charset koi8-r;  #配置字符集

        #access_log  logs/host.access.log  main;  #配置本虚拟主机的访问日志

    #默认的匹配斜杠/的请求,当访问路径中有斜杠/,会被该location匹配到并进行处理
        location / {
        #root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
            root   html;  
        #配置首页文件的名称
            index  index.html index.htm;  
        }       

        #error_page  404              /404.html;  #配置404页面
        # redirect server error pages to the static page /50x.html
        #error_page   500 502 503 504  /50x.html;  #配置50x错误页面
        
    #精确匹配
    location = /50x.html {
            root   html;
        }

        #PHP 脚本请求全部转发到Apache处理
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        #PHP 脚本请求全部转发到FastCGI处理
        # 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;
        #}

        #禁止访问 .htaccess 文件
        # 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服务,安全的网络传输协议,加密传输,端口443,运维来配置
    #
    # 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;
    #    }
    #}
}

4、Nginx主要应用

4.1 静态网站部署

Nginx是一个HTTP的web服务器,可以将服务器上的静态文件(如HTML、图片等)通过HTTP协议返回给浏览器客户端。

假设要将一个静态网站ace部署到Nginx服务器上:

  1. 将ace上传到linux的/opt/static目录下
  2. 修改nginx.conf配置文件:
//在server中,通过location匹配访问的路径,然后转发给静态资源
location / {
    root html;
    root /opt/static/ace;
    index index.html index.htm;
}

location /ace { //这里接受/ace请求,去/opt/static下找资源
    root /opt/static;
    index index.html index.htm;
}
  1. 重启nginx
  2. 在浏览器中输入http://localhost:80/ace进行访问

location中配置路径讲解:

规则:==ip + port 等于 root==,假设server的配置如下:

server {  
    listen 80; #端口号  
    location / {  
        root /opt/static/ace; #静态文件路径
    }  
}

替换:

http://localhost:80/ = root = /opt/static/ace

http://localhost:80/ace = root/ace = /opt/static/ace/ace

4.2 负载均衡

在网站创立初期,我们一般都使用单台机器对外提供集中式服务。随着业务量的增大,我们一台服务器不够用,此时就会把多台机器组成一个集群对外提供服务,但是,我们网站对外提供的访问入口通常只有一个,比如 www.web.com。那么当用户在浏览器输入www.web.com进行访问的时候,如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡要做的事情。

负载均衡通常是指将请求"均匀"分摊到集群中多个服务器节点上执行,这里的均匀是指在一个比较大的统计范围内是基本均匀的,并不是完全均匀。

Nginx负载均衡

Nginx通过在nginx.conf文件进行配置即可实现负载均衡

原理图

负载均衡.png

配置如下:

  1. 在http模块内加上upstream配置
    upstream myweb {
        server  127.0.0.1:9100 weight=5;#这里可以是一个端口号为9100的tomcat
        server  127.0.0.1:9200 weight=2;#同上
    }

其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多。

upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且==它还能对后端的服务器的健康状态进行检查==,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器。

  1. 在server模块里添加location,并配置proxy_pass
    location /myweb {
        proxy_pass http://myweb;
    }

==其中myweb字符串要和upstream后面的字符串相等==。

==Nginx常用负载均衡策略:==

  1. 轮询(默认)
upstream backserver { 
        server 127.0.0.1:8080; 
        server 127.0.0.1:9090; 
} 

==注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。==

  1. 权重
upstream backserver { 
        server 192.168.0.14 weight=5; 
        server 192.168.0.15 weight=2; 
} 

每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况。

  1. ip_hash
upstream backserver { 
        ip_hash; 
        server 127.0.0.1:8080; 
        server 127.0.0.1:9090; 
}

==ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题。==

  1. 最少连接
upstream backserver { 
        least_conn;
        server 127.0.0.1:8080; 
        server 127.0.0.1:9090; 
}   

web请求会被转发到连接数最少的服务器上

4.3 静态代理

把所有静态资源的访问改为访问nginx,而不是访问tomcat,这种方式叫静态代理。因为nginx更擅长于静态资源的处理,性能更好,效率更高。

所以在实际应用中,我们将静态资源比如图片、css、html、js等交给nginx处理,而不是由tomcat处理。


静态代理.png

Nginx静态代理实现方式

  1. 在nginx.conf的location中配置静态资源的后缀。例如:当访问静态资源,从linux服务器/opt/static目录下获取。
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid
|doc|ppt|pdf|xls|mp3|wma)$ {
        root /opt/static;
}

说明:

  • ~表示正则匹配,也就是说后面的内容可以是正则表达式匹配。
  • 第一个点 . 表示任意字符。
  • *表示一个或多个字符。
  • . 是转移字符,是后面这个点的转移字符。
  • | 表示或者。
  • $ 表示结尾。
  1. 在nginx.conf的location中配置静态资源所在目录。例如当访问静态资源,则从linux服务器/opt/static目录下获取。
location ~ .*/(css|js|img|images) {
        root   /opt/static;
}
xxx/css
xxx/js
xxx/img
xxx/images

我们将静态资源放入 /opt/static 目录下,然后用户访问时由nginx返回这些静态资源。

4.4 动静分离

Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。
动态资源,如jsp由tomcat或其他web服务器完成。
静态资源,如图片、css、js等由nginx服务器完成。
它们各司其职,专注于做自己擅长的事情。
动静分离充分利用了它们各自的优势,从而达到更高效合理的架构。

架构图.png

整个架构中,一个nginx负责负载均衡,两个nginx负责静态代理。Nginx在一台Linux上安装一份,可以启动多个Nginx,每个Nginx的配置文件不一样即可。

4.5 虚拟主机

虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,这样我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。
Nginx提供虚拟主机的功能,就是为了让我们不需要安装多个Nginx,就可以运行多个域名不同的网站。
Nginx下,一个server标签就是一个虚拟主机。nginx的虚拟主机就是通过nginx.conf中server节点指定的,想要设置多个虚拟主机,配置多个server节点即可;

配置虚拟主机方式

  1. 基于端口的虚拟主机
    基于端口的虚拟主机配置,使用端口来区分。
    浏览器使用 同一个域名+端口 或 同一个ip地址+端口访问;
    server {
            listen 8080;
            server_name www.myweb.com;
            location /myweb {
                proxy_pass http://www.myweb.com;
            }
    }
    server {
            listen 9090;
            server_name www.myweb.com;
            location /p2p {
                proxy_pass http://www.p2p.com;
            }
    }
  1. 基于域名的虚拟主机
    基于域名的虚拟主机是最常见的一种虚拟主机。
   server {
        listen       80;
        server_name  www.myweb.com;
        location /myweb {
           proxy_pass http://www. myweb.com;
        }
    }
    server {
        listen       80;
        server_name  www.p2p.com;
        location /myweb {
           proxy_pass http://www.p2p.com;
        }
    }

需要修改一下本地的hosts文件,在hosts文件中配置:
本机ip www.myweb.com
本机ip www.p2p.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,...
    WickJohn阅读 620评论 0 1
  • 基于域名的配置(核心配置如下) nginx的多server规范使用 nginx的主配置文件为/usr/local/...
    CaptainWhite阅读 255评论 0 0
  • Nginx 是一个高性能的Http和反向代理web服务器。它可以作为静态资源服务器,反向代理服务器,也可以用作负载...
    逝去丶浅秋阅读 601评论 0 3
  • 本文为看视频《Nginx入门到实践》总结的学习笔记。 一、服务器基础配置 远程链接服务器 默认的用户名是root,...
    solocoder阅读 4,401评论 1 0
  • nginx详解 一、什么是正向代理和反向代理? 正向代理image反向代理image URI、URL和URN: U...
    Jerry_Liang阅读 772评论 0 6