#配置工作进程的用户和组
user nobady nobady
#指定worker进程启动的数量 一般与cpu的核心数相同
worker_processes 4
#错误日志文件位置(默认所有类型错误) 第二个参数可选择输出错误日志类型
#[debug | info | notice | warn | error | crit | alert | emerg],级别越
#高记录的信息越少,I/O消耗越低
error_log /data/nginx/logs/error.log
#pid文件存放nginx主进程的ID 会覆盖默认配置
pid /var/run/nginx.pid
events{
#use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] 选择网络I/O模型
#linus 下默认使用epoll
use epoll
#每个进程可以处理的最大连接数
worker_connetctions 1024;
}
http{
#文件扩展名与文件类型映射表
include mime.types;#默认文件类型
default_type application/octet-stream;
#关闭请求头显示nginx版本信息
server_tokens off;
#开启高效传输模式。
sendfile on;#防止网络阻塞
tcp_nopush on;
tcp_nodelay on; #客户端连接超时时间,单位是秒
keepalive_timeout 60;#客户端请求头读取超时时间
client_header_timeout 10;#设置客户端请求主体读取超时时间
client_body_timeout 10;#响应客户端超时时间
send_timeout 10
}
server{
#监听端
listen 80;
#访问域名
server_name localhost;
#编码格式,若网页格式与此不同,将被自动转码
charset koi8-r;
#虚拟主机访问日志定义
access_log logs/host.access.log main;
}
#上游服务器
upstream mytomcatl {
#负载均衡调度算法 默认的是轮询(round-robin)、ip_hash(通过IP地址的哈希值确保客户端均匀的连接到所有的服务器)、least_conn(将请求发送到活跃连接数最少的服务器上)
ip_hash;
#上游服务器地址
server 127.0.0.1:5000; # server IP port
server 127.0.0.1:5010; # server IP port
#worker进程缓存到上游服务器的连接数
keepalive 32
}
#Location指令通过指定模式来与客户端请求的URI相匹配
location = /uri =开头表示精确匹配,只有完全匹配上才能生效。
location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
location ~ pattern ~开头表示区分大小写的正则匹配。
location ~* pattern ~*开头表示不区分大小写的正则匹配。
location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default
示例:
location ^~ /views/ {
root /virus/export_report/report/;
}
# 动态路由代理规则
location /v1 {
proxy_set_header Host $host; # 转发主机请求
proxy_set_header X-Real-IP $remote_addr; # 转发源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发目的IP
proxy_pass http://mytomcat;
}
user nobody nobody;
worker_processes 1;
error_log /data/nginx/logs/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /virus/party/nginx/conf/mime.types;
default_type /virus/party/nginx/conf/application/octet-stream;
server_tokens off; # 关闭请求头显示nginx版本信息
keepalive_timeout 65;
sendfile on;
# 服务器代理转发信息
upstream mytomcat {
ip_hash;
server 30.30.30.3:5010; # server IP port
}
server{
listen 80; # 侦听8080端口
server_name 30.30.30.2; # 服务器IP地址,或者域名地址
# 静态静态文件代理规则
client_max_body_size 11M;
root /virus/soc_webui_static/webui/;
location ^~ /scl/ {
proxy_pass http://200.200.116.175:80; # 转发负载配置
proxy_set_header Host $host; # 转发主机请求
proxy_set_header X-Real-IP $remote_addr; # 转发源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ^~ /js {
root /virus/soc_webui_static/webui/;
}
location ^~ /static {
root /virus/soc_webui_static/webui/;
}
location ^~ /imgs {
root /virus/soc_webui_static/webui/;
}
location ^~ /fonts {
root /virus/soc_webui_static/webui/;
}
location ^~ /css {
root /virus/soc_webui_static/webui/;
}
location ^~ / {
proxy_pass http://mytomcat;
proxy_set_header Host $host; # 转发主机请求
proxy_set_header X-Real-IP $remote_addr; # 转发源IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发目的IP
}
}
}
nginx -c nginx.conf
PID,之后对这个文件也是通过信号量来控制。
nginx -s stop|quit|reopen|reload
1.stop 快速停止服务:类似kill -SIGTERM pid
1) master进程收到 stop 信号后,把 ngx_terminate 设置为1
2) master看到ngx_terminate 为1 ,通过channel向子进程发送 NGX_CMD_TERMINATE 命令
3) 子进程收到命令后,把 ngx_terminate = 1
4) 子进程看到ngx_terminate 为1 , 直接调用ngx_worker_process_exit 结束进程
5) 子进程结束的时候,会向master进程发送一个 SIGCHLD 信号
6) master进程收sigchild信号后,把ngx_reap =1 并调用 ngx_process_get_status得到退出的进程并设置进程的状态。
7) master看到ngx_reap就调用ngx_reap_children回收子进程
8) 所有的子进程都回收完毕,master就调用 ngx_master_process_exit 退出。
2.quit 优雅的停止服务:quit信号其实和前面介绍的stop 基本一样,唯一的不同之处就是quit是一种优雅的停止,也就是进程如果还在服务中,那么就不会关闭该进程,直到进程完成服务为止。当然这个过程中不能再接受新的任务了。
1) master接收到quit信号后, 关闭监听socker,然后向子进程发送quit信号(这里master本来就不接收请求,关闭监听可能是因为如果此时子进程挂了,父进程会重启一个子进程,fork的时候会使用master的监听句柄,与nginx的启动对应)
2) 子进程收到quit信号,首先关闭监听socker, 然后把ngx_exiting设置为1 ,表示进程当前是处于退出的过程中,看是否有未完成的请求,有就处理完,最后结束子进程
3) 后面同stop的第五步
3.reopen 重启:nginx服务会暂时中断,然后通过配置文件启动,如果配置文件有错 会一直中断服务
4.reload 重新加载:reload会重新加载配置文件,nginx服务不会中断,而且reload时会测试conf语法等,如果出错会rollback用上一次正确配置文件保持正常运行;如果配置正确,master进程重新初始化系统的资源,启动新的子进程(会使用一个标识表示它为新进程),启动新的cache管理进程,向子进程发出quit信号退出,旧的子进程退出。
示例:
[uwsgi]
[uwsgi]
uid = nobody
gid = nobody
master = true
chmod-socket = 666
pidfile = /var/run/uwsgi.pid
processes = 8
threads = 32
chdir = /virus/soc_webui_dynamic
daemonize = /data/uwsgi/logs/soc_webui_dynamic.log
callable = application
pythonpath = /virus/soc_webui_dynamic
module = soc_webui_dynamic_start
listen = 12888
http = 0.0.0.0:5010
/virus/party/uwsgi/uwsgi /virus/etc/uwsgi/conf/uwsgi.ini
3.uwsgi的停止
1.stop 命令
发送一个SIGINT信号给
--stop
SIGINT 不仅当前进程会收到这个信号,它的子进程也会收到该信号
kill 命令