nginx笔记

来源:互联网 发布:chart.js 自定义 提示 编辑:程序博客网 时间:2024/06/05 06:18

进程

nginx有一个master进程和几个worker进程。master进程的主要目的是读取和诊断配置文件,收集和分配网络请求给worker进程,并管理worker进程。worker进程才是真正执行请求的处理。nginx采用基于事件的模型和依赖于操作系统的机制,以有效地在worker进程之间分配请求。worker进程的数量使用worker_processes指令定义在配置文件中,可以为固定的数量或者自动调整到可用CPU核心的数量。一般配置worker进程数等于可用CPU核心数。

配置文件

配置文件名默认为nginx.conf。nginx由在配置文件中指定的指令控制的模块组成。指令分为简单指令和块指令。一个简单的指令由名称、空格分隔的参数组成,并以分号结束。块指令具有与简单指令相同的结构,但是它以一组外围是大括号的附加指令结束而不是分号。如果块指令可以在括号内包含其他指令,则它被称为上下文,例如 events、http、server、location。在任何上下文外的指令被认为是main上下文,events、http属于main上下文,server属于http上下文,location属于server上下文。#号之后的行的内容被视为注释。

可执行文件

可执行文件名是nginx,文件路径可在编译时指定或者使用默认路径。启动nginx可以在nginx可执行文件目录执行 ./nginx。启动了nginx后,可以通过执行 ./nginx -s signal控制nginx,signal有如下几种:
stop:快速关闭,强制关闭,类似kill -9
quit: 正常关闭,等待worker进程处理完当前请求再关闭
reload:重新加载配置文件
reopen: 重启日志文件
一旦master进程接收到重新加载配置文件的signal,它就会检查新配置文件的语法有效性,并尝试应用它提供的配置。如果成功,master进程启动新的worker进程,并向旧的worker进程发送消息,请求它们关闭。如果失败,master进程回滚更改并继续使用旧的配置。旧的worker进程,接收到关闭命令后,停止接受新的连接,继续服务当前所有请求直到它们处理完成。之后旧的worker进程退出。

HTTPS双向认证

使用openssl生成相关证书:
#生成CA私钥,私钥会被加密,需要设置密码
openssl genrsa -aes256 -out ca.key 2048
#生成CA证书签名请求,需要输入CA私钥密码,并按提示输入以下信息:Country Name、State or Province Name、Locality Name、Organization Name、Organizational Unit Name、Common Name
openssl req -new -key ca.key -out ca.csr
#自签名生成CA证书,需要输入CA私钥密码
openssl x509 -req -days 36500 -sha1 -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt

#生成服务端私钥,私钥会被加密,需要设置密码
openssl genrsa -aes256 -out server.key 2048
#解密服务端私钥,需要输入服务端私钥密码
openssl rsa -in server.key -out server.key
#生成服务端证书签名请求,并按提示输入以下信息:Country Name、State or Province Name、Locality Name、Organization Name、Organizational Unit Name、Common Name
openssl req -new -key server.key -out server.csr
#用CA私钥签名生成服务端证书,需要输入CA私钥密码
openssl x509 -req -days 36500 -sha1 -extensions v3_req -CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial -in server.csr -out server.crt

#生成客户端私钥,私钥会被加密,需要设置密码
openssl genrsa -aes256 -out client.key 2048
#解密客户端私钥,需要输入客户端私钥密码
openssl rsa -in client.key -out client.key
#生成客户端证书签名请求,并按提示输入以下信息:Country Name、State or Province Name、Locality Name、Organization Name、Organizational Unit Name、Common Name
openssl req -new -key client.key -out client.csr
#用CA私钥签名生成客户端证书,需要输入CA私钥密码
openssl x509 -req -days 36500 -sha1 -extensions v3_req -CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial -in client.csr -out client.crt
#导出客户端私钥和证书到p12证书,需要设置p12证书密码
openssl pkcs12 -export -clcerts -inkey client.key -in client.crt -out client.p12

配置示例:
server {
listen 80;
listen 443 ssl;
server_name localhost;

keepalive_timeout 70;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_certificate /usr/local/nginx/ssl/server.crt;
ssl_certificate_key /usr/local/nginx/ssl/server.key;
ssl_client_certificate /usr/local/nginx/ssl/ca.crt;
ssl_verify_client on;

负载均衡

负载均衡策略有以下几种:
请求轮询:round-robin,是默认策略,应用服务器的请求以循环方式分发,可以设置权重weight,默认权重均为1,因此每台后端服务器接受的请求数相同。
最少连接:least-connected,当某些请求占用比较长的时间时,此策略相对更公平。nginx尽量不让繁忙的应用服务器负载过多的请求,而是将新请求分发给那些不繁忙的服务器。
会话保持:ip-hash,客户端的IP地址用作散列键,以确定应该为客户端的请求选择服务器组中的哪一台服务器,此方法确保来自同一客户端的请求将始终指向相同的服务器,除非此服务器不可用。
nginx中的反向代理实现包括服务器健康检查。如果某个特定服务器的响应失败,nginx会将此服务器标记为失败,并将尝试避免在随后的入站请求中选择此服务器。

请求轮询权重配置示例,大概每6个请求将会分配1个到srv1,2个到srv2,3个到srv3:
http {
upstream myapp1 {
server srv1.example.com weight=1;
server srv2.example.com weight=2;
server srv3.example.com weight=3;
}

server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}

其他策略配置示例:
http {
upstream myapp1 {
least-connected或者ip-hash
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}

server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}