当前位置: 代码迷 >> 综合 >> Nginx-uwsgi 配置 学习
  详细解决方案

Nginx-uwsgi 配置 学习

热度:102   发布时间:2023-11-05 03:31:12.0

努力奔跑只为追上那个被寄予厚望的自己。

nginx了解

nginx采用的是多进程模型,主进程负责工作进程的配置\加载\启动和停止等操作,工作进程负责处理具体的请求.

重新启动nginx

nginx -s reload

进程间通信:

  1. signal:通过调用系统命令kill 发送信号实现进程通信
  2. channel:主进程向工作进行传递信号的操作方式
  3. 共享内存:进程之间的简单高效的通信方式

nginx快速查看配置文件的方法

locate nginx.conf

查看nginx实际调用的配置文件

ps aux|grep nginx #查看最右侧一栏的CMDnginx: master process /usr/local/opt/nginx/bin/nginx -g daemon off;
nginx的路径为:/usr/local/opt/nginx/bin/nginx运行如下命令
/usr/local/opt/nginx/bin/nginx -t
结果:
/usr/local/opt/nginx/bin/nginx -t
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful测试可知,nginx的配置文件路径为:/usr/local/etc/nginx/nginx.conf 且调用有效。

Nginx 整体配置

daemon off; 关闭nginx守护进程
worker_processes 4; #进程数
pid  /var/run/nginx.pid; #进程信息存放路径
worker_rlimit_nofile 65535; #最大连接数 理论上为单个进程的最大连接数*进程数

Nginx events配置示例

events {use epoll;   #使用较多的I/O复用模型 效率更高(select/poll 优势主要在于最大连接数的限制,支持更大的连接数)accept_mutex off;   #多余的线程调度,增加系统开销multi_accept off;   #关闭 一个工作进程只能接收一个连接worker_connections 65535;  #单个进程允许的客户端最大连接数
}
http {client_header_buffer_size 64k;large_client_header_buffers 4 64k;include               /etc/nginx/mime.types;default_type          application/octet-stream;sendfile              on;keepalive_timeout     120;server {listen                  80 default_server;server_name             localhost;client_max_body_size    10m;#代理location /api/ {set $originaddr http://wangzi.default.svc.cluster.local;proxy_http_version 1.1;resolver 10.96.0.10;proxy_pass_request_headers            on;proxy_set_header   origin             $host;proxy_set_header   X-Real-IP          $remote_addr;proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;proxy_set_header   X-Forwarded-Host   $host;proxy_set_header   X-Forwarded-Proto  $scheme;proxy_pass  $originaddr;}location /upload/ {set $originaddr http://wangzi.default.svc.cluster.local;proxy_http_version 1.1;resolver 1111.11.1.1;proxy_pass_request_headers            on;proxy_set_header   origin             $host;proxy_set_header   X-Real-IP          $remote_addr;proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;proxy_set_header   X-Forwarded-Host   $host;proxy_set_header   X-Forwarded-Proto  $scheme;proxy_pass  $originaddr;}}
}

daemon off

Docker 容器启动时,默认会把容器内部第一个进程,也就是pid=1的程序,作为docker容器是否正在运行的依据,如果 docker 容器pid=1的进程挂了,那么docker容器便会直接退出。nginx默认是以后台模式启动的,Docker未执行自定义的CMD之前,nginx的pid是1,执行到CMD之后,nginx就在后台运行,bash或sh脚本的pid变成了1。所以一旦执行完自定义CMD,nginx容器也就退出了。为了保持nginx的容器不退出,应该关闭nginx后台运行。

worker_connections

单个进程允许的客户端最大连接数
worker_connections 20480;

worker_rlimit_nofile

worker进程最大打开文件数worker_rlimit_nofile 65535;

accept_mutex

accept_mutex的意义:当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是「惊群问题」。

multi_accept

如果multi_accept被禁止了,nginx一个工作进程只能同时接受一个新的连接。否则,一个工作进程可以同时接受所有的新连接。

client_header_buffer_size 64k

存放客户端请求头的缓冲区大小。

large_client_header_buffers 4 64k

超大请求头缓冲区大小。
客户端请求头数据,如果(请求行+请求头)超过所设定的大小,会把超出部分转移到该缓存区。第一次可以分配到一个 64k的缓冲区,请求行的数据大小不能超过该缓冲区块的大小,否则会414,超出64K的会被循环转移到新的缓冲区,最大转移4次。当出超过该值时会400.

keepalive_timeout

TCP连接内持续没有数据传输的最大时间,超过这个时间则关闭连接,默认时间75秒

sendfile

on表示开启0复制。是读取本地文件后向网络接口发送文件内容的文件传输机制。有效减少文件的都写次数,提升本地文件的网络传输效率。

resolver

指定域名解析解析服务器地址。valid设置缓存解析结果的时间。

client_max_body_size

HTTP请求时的请求体的最大值。当请求头中属性content-length的大小超过指令配置时,返回状态码408

include

加载外部配置文件

load_module

加载动态模块的指令

http{}里面新建一个server 这个里面可以建很多的server代表着不同的线程
配置listen端口 默认为80时可以不输入
server_name配置你要访问的域名 可以随便起
index对应的是你默认要打开的文件
root是该项目所在的文件夹
location /将匹配所有请求 因为所有地址都以 / 开头
try_files是匹配路径 默认最后的页面是你要打开的文件

location / {try_files $uri $uri/ /index.php?$query_string;
}
location ~ .*\.(php|php5)?$
{fastcgi_pass  127.0.0.1:9000;fastcgi_index index.php;
}

当用户请求 http://localhost/example 时,这里的 $uri 就是 /example
try_files 会到硬盘里尝试找这个文件。如果存在名为 /$root/example(其中 $root 是项目代码安装目录)的文件,就直接把这个文件的内容发送给用户。
显然,目录中没有叫 example 的文件。然后就看 $uri/,增加了一个 /,也就是看有没有名为 /$root/example/ 的目录。
又找不到,就会 fall back 到 try_files 的最后一个选项 /index.php,发起一个内部 “子请求”,也就是相当于 nginx 发起一个 HTTP 请求到 http://localhost/index.php

[uwsgi]
socket = /tmp/uwsgi.sock   # 指定socket文件,用于和 nginx 进行数据交互
chdir = /app  #django 程序的主目录
processes = 64 #最大的工作进程
threads=2    # 每个进程的线程数
wsgi-file = cdscp/wsgi_pre.py
callable=app 
module = mysite.wsgi  # 项目的启动脚本文件路径,加载一个WSGI模块,这里加载mysite/wsgi.py这个模块
master = true #启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。
buffer-size=1024000 #Set the max size of a request 默认4K,通常和请求头的大小保持一致
daemonize = /app/logs/uwsgi.log  #后台运行,并输出日志
logto = /app/logs/uwsgi.log #将日志写到文件中
log-backupname = /app/logs/uwsgi.bak.log 
log-maxsize = 500000000 #设置最大日志文件大小
logfile-chmod = 666 #赋予日志文件读写权限
http = :8000 # 对外提供 http 服务的端口
启动uwsgi uwsgi --ini uwsgi.ini