什么是 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 等待更新!