Nginx配置使用

Nginx 4个主要功能:

1.作为Web服务器,配置HTML/css/js地址后,为客户端web请求提供前端(静态)页面响应

2.用upstream功能做反向代理,转发客户端请求到后端, 隐藏后端服务器地址,附带负载均衡功能

3.用proxy_pass功能做代理服务器,转发web请求到特定的URL(纯转发请求,正向代理)

4.域名映射

0. Nginx部署

docker run -p 80:80 --name ngx_demo -d nginx
docker exec -it nginx bash
apt-get install vim
vi etc/nginx/nginx.conf 编辑config文件
nginx -s reload 重载config文件以生效

1. Nginx.conf文件属性

https://www.nginx.cn/doc/index.html

Nginx配置使用_第1张图片

##代码块中的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  auto;
worker_processes  auto;
#Nginx启动后有一个master不处理请求,只负责接收请求并分发给worker, worker数最好设置为1或者和CPU核心数一致, 也可以使用auto让nginx自行分配
 
##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 warn;
#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;
}
#worker_connections是一个worker_process能接收的最大连接数
#nginx作为http服务器的时候:max_clients = worker_processes * worker_connections(只处理前端请求)
#nginx作为反向代理服务器的时候:max_clients = worker_processes * worker_connections/2(保持前后端连接)
 
##核心转储(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;
 
    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;
 
#主机名称:其后可以跟多个主机名称,开始处理一个HTTP请求时,nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由那一个server来处理这个请求。有可能一个Host与多个server块中的server_name都匹配,这时会根据匹配优先级来选择实际处理的server块。server_name与Host的匹配优先级见文末。
	 server_name  localhost;
 
        #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://192.168.1.60;
        }
 
        #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;
    #    }
    #}
 
}

conf配置文件中可用的内置变量:

配置变量
Nginx配置文件支持使用变量,可以使用内置变量或自定义变量。用户自定义变量语法:set var_name value;http核心模块的内置变量(http://nginx.org/en/docs/varindex.html),主要有如下:

$uri:当前请求的uri,不带参数

$request_uri:请求的uri,带完整参数

$host:http请求报文中host首部;如果请求中没有host首部,则以处理此请求的主机的主机名代替

$hostname:nginx服务运行所在主机的主机名

$remote_addr:客户端IP

$remote_port: 客户端port

$remote_user:使用用户认证时客户端用户输入的用户名

$request_filename:用户请求中的URI经过本地root或alias转换后映射的本地的文件路径

$request_method:请求方法

$server_addr:服务器地址

$server_name: 服务器名称

$server_port:服务器端口

$server_protocol:服务器向客户端发送响应时的协议,如http/1.1,http/1.0

$scheme:在请求中使用的scheme 映射协议本身的协议

$http_HEADER:匹配请求报文中指定的HEADER,$http_host匹配请求报文中的host首部

$sent_http_HEADER:匹配响应报文中指定的HERDER,例如$http_content_type匹配相应报文中的content-type首部

$document_root:当前请求映射到的root配置

2. Nginx操作命令

要启动nginx,命令: nginx

-c 为 Nginx 指定一个配置文件,来代替缺省的。
-t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
-v 显示 nginx 的版本。
-V 显示 nginx 的版本,编译器版本和配置参数。
-s 当nginx启动后,可以通过使用-s参数调用可执行文件来控制它。 使用以下语法:
nginx -s signal
信号(signal)的值可能是以下之一:
stop - 快速关闭服务
quit - 正常关闭服务
reload - 重新加载配置文件(修改conf文件后,使用reload会自动检测conf语法,如果正确会加载新的配置文件并重启nginx)
reopen - 重新打开日志文件

Nginx详解参考文档

Nginx功能实例

1. 将公司内部域名映射到前端应用地址

server {
	server_name maidanxia.com
	location / {
		proxy_pass http://172.168.10.100:8089;
		}
}

maidanxia.com 为公司内部为这个应用分配的域名,需要唯一, 并且好像不能带www.
http://172.168.10.100:8089 为前端应用(例如vue.js项目)的入口(部署服务器地址:端口)
如果不加listen, 默认listen 80端口,

2. 做正向代理服务器

#比较基本的配置方式
server {
        ##代理日志配置 off 表示关闭日志输出
        ##access_log /home/bingchenglin/logs/nginx/access.log;
        ##文件路径可用于监控代理的接入情况
        access_log off;
        ##配置服务端口
        listen 8090;                    
        location / {
                ##DNS地址 多个DNS地址用空格隔开
                resolver 192.168.241.2;
                ##环境变量通配一般不改
                proxy_pass $scheme://$http_host$request_uri;
                proxy_buffers   256 4k;                         
                proxy_max_temp_file_size 0k;                        
        } 
}

3. 提供静态页面的请求功能–web服务器

server {
	listen 8080;
	location / {
		root /home/webapp/index.html;
	}
	location /images/ {
		root /home/webapp/images.html;
	}

需要将静态页面文件先放到nginx服务器的某个地址存放,等待请求

4. Nginx负载均衡Upstream反向代理功能

1、轮询(weight=1)

默认选项,当weight不指定时,各服务器weight相同,
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream bakend {
server 192.168.1.10;
server 192.168.1.11;
}

(bakend是这个upstream的名字,需要写入location里面的proxy_pass后面)

2、权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
如果后端服务器down掉,能自动剔除。
比如以下配置,则1.11服务器的访问量为1.10服务器的两倍。

upstream bakend {
server 192.168.1.10 weight=1;
server 192.168.1.11 weight=2;
}

3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题。
如果后端服务器down掉,要手工down掉。

upstream resinserver{
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}

4、fair(第三方插件)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream resinserver{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
fair;
}

5、url_hash(第三方插件)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时比较有效。
在upstream中加入hash语句,hash_method是使用的hash算法。

upstream resinserver{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
hash $request_uri;
hash_method crc32;
}

设备的状态有:
1、down 表示单前的server暂时不参与负载
2、weight 权重,默认为1。 weight越大,负载的权重就越大。
3、max_fails 允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4、fail_timeout max_fails次失败后,暂停的时间。
5、backup 备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

下面来看一个负载均衡实例:

upstream tel_img_stream {
#ip_hash;
server 192.168.11.68:20201;
server 192.168.11.69:20201 weight=100 down;
server 192.168.11.70:20201 weight=100;
server 192.168.11.71:20201 weight=100 backup;
server 192.168.11.72:20201 weight=100 max_fails=3 fail_timeout=30s;
}

说明:
1)、down 表示当前的server暂时不参与负载
2)、weight 默认为1.weight越大,负载的权重就越大。
3)、backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
4)、上例中192.168.11.72:20201 设置最大失败次数为 3,也就是最多进行 3 次尝试,且超时时间为 30秒。max_fails 的默认值为 1,fail_timeout 的默认值是 10s。
注意,当upstream中只有一个 server 时,max_fails 和 fail_timeout 参数可能不会起作用。
weight\backup 不能和 ip_hash 关键字一起使用。

