努力奔跑只为追上那个被寄予厚望的自己。
nginx了解
nginx采用的是多进程模型,主进程负责工作进程的配置\加载\启动和停止等操作,工作进程负责处理具体的请求.
重新启动nginx
nginx -s reload
进程间通信:
- signal:通过调用系统命令kill 发送信号实现进程通信
- channel:主进程向工作进行传递信号的操作方式
- 共享内存:进程之间的简单高效的通信方式
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