什么是 Nginx?

Nginx (engine x) 是一个高性能的HTTP反向代理web服务器其特点是占用内存少,并发能力强.,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的。

官网:https://nginx.org/
官方文档:https://nginx.org/en/docs/

Nginx 的应用领域

代理服务器:

代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站,去获取信息。

反向代理

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

正向代理:

正向代理是一个位于客户端A和原始服务器(服务器B)之间的服务器(代理服务器Z),为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

负载均衡:

就是将服务器接收到的请求按照规则进行分发的过程.

Nginx支持的负载均衡调度算法方式如下:

1.weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

2.ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。

3.fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。

4.url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在Nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装Nginx的hash软件包。

动静分离:

动静分离是为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

安装Nginx

ubuntu/debian

$ sudo apt-get install nginx

Centos

$ yum update
$ yum install nginx

Linux常用操作指令

root@mek:~# nginx -h
nginx version: nginx/1.18.0 (Ubuntu)
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : #打印帮助
  -v            : #现在版本信息
  -V            : #显示版本信息和配置信息
  -t            : #测试配置文件是否正确
  -T            : #测试配置,转储并退出
  -q            : #suppress non-error messages during configuration testing
  -s signal     : #操作进程 process: stop, quit, reopen, reload
  -p prefix     : #set prefix path (default: /usr/share/nginx/)
  -c filename   : #设置配置文件 (default: /etc/nginx/nginx.conf)
  -g directives : #从配置文件中设置全局指令


#设置开机自启
systemctl status nginx      #查看nginx状态
systemctl start nginx       #启动nginx服务
systemctl stop nginx        #关闭nginx服务
systemctl enable nginx      #设置开机自启
systemctl disable nginx     #禁止开机自启

快捷操作指令
#控制进程
nginx -s 
         stop       #快速关闭
         quit       #优雅的关闭
         reload     #重新加载配置

#选择启动配置文件
nginx -c /etc/nginx/nginx.conf


#查看版本信息
nginx -v

#查看进程信息
ps -er|gerp nginx

Windows

下载地址:https://nginx.org/en/download.html

Docker

##获取image
$ docker pull nginx

##运行
#代理静态资源
$ docker run --name nginx -p 80:80 -v /some/content:/usr/share/nginx/html:ro -d nginx

#运行自己的配置文件
$ docker run -p 80:80 -v /myconf/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx

#替换配置文件
$ docker run --name tmp-nginx-container -d nginx
$ docker cp tmp-nginx-container:/etc/nginx/nginx.conf /host/path/nginx.conf
$ docker restart tmp-nginx-container

#使用自己的配置文件构建imag
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf

撰写Nginx.conf文件

Nginx配置分为三大板块
  • 全局板块

    配置运行Nginx服务器用户(组)

    worker进程数

    Nginx进程PID存放路径

    错误日志的存放路径

    配置文件的引入

  • events 板块,事件驱动板块

    设置网络连接的序列化

    是否允许同时接收多个网络连接

    事件驱动模型的选择

    最大连接数的配置

  • http 板块

    定义MIMI-Type

    是否允许sendfile方式传输文件

    连接超时时间
    单连接请求数上限

  • server 板块,服务配置板块

    配置网络端口监听

    访问日志和错误页

    基于名称的虚拟主机配置

    基于IP的虚拟主机配置

    location块配置

###全局板块
user  nobody  nobody;
worker_processes  auto;
error_log  logs/error.log;
pid  logs/nginx.pid;
###

events {					#events 板块
 use epoll;
    worker_connections  1024;
}

http {							#http 板块,该板块可以不用配置
    
    server {					#server 板块
	
		location / {			#location块配置
	
		}
		location /mian {
	
		}
	}

}



全局块撰写规则
#指定用户,可以不进行设置,设置为nobody时则代表所有系统用户均可启动该配置文件
user  nobody;

#Nginx进程,一般设置为和CPU核数一样,设置为auto时为自动检测
worker_processes  1; 

#错误日志存放目录,可以根据后面的日志级别指定到不同目录
#常见的可选日志级别包括:info、debug、warn、error...等
error_log  /var/log/nginx/error.log;

#由于Nginx进程是作为系统守护进程在后台运行,所以该选项用于自定义配置PID文件的保存路径
pid  logs/nginx.pid
events 板块,事件驱动板块撰写规则
user  nobody;

events {
   	#use是个事件模块指令,用来指定Nginx的工作模式
    #Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll
    #其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式
    #不同的是epoll用在Linux平台上,而kqueue用在BSD系统中
    #对于Linux系统,epoll工作模式是首选
    use epoll;
    
    #表示允许每一个worker进程可以同时开启的最大连接数,默认512
    worker_connections 1024;
    
    #该配置主要用于引入其他或者第三方的Nginx配置文件到当前的主配置文件中
    #include conf_file
    
    #该配置默认为on状态,表示会对多个Nginx工作进程接收连接进行序列化,防止多个worker进程对连接的争抢。
    accept_mutex on;
    
    #该配置默认为off,意指每个worker进程一次只能接收一个新到达的网络连接。
    multi_accept off
}
http 板块撰写规则
user  nobody;

events {
	worker_connections 1024;
}

http {
	#访问日志存储路径配置
	access_log  logs/access.log  main;
	
	#sendfile配置用于开启或关闭使用sendfile()系统调用来传输文件,默认off
	#在很多Web Server中,都引入了 sendfile的机制,来实现高性能文件传输
	sendfile  on;
	
	#表示server端对连接的保持时间
	keepalive_timeout 65;
}
server 板块撰写规则
user  nobody;

events {
	worker_connections 1024;
}