参考文档

最后在需要使用负载均衡的server中增加 proxy_pass http://tel_img_stream/;

server {
	server_name maidanxia.com
	location / {
		proxy_pass http://tel_img_stream/;
		}
}

真实案例:

location /typesetting/api/ {
                       proxy_redirect off;
                       proxy_set_header X-Real-IP $remote_addr;
                       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                       proxy_set_header X-Forwarded-Proto $scheme;
                       proxy_set_header Host $http_host;
                       proxy_set_header X-NginX-Proxy true;
                       proxy_http_version 1.1;
                       proxy_cache_key sfs$request_uri$scheme;
                       proxy_pass http://content-typesetting-fe-${ENV}/;
             }

upstream content-typesetting-fe-dev {
    server 172.16.6.150:12315;
}
upstream content-typesetting-fe-test {
    server 172.16.2.207:12315;
    server 172.16.2.209:12315;
}
upstream content-typesetting-fe-show {
    server 172.16.3.59:12315;
    server 172.16.3.60:12315;
}
upstream content-typesetting-fe-prod {
    server 172.16.1.9:12315;
    server 172.16.1.10:12315;
}

灰度发布:

1.按权重分配流量
更新前:
upstream tomcat {
server 192.168.11.68:20201 weight=25;
server 192.168.11.69:20201 weight=25;
server 192.168.11.70:20201 weight=25;
server 192.168.11.71:20201 weight=25;
}
更新一个server后:
upstream tomcat {
server 192.168.11.68:20201 weight=30;
server 192.168.11.69:20201 weight=30;
server 192.168.11.70:20201 weight=30;
server 192.168.11.71:20201 weight=10; (AB测试环境)
}

2.按cookies或者IP或者其他分配流量:
https://www.cnblogs.com/weifeng1463/p/7353710.html

3.用LUA语言进行编程,逻辑分配流量:
https://www.jb51.net/article/114804.htm

一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

你可能感兴趣的:(IT)