Nginx

Posted python web

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx相关的知识,希望对你有一定的参考价值。

Nginx

1.nginx简介

  • 一款基于异步框架的轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器

  • 优点

    • 基于 epoll/kqueue 模型开发,支持高并发量

    • 善于处理静态文件,相较于其他web(比如:apache),占用更少的内存及资源

    • 配置简单(一个conf文件),运行简单(nginx命令),而且运行稳定

    • 功能模块插件化设计,可以自由配置相应的功能

    • 支持rewrite功能,能够根据域名、URL等请求关键点,实现定制化的高质量分发

    • Nginx的负载均衡功能很强大而且免费开源

    • Nginx代码完全用C语言从头写成,可以在各系统上编译并使用

  • 缺点

    • nginx善于处理静态文件,但是处理动态页面相较于Apache之类重量级的web软件能力稍欠缺

    • 虽然nginx支持rewrite功能多,但是相较于Apache之类重量级的web软件能力稍欠缺

# 全局nginx.confhttp { import ./conf.d/child.conf}


2.Nginx部署

# 安装apt-get install -y build-essential libssl-dev libtool libpcre3 libpcre3-dev make openssl zlib1g-dev apt-get install nginx -y
# 检查效果netstat -tnulp | grep nginx
# 服务相关命令systemctl start|stop|reload|... nginx/etc/init.d/nginx start|stop|reload|.../usr/sbin/nginx ...nginx -V
# 移除相关命令dpkg --get-selections|grep nginx # 查看和nginx相关软件apt-get --purge remove nginx # 移除nginx,包括相关文件apt-get --purge remove nginx-commonapt-get --purge remove nginx-core

工作目录(配置)

/etc/nginx

执行文件

/usr/sbin/nginx

日志目录

/var/log/nginx

启动文件

/etc/init.d/nginx

web目录

/var/www/html/,

/usr/share/nginx/html/


3.配置详解

  • 全局配置段

user

设置使用用户(worker)

worker_processes

进行增大并发连接数的处理 跟cpu保持一致

error_log

nginx的错误日志

pid

nginx服务启动时候pid

events

定义事件相关的属性

worker_connections

一个进程允许处理的最大连接数

use

定义使用的内核模型

  • http配置段

include mime.types;

文件扩展名与文件类型映射表

default_type application/octet-stream;

默认文件类型

sendfile on;

开启高效文件传输模式

autoindex on;

开启目录列表访问,合适下载服务器,默认关闭

tcp_nopush on;

防止网络阻塞

tcp_nodelay on;

防止网络阻塞

keepalive_timeout 120;

长连接超时时间,单位是秒

gzip on; 

开启gzip压缩输出

  • server配置属性

    • listen属性

    • 首先将样式补全成IP:Port,然后匹配,接着使用Server_name匹配

IP:Port

listen 10.10.10.10:99

IP

listen 10.10.10.10

Port

listen 99或 [::]:99

default_server

listen default_server

    • server_name属性

    • 定义Server监听的域名,当域名匹配时候才进行下一步操作

www.example.com

*.example.com

www.example.*

    • root属性

      • 定义Server相应请求的html文件所在路径

      • root /var/www/html;


    • index属性

      • 定义响应请求后返回的文件名称或格式

      • index index.html index.htm


    • return属性

      • 定义响应请求后返回的http状态码

      • return  404


  • location属性


=/路径

精确匹配

location = /image {}

~

优先匹配

location ~ /page {}

/

通用匹配

location / {}

@

内部重定向

location @name {}


