标签搜索

目 录CONTENT

文章目录

Nginx简单的配置和使用

小小城
2021-08-19 / 0 评论 / 0 点赞 / 8 阅读 / 10,172 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Nginx简单的配置和使用

[toc]

一、nginx概述

  1. Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。

  2. Nginx服务器的反向代理服务是其最常用的重要功能,由反向代理服务也可以衍生出很多与此相关的Nginx服务器重要功能,比如nginx的负载均衡。经常听人说到一些术语,如反向代理,那么什么是代理,什么是是正向代理呢?什么又是反向代理呢?

二、什么是代理?

  1. 说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店;客人到vivo专卖店买了一部手机,这个专卖店就是代理,被代理角色就是手机厂家,目标角色就是用户。
  2. 在Java设计模式中,代理模式是这样定义的:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。

三、什么是正向代理?

  1. 首先我们来了解一下什么事VPN:VPN 通俗的讲就是一种中转服务,当我们电脑接入 VPN 后,我们对外 IP地址就会变成VPN服务器的公网IP,我们请求或接受任何数据都会通过这个VPN服务器后传入到我们本机。那么这样做有什么好处呢?VPN利用低成本的公共网络作为企业骨干网,同时又克服了公共网络缺乏保密性的弱点,在VPN网络中,位于公共网络两端的网络在公共网络上传输信息时,其信息都是经过安全处理的,可以保证数据的完整性、真实性和私有性。

  2. 这里的 VPN 就是做正向代理的。正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。

四、什么是反向代理?

  1. 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

  2. 反向代理和正向代理的区别就是:正向代理代理的是客户端,反向代理代理的是服务器。

五、NGINX的反向代理

  1. 案例:使用 nginx 反向代理 http://wangbin.cloud/ 直接跳转到http://wangbin.cloud:8080

  2. 在 nginx.conf 配置文件中增加如下配置:

server {
    listen       80;
    server_name  wangbin.cloud;

    location / {
        proxy_pass http://wangbin.cloud:8080;
        index  index.html index.htm index.jsp;
    }
}
  1. 如上配置,我们监听80端口,访问域名为wangbin.cloud,不加端口号时默认为80端口,故访问该域名时会跳转到wangbin.cloud:8080路径上。

六、Nginx的命令

  1. 启动
./nginx
  1. 暂停
./nginx  -s stop
  1. 重启
./nginx -s reload

七、nginx配置

  1. nginx是一个功能非常强大的web服务器加反向代理服务器,同时也能作为邮件服务器等
  2. 在项目使用中,使用最多的三个核心功能是反向代理、负载均衡和静态服务器
  3. 这三个不同的功能的使用,都跟nginx的配置密切相关,nginx服务器的配置信息主要集中在nginx.conf这个配置文件中,并且所有的可配置选项大致分为以下几个部分
main                                # 全局配置
events {                            # nginx工作模式配置

}
http {                                # http设置
....
server {                        # 服务器主机配置
    ....
    location {                    # 路由配置
        ....
    }
    location path {
        ....
    }
    location otherpath {
        ....
    }
}
server {
    ....

    location {
        ....
    }
}
upstream name {                    # 负载均衡配置
    ....
}
}
如上述配置文件所示,主要由6个部分组成:

1、main:用于进行nginx全局信息的配置

2、events:用于nginx工作模式的配置

3、http:用于进行http协议信息的一些配置

4、server:用于进行服务器访问信息的配置

5、location:用于进行访问路由的配置

6、upstream:用于进行负载均衡的配置
  1. main模块
# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
  • user用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
  • worker_processes指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
  • error_log定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
  • pid用来指定进程id的存储文件的位置
  • worker_rlimit_nofile用于指定一个进程可以打开最多文件数量的描述
  1. event 模块
event {
	worker_connections 1024;
	multi_accept on;
	use epoll;
}
  • worker_connections 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。

  • multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接

  • use epoll 配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使Kqueue

  1. http模块
  • 作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!这里不做介绍。
  1. server模块
  • srever模块配置是http模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。
server {
	listen        80;
	server_name localhost    192.168.1.100;
	root        /nginx/www;
	index        index.php index.html index.html;
	charset        utf-8;
	access_log    logs/access.log;
	error_log    logs/error.log;
	......
}
  • server:一个虚拟主机的配置,一个http中可以配置多个server

  • server_name:用力啊指定ip地址或者域名,多个配置之间用空格分隔

  • root:表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录

  • index:用户访问web网站时的全局首页

  • charset:用于设置www/路径中配置的网页的默认编码格式

  • access_log:用于指定该虚拟主机服务器中的访问记录日志存放路径

  • error_log:用于指定该虚拟主机服务器中访问错误日志的存放路径

  1. location模块
  • location模块是nginx配置中出现最多的一个配置,主要用于配置路由访问信息

  • 在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以location模块也是一个非常重要的配置模块

  • 基本配置

