Nginx简介

Nginx简介

什么是Nginx

Nginx是一个高性能的HTTP和反向代理web服务器。基于C语言开发。具有高可靠、低内存消耗耗、高扩展性、支持高并发、热部署,更自由的协议的特点,同时负载均衡、反向代理、动静分离的特性使得nginx成为现在最受欢迎的服务器。

反向代理

在了解反向代理之前,我们先了解下与之相对的正向代理:
正向代理:为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。在这种情况下,最终用户知道代理服务器和原始服务器的存在,只是处于某种原因,无法直接访问原始服务器。(类似科学上网)
反向代理:反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。且不需要做任何设置。在这种情况下,最终用户不知道原始服务器的存在,并认为反代理服务器就是目标服务器。

负载均衡

Load Balance ,简单来说是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行以解决高性能,单点故障(高可用),扩展性(水平伸缩)等高流量下常见的问题。

动静分离

Nginx将客户端请求进行分类转发,静态资源请求(html、图片、css等文件)由静态资源服务器进行处理,动态资源(jsp、servlet等)由动态服务器进行处理。改变之前由动态服务器处理两种请求的方式,减轻了动态服务器的负担,提高了整体性能。

常用命令

启动命令(执行sbin下的nginx)

1.普通启动(加载默认的nginx.conf文件)

./nginx

2.指定要加载的配置文件

./nginx -c [配置文件路径]

3.指定master进程pid保存到的文件

 #注意分号一定要带
./nginx -g "pid [pid文件路径];"

停止命令

1.通过发送信号量停止
语法:kill [信号量类型] [进程编号]
①从容停止:kill -quit [master进程编号];允许Nginx将当前正在处理的网络请求处理完,但不再接受新的请求。
②快速停止:kill -term [master进程编号];立即停止当前正在处理的所有网络请求。
③强制停止:kill -9 [进程编号];需要分别停止master和worker进程。
2.通过./nginx命令停止
./nginx -s stop

重新加载

如果修改了conf文件,在重新加载之前,需要验证配置文件是否存在语法问题:./nginx -t;
1.通过nginx命令重新加载

./nginx -s reload

2.如果是通过启动命令3启动的

./nginx -g "pid [pid文件];" -s reload

3.通过信号量

kill -hup [master进程编号]

配置文件nginx.conf简析

nginx.conf文件组成:
|-main:配置进程、权限及错误日志等信息
|-events:配置IO模型,如epoll、kquque、select等
|-http:控制nginx中的http进程
|-邮件模块
|-第三方模块
1.main模块

#设置worker进程归属 用户 用户组
#user  nobody;
#设置worker进程数 根据服务器硬件(cpu核数)来设置
#一般为cpu总核数或总核数的两倍
worker_processes  1;
#错误日志保存位置及日志级别
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#master进程pid保存位置
#pid        logs/nginx.pid;

2.events模块

events {
    #一个worker进程能处理的连接数
    worker_connections  1024;
    #accept_mutex on;
    #多个Worker将以串行方式来处理,当请求到来时,其中有一个Worker会被唤醒,
    #其他的Worker继续保持休眠状态防止多个线程连接的争抢,解决”惊群“问题,
    #但同时也会造成worker压力不均的问题。况且,nginx的worker_process数量并不多,所以建议关闭
    #是否允许同时接收多个网络连接
	multi_accept on;  
	#设置io模型,以哪种事件驱动处理网络请求
	use epoll;
}

3.http模块

http {
    #请求头配置 在'mime.type'文件中找不到'文件'映射的'type'时'采用'默认的'default_type'
    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  替换read()和write()调用,减少系统上下文切换从而提高性能,
#当 nginx 是静态文件服务器时,能极大提高nginx的性能表现
    sendfile        on;
    #tcp_nopush     on;
    
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
#每个server对应一个服务
    server {
    #端口号
        listen       80;
        #服务名
        server_name  localhost;

        #charset koi8-r;
        #虚拟主机对应的资源路径
        #root [路径];
        #access_log  logs/host.access.log  main;
        #代理规则 location /uri表达式
        location / {
        #文件路径
            root   html;
            #文件名
            index  index.html index.htm;
        } 
        #
        #错误号对应的错误页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
}

location匹配规则

location会尝试根据用户请求中的URI来匹配/uri表达式,如果可以匹配,就会选择location{}块中的配置来处理用户请求。其匹配方式分为以下主要几种:
正则匹配:① ~ 表示执行一个正则匹配,区分大小写
② ~* 执行一个正则匹配,不区分大小写。
普通匹配:①= 进行普通字符精确匹配
② 什么都不加的普通匹配
示例

location /demo {#普通匹配
	root html;
	index index.html;
}
location =/demo{#精准匹配
	root html;
	index index1.html;
}
location ~* \.(gif|css|js|jpg|png)${//正则匹配
root html/images;
}

匹配的优先级

1)精确匹配优先级最高,当命中规则时停止匹配并返回结果
2)其次执行普通匹配,记录最长的命中结果,但不返回。
3)执行正则匹配,按照顺序进行判断,如果命中则立即返回结果,如果没有,就返回普通匹配的命中结果

location 代理规则

当我们发送一个http:[nginxIp]:[nginxPort]/proxy/index.html到Nginx时,
如果配置为

location /proxy/{
  proxy_pass http://[realIp]:[realPort]/;
}

请求会被代理到htttp://[realIp]:[realProt]/index.html;
配置情况2:

location /proxy/{
  proxy_pass http://[realIp]:[realPort];
}

请求会被代理到htttp://[realIp]:[realProt]/proxy/index.html;
配置情况3

location /proxy/{
  proxy_pass http://[realIp]:[realPort]/[realUri]/;
}

请求会被代理到htttp://[realIp]:[realProt]/[realUri]/index.html;
配置情况4

location /proxy/{
  proxy_pass http://[realIp]:[realPort]/[realUri];
}

请求会被代理到htttp://[realIp]:[realProt]/[realUri]index.html;
因此,我们可以得出结论:当proxy_pass配置的url结尾带’/'时,proxy会被替换为设置的contextPath,然后追加后面的内容;如果不带‘/’,且结束的最后一个值时端口号时,/proxy/index.html直接被追加,如果是contextPath,则直接拼接/index.html。
  其次,也可以通过rewrite regex replacement [flag];进行进一步设置。
  rewrite结合正则表达式和标志位实现url重写以及重定向,只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。
  rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
    1.执行server块的rewrite指令
    2.执行location匹配
    3.执行选定的location中的rewrite指令
  如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。

  flag标志位
    last : 相当于Apache的[L]标记,表示完成rewrite
    break : 停止执行当前虚拟主机的后续rewrite指令集
    redirect : 返回302临时重定向,地址栏会显示跳转后的地址
    permanent : 返回301永久重定向,地址栏会显示跳转后的地址

  last一般写在server和if中,而break一般使用在location中
  last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
  break和last都能组织继续执行后面的rewrite指令
示例:请求为http://127.0.0.1:80/proxy/real/inex

location /proxy/{
    proxy_pass http:///ip:port
    rewrite ^/proxy/(.*)$ /$1 break;
}

会被转发到http://ip:port/real/index$1指规则中第一个匹配组的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值