http {
	server {
		#监听地址,格式为IP:Prot IP prot
		listen       192.168.1.1:80;
		
		#客户端访问域名,可配置为localhost,多个域名用空格隔开,域名支持*通配符
        #server name 为虚拟服务器的识别路径。因此不同的域名会通过请求头中的HOST字段
        #匹配到特定的server块,转发到对应的应用服务器中去。
		server_name  mek.plus;
	}
}
location板块撰写规则 *重要
user  nobody;

events {
	worker_connections 1024;
}

http {
	server {
		listen       192.168.1.1:80;
		server_name  mek.plus;
        
        
        #location [ = | ~ | ~* | ^~ ] /uri/ {...}
        # / 为上下文匹配
        # “=” :用于标准uri,进行字符串的精确匹配
		# “~” :用于正则uri,表示区分大小写的匹配
		# “~*” :用于正则uri,表示不区分大小写的匹配
		# “^~” :用于标准uri,^进行前缀匹配,~表示区分大小写
        
        location / {
            #proxy_pass 设置反向代理路径
            proxy_pass http://192.168.1.100:8080;
        }
        
        
        location / {
            #引入uwsgi配置参数
            #直接指向uwsgi的socker端口
            include /etc/nginx/uwsgi_params;
            uwsgi_pass 192.168.1.100:8080;
        }
        
        location /server/ {
            #root 设置静态资源路径,index 设置主页资源
            root   /codesheep/webserver;
            index  index.server2-location1.htm;
        }

        location /file {
            #alias 更改location接收到的URI请求路径
            alias   /codesheep/webserver/server2/location2/;
            index  index.server2-location2.htm;
        }
	}
}
stream模块 实现端口转发
user  nobody;

events {
	worker_connections 1024;
}

stream {
    server {
        #配置tcp端口转发					#listen 服务端接收端口
        listen 8998;
        proxy_pass 127.0.0.1:8999;		#转发端口
    }
    
    server {
        #配置idp端口转发
        listen 9998 udp;
        proxy_pass 127.0.0.1:9999;
    } 
} 
负载均衡
user  nobody;

events {
	worker_connections 1024;
}

#定义负载集群
upstream dockerSwarm {
    # ip_hash:指定策略为通过ip进行hash之后转发
    # fair:按目标服务器的响应时间来分配请求,响应时间短的优先被分配
      ip_hash; 
      server 127.0.0.1:5000;
      server 127.0.0.1:6000;
  }

upstream dockerSwarm2 {
    #weight 加权轮询,weight值越大命中率越高
      server 127.0.0.1:5000 weight=2;
      server 127.0.0.1:6000 weight=1;
  }

server {
	listen       192.168.1.1:80;
	server_name  mek.plus;
    location / {
        #设置接受转发的集群
        proxy_pass http://dockerSwarm2;
    }
    
}
SSL配置
user www-data;
events {
        worker_connections 1024;
}

http {
    	#include /etc/nginx/sites-enabled/*;
        include /etc/nginx/default.d/*.conf;



        server {
                listen 443 ssl;
                server_name  mek.plus;
                #ssl_certificate cloud.tencent.com_bundle.crt;
                ssl_certificate /root/Mek/Dock_Woker/Nginx/mek.plus_bundle.crt;

                #ssl_certificate_key cloud.tencent.com.key;
                ssl_certificate_key /root/Mek/Dock_Woker/Nginx/mek.plus.key;

                #设置ssl会话缓存容量
                ssl_session_cache   shared:SSL:10m;

                #设置ssl会话超时时间
                ssl_session_timeout 30m;
                location / {
                        include uwsgi_params;
                        uwsgi_pass 172.17.0.6:5050;
                }
}

案例分享

Nginx+uwsgi socket方案
#djblog_nginx.conf

user www-data;
events {
        worker_connections 1024;
}

http {
        #include /etc/nginx/sites-enabled/*;
        include /etc/nginx/default.d/*.conf;
        server {
                listen  80;
                server_name  192.168.1.118;
        
                location / {
                        include uwsgi_params;
                        uwsgi_pass 172.17.0.4:5050;
                }
        }
}
     #将配置文件拷贝到 /etc/nginx
     #运行 nginx -c /etc/nginx/djblog_nginx.conf
Nginx+uwsgi http方案
user www-data;
events {
        worker_connections 1024;
}

http {
        server {
                listen  80;
        
                location / {
                #proxy_pass 设置反向代理路径
                proxy_pass http://172.17.0.7:5000/;
                }
        }
}
Nginx+uwsgi socket +SSL 方案(本站配置文件)
user www-data;
events {
        worker_connections 1024;
}

http {
        #include /etc/nginx/sites-enabled/*;
        include /etc/nginx/default.d/*.conf;



        server {
                listen 443 ssl;
                server_name  mek.plus;
                #ssl_certificate cloud.tencent.com_bundle.crt;
                ssl_certificate /root/Mek/Dock_Woker/Nginx/mek.plus_bundle.crt;

                #ssl_certificate_key cloud.tencent.com.key;
                ssl_certificate_key /root/Mek/Dock_Woker/Nginx/mek.plus.key;

                #设置ssl会话缓存容量
                ssl_session_cache   shared:SSL:10m;

                #设置ssl会话超时时间
                ssl_session_timeout 30m;
                location / {
                        include uwsgi_params;
                        uwsgi_pass 172.17.0.6:5050;
                }


                location /media {
                        #静态资源路径
                        alias /home/Mek/Dock_Woker/DjangoBlog-master/uploads/uploads/;
                }


        }

        server {
                 listen 80;
                 #请填写绑定证书的域名
                server_name mek.plus;
                #把http的域名请求转成https
                return 301 https://$host$request_uri;
        }

        }
}

Nginx高可用方案

Keepalived 等待更新!