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.conf
http {
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-common
apt-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.js
location /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,记录用户访问量
40 access_log /var/log/nginx/access.log;
41 error_log /var/log/nginx/error.log;
属性名称 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的主要内容,如果未能解决你的问题,请参考以下文章