location / {
	root    /nginx/www;
	index    index.php index.html index.htm;
    }
  • location /:表示匹配访问根目录

  • root:用于指定访问根目录时,访问虚拟主机的web目录

  • index:在不指定访问具体资源时,默认展示的资源文件列表

  1. 反向代理配置方式
  • 通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化
	location / {
        proxy_pass http://127.0.0.1:8080;
        index  index.html index.htm index.jsp;
    }

八、Nginx 反向代理相关指令介绍

①、listen   该指令用于配置网络监听。主要有如下三种配置语法结构:

  1. 配置监听的IP地址
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]
    [accept_filter=filter] [bind] [ssl];
  1. 配置监听端口
listen port[default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ipv6only=on|off] [ssl];
  1. 配置 UNIX Domain Socket
listen unix:path [default_server]  [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ssl];
  1. 上面的配置看似比较复杂,其实使用起来是比较简单的:
1 listen *:80 | *:8080 #监听所有80端口和8080端口

2 listen IP_address:port #监听指定的地址和端口号

3 listen IP_address #监听指定ip地址所有端口

4 listen port #监听该端口的所有IP连接

  下面分别解释每个选项的具体含义:

  1、address:IP地址,如果是 IPV6地址,需要使用中括号[] 括起来,比如[fe80::1]等。

  2、port:端口号,如果只定义了IP地址,没有定义端口号,那么就使用80端口。

  3、path:socket文件路径,如 var/run/nginx.sock等。

  4、default_server:标识符,将此虚拟主机设置为 address:port 的默认主机。(在 nginx-0.8.21 之前使用的是 default 指令)

  5、 setfib=number:Nginx-0.8.44 中使用这个变量监听 socket 关联路由表,目前只对 FreeBSD 起作用,不常用。

  6、backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在 FreeBSD 中默认为 -1,其他平台默认为511.

  7、rcvbuf=size:设置监听socket接收缓存区大小。

  8、sndbuf=size:设置监听socket发送缓存区大小。

  9、deferred:标识符,将accept()设置为Deferred模式。

  10、accept_filter=filter:设置监听端口对所有请求进行过滤,被过滤的内容不能被接收和处理,本指令只在 FreeBSD 和 NetBSD 5.0+ 平台下有效。filter 可以设置为 dataready 或 httpready 。

  11、bind:标识符,使用独立的bind() 处理此address:port,一般情况下,对于端口相同而IP地址不同的多个连接,Nginx 服务器将只使用一个监听指令,并使用 bind() 处理端口相同的所有连接。

  12、ssl:标识符,设置会话连接使用 SSL模式进行,此标识符和Nginx服务器提供的 HTTPS 服务有关。

②、server_name

  1. 该指令用于虚拟主机的配置。通常分为以下两种:
  • 基于名称的虚拟主机配置
  语法格式如下:

     server_name   name ...;
  对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字由两段或者三段组成,每段之间用“.”隔开。

    server_name 123.com www.123.com
  可以使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。

    server_name *.123.com www.123.*
  还可以使用正则表达式,用“~”作为正则表达式字符串的开始标记。

    server_name ~^www\d+\.123\.com$;
  该表达式“~”表示匹配正则表达式,以www开头(“^”表示开头),紧跟着一个0~9之间的数字,在紧跟“.123.co”,最后跟着“m”($表示结尾)

  以上匹配的顺序优先级如下:

   ①、准确匹配 server_name

   ②、通配符在开始时匹配 server_name 成功

   ③、通配符在结尾时匹配 server_name 成功

   ④、正则表达式匹配 server_name 成功
  • 基于 IP 地址的虚拟主机配置
  语法结构和基于域名匹配一样,而且不需要考虑通配符和正则表达式的问题。

   server_name 192.168.1.1

③、location

  1. 该指令用于匹配 URL。
  语法如下:

 location [ = | ~ | ~* | ^~] uri {

}
  1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

  2、~:用于表示 uri 包含正则表达式,并且区分大小写。

  3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。

  4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

  注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

④、proxy_pass

  1. 该指令用于设置被代理服务器的地址。可以是主机名称、IP地址加端口号的形式。
  语法结构如下:

proxy_pass URL;

  URL 为被代理服务器的地址,可以包含传输协议、主机名称或IP地址加端口号,URI等。

proxy_pass  http://www.123.com/uri;

⑤、index

  1. 该指令用于设置网站的默认首页。
  语法为:

index  filename ...;
  后面的文件名称可以有多个,中间用空格隔开。

index  index.html index.jsp;

九、样例