location / { root /var/www/html; # 指定响应请求的文件所在路径      index  index.php index.html index.htm; # 指定响应请求的默认文件名称      expires 7d# 指定响应请求的文件过期时间,一般用于静态文件 try_files $uri $uri/ =404; # 如果root指定的路径下有查找的文件,就返回,否则报错}
location = /test/ { return 302 http://sswang.com/; # 访问旧url的时候,临时跳转到新url,两个url均不失效 }
location /nginx-status { stub_status on; # 开启nginx的状态页面,默认关闭 allow 192.168.8.14; # 允许的访问地址 deny all; # 其他拒绝}
location /upload { alias /var/www/upload; # 指定查看文件列表路径(绝对路径) autoindex on; # 开启目录自动索引    autoindex_exact_size off# 默认on,显示文件确切大小(bytes)。off表示显示文件的大概大小(kB/MB/...)    autoindex_localtime on# 默认off,显示的文件时间为GMT时间。on表示显示文件的服务器时间}# alias指定的目录下,不允许出现index属性指定的文件
location /static{    alias /home/python/meiduo_mall;}# /static/css/index.css 自动从root的指定目录下查找/static/css/index.css文件

4.反向代理

  • proxy_set_header 请求携带原始请求头信息

down

表示当前server主机暂时不参与负载均衡

backup

后备主机,当所有非backup机器出现故障或者繁忙的时候,才会请求backup机器

max_fails

允许请求的最大失败数,默认为1,配合fail_timeout一起使用

fail_timeout

经历max_fails次失败后,暂停服务的时间,默认为10s

# http://domain.com/html/test.jslocation /html/ { proxy_pass http://proxy.com; # http://proxy.com/html/test.js proxy_pass http://proxy.com/; # http://proxy.com/test.js  proxy_set_header X-Real-IP $remote_addr; # 后端请求携带原始请求的真实IP地址}

5.负载均衡

  • upstream {} 和 Server {} 两部分内容属于平级关系

upstream backends { server 192.168.8.14:10086; server 192.168.8.14:10087; server 192.168.8.14:10088;}server { listen 80; server_name localhost; location / { proxy_pass http://backends; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}
  • 负载均衡调度算法

    • 雨露均沾型:轮训、加权轮训、哈希

    • 定向服务型:ip_hash、least_conn、cookie、route、lean、

    • 商业类型:ntlm、least_time、queue、stick

    • 第三方算法:fair、url_hash

轮训(默认)

按顺序逐一分配到不同的后端服务器

weight

轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况

ip_hash

按访问IP的哈希结果分配请求,分配后访客访问固定后端服务器,有效的解决动态网页会话共享问题

fair

基于后端服务器的响应时间来分配请求,响应时间短的优先分配

url_hash

按访问URL的哈希结果分配请求,使同URL定向到同一台后端服务器,可提高后端缓存服务器的效率

upstream backends { server 192.168.8.14:10086 backup;  server 192.168.8.14:10087 weight=1; server 192.168.8.14:10088 weight=2;  ip_hash;  server 192.168.8.14:10089;}

6.日志解析

  • Nginx默认提供了两个日志文件 access.log和error.log,通过access.log可以得到用户请求的相关信息;通过error.log可以获取某个web服务故障或其性能瓶颈等信息

  • nginx的日志支持定制化格式,最常见的场景就是获取客户端的IP,记录用户访问量

# cat /etc/nginx/nginx.conf -n 40 access_log /var/log/nginx/access.log;    41    error_log /var/log/nginx/error.log;    # nginx日志属性设置的完整格式是: 属性名称 access_log  存储位置 /var/log/nginx/access.log 日志格式 位置为空表示使用默认的combined 日志格式。它是通过log_format设置的

log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; # log_format是有一批nginx内置变量组合而成的
# 效果192.168.8.14 - - [12/Nov/2018:08:24:18 -0800] "GET /favicon.ico HTTP/1.0" 404 580 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
  • 默认变量

remote_addr

remote_user

用于记录远程客户端的用户名称(一般为“-”)

time_local

用于记录访问时间和时区

request

用于记录请求的url以及请求方法

status

响应状态码

body_bytes_sent

给客户端发送的文件主体内容字节数

http_referer

可以记录用户是从哪个链接访问过来的

http_user_agent

用户所使用的代理

  • 其它常用变量

request_uri

包含请求参数

http_x_real_ip

args

这个变量等于请求行中的参数

host

请求主机头字段,否则为服务器名称

scheme

HTTP方法(如http,https)

# 全局nginx.conf配置log_format proxy_format '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_real_ip" "$http_x_forwarded_for"';
# 局部配置是负载均衡中每个web服务器的日志信息,可以快速看到哪个Django服务器出错server { listen 192.168.8.14:10086; root /var/www/html/app1/; access_log /var/log/nginx/app1/access.log proxy_format; real_ip_header X-Forwarded-For;  set_real_ip_from 192.168.0.0/16;  real_ip_recursive on; location / { try_files $uri $uri/ =404; }}

7.URL重写

last 

本条规则匹配完成后,继续向下匹配新的location URI规则,用于Server/if配置段

break  

本条规则匹配完成即终止,不再匹配后面的任何规则,一般用于Location配置段

redirect  

permanent  

server { # 访问 /last.html 的时候,页面内容重写到 /index.html 中 rewrite /last.html /index.html last; # 访问 /break.html 的时候,页面内容重写到 /index.html 中,并停止后续的匹配 rewrite /break.html /index.html break; # 访问 /redirect.html 的时候,页面直接302定向到 /index.html中 rewrite /redirect.html /index.html redirect; # 访问 /permanent.html 的时候,页面直接301定向到 /index.html中 rewrite /permanent.html /index.html permanent; # 把 /html/*.html => /post/*.html ,301定向 rewrite ^/html/(.+?).html$ /post/$1.html permanent; # 把 /search/key => /search.html?keyword=key rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;}
  • rewrite 是在同一域名内更改获取资源的路径

  • location 结合 proxy_pass实现反向代理,不会对请求的资源路径进行变动

  • location 结合 rewrite 对某个具体的请求进行重写

server { listen 80; server_name rewrite.com; rewrite ^/(.*) http://www.rew.com/$1;}server { listen 80; server_name www.rew.com; location / { root /var/www/html/rew/; index index.html index.htm; }}
server { listen 80; server_name localhost; location / { rewrite /last/ /ok.html last; rewrite /break/ /ok.html break; } location = /ok.html { return 400; }}

8.if指令

  • if指令主要是基于nginx的内置变量值来获取请求的关键字

if(内置变量 操作符 值){ ... }# 如果为真,大括号内的rewrite指令将被执行
if ($request_method = POST) { return 405;}
# 这里的break也是停止rewrite检查if (!-f $request_filename){ break; proxy_pass http://127.0.0.1;}
server { listen 80; server_name nihao.com www.nihao.com;# 如果host不是www.nihao.com,则重定向到标准的www.nihao.com if ( $host != "www.nihao.com" ){ rewrite ^/(.*)$ http://www.nihao.com/$1 permanent; } location / { try_files $uri $uri/ =404; }}


web部署

  • 项目应用进行拆分


以上是关于Nginx的主要内容,如果未能解决你的问题,请参考以下文章

将 nginx rtmp 片段发送到 WebRTC

text 有用的nginx命令和片段

linux学习:Nginx--常见功能配置片段与优化-06

HLS NGINX-RTMP [错误] 1281#0:* 58 hls:强制片段拆分:10.002 秒

Nginx 跨域

Nginx配置文件详细介绍