##代码块中的events、http、server、location、upstream等都是块配置项

##块配置项可以嵌套。内层块直接继承外层快,例如:server块里的任意配置都是基于http块里的已有配置的

##Nginx worker进程运行的用户及用户组
#语法:user username[groupname]    默认:user nobody nobody
#user用于设置master进程启动后,fork出的worker进程运行在那个用户和用户组下。当按照"user username;"设置时,用户组名与用户名相同。
#若用户在configure命令执行时,使用了参数--user=usergroup 和 --group=groupname,此时nginx.conf将使用参数中指定的用户和用户组。
#user  nobody;

##Nginx worker进程个数:其数量直接影响性能。
#每个worker进程都是单线程的进程,他们会调用各个模块以实现多种多样的功能。如果这些模块不会出现阻塞式的调用,那么,有多少CPU内核就应该配置多少个进程,反之,有可能出现阻塞式调用,那么,需要配置稍多一些的worker进程。
worker_processes  1;

##ssl硬件加速。
#用户可以用OpneSSL提供的命令来查看是否有ssl硬件加速设备:openssl engine -t
#ssl_engine device;

##守护进程(daemon)。是脱离终端在后台允许的进程。它脱离终端是为了避免进程执行过程中的信息在任何终端上显示。这样一来,进程也不会被任何终端所产生的信息所打断。##
##关闭守护进程的模式,之所以提供这种模式,是为了放便跟踪调试nginx,毕竟用gdb调试进程时最繁琐的就是如何继续跟进fork出的子进程了。##
##如果用off关闭了master_proccess方式,就不会fork出worker子进程来处理请求,而是用master进程自身来处理请求
#daemon off;   #查看是否以守护进程的方式运行Nginx 默认是on
#master_process off; #是否以master/worker方式工作 默认是on

##error日志的设置#
#语法: error_log /path/file level;
#默认: error_log / log/error.log error;
#当path/file 的值为 /dev/null时,这样就不会输出任何日志了,这也是关闭error日志的唯一手段;
#leve的取值范围是debug、info、notice、warn、error、crit、alert、emerg从左至右级别依次增大。
#当level的级别为error时,error、crit、alert、emerg级别的日志就都会输出。大于等于该级别会输出,小于该级别的不会输出。
#如果设定的日志级别是debug,则会输出所有的日志,这一数据量会很大,需要预先确保/path/file所在的磁盘有足够的磁盘空间。级别设定到debug,必须在configure时加入 --with-debug配置项。
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

##pid文件(master进程ID的pid文件存放路径)的路径
#pid        logs/nginx.pid;


events {
	#仅对指定的客户端输出debug级别的日志:	语法:debug_connection[IP|CIDR]
	#这个设置项实际上属于事件类配置,因此必须放在events{……}中才会生效。它的值可以是IP地址或者是CIRD地址。
	#debug_connection 10.224.66.14;  
	#或是debug_connection 10.224.57.0/24
	#这样,仅仅以上IP地址的请求才会输出debug级别的日志,其他请求仍然沿用error_log中配置的日志级别。
	#注意:在使用debug_connection前,需确保在执行configure时已经加入了--with-debug参数,否则不会生效。
    	worker_connections  1024;
}

##核心转储(coredump):在Linux系统中,当进程发生错误或收到信号而终止时,系统会将进程执行时的内存内容(核心映像)写入一个文件(core文件),以作为调试只用,这就是所谓的核心转储(coredump).

http {
    ##嵌入其他配置文件 语法:include /path/file
    #参数既可以是绝对路径也可以是相对路径(相对于Nginx的配置目录,即nginx.conf所在的目录)
    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;
    upstream halo {
        server 127.0.0.1:8090;
    }

    server {
        ##listen监听的端口
	#语法:listen address:port [ default(deprecated in 0.8.21) | default_server | [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ] ]
	#default_server: 如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块
        listen       8080;
        listen       [::]:8080;

	#主机名称:其后可以跟多个主机名称,开始处理一个HTTP请求时,nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由那一个server来处理这个请求。有可能一个Host与多个server块中的server_name都匹配,这时会根据匹配优先级来选择实际处理的server块。server_name与Host的匹配优先级见文末。
        server_name  localhost;
        client_max_body_size 1024m;

	#charset koi8-r;

	#access_log  logs/host.access.log  main;

	#location / {
	#    root   html;
	#    index  index.html index.htm;
	#}

	##location 语法: location [=|~|~*|^~] /uri/ { ... }
	# location的使用实例见文末。
	#注意:location时有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会被第一个location处理。
        location / {
            proxy_pass http://10.12.199.75:8090;
            proxy_set_header HOST $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

	#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;
	#}
    }



    # 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 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;
    #    }
    #}

}
0

评论区