1.主配置
nginx.conf
# 运行用户和组
user www www;
# 进程数量
worker_processes auto;
# 进程和CPU绑定
# 如4核CPU 0001 代表第一个CPU 0010代表第二个CPU
# 例: 01 10 01 10 4个进程绑定2个CPU核心
worker_cpu_affinity auto;
#--------------------日志------------------
# 制定日志路径,级别
# 这个设置可以放入全局块,http块,server块
# 级别以此为:debug|info|notice|warn|error|crit|alert|emerg
error_log /home/wwwlogs/nginx_error.log crit;
#指定nginx进程运行文件存放地址
pid /usr/local/nginx/logs/nginx.pid;
# 每个进程打开的文件描述符数量
# 同时连接的数量受限于系统上可用的文件描述符的数量,因为每个套接字将打开一个文件描述符
# 此值增加到大于worker_processes * worker_connections的值
worker_rlimit_nofile 51200;
events{
# 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
use epoll;
# 设置worker进程最大打开的连接数
worker_connections 51200;
# 设置一个进程是否同时接受多个网络连接,默认为off
multi_accept off;
# 设置网路连接序列化,防止惊群现象发生,默认为on
accept_mutex off;
}
http{
# 文件扩展名与文件类型映射表
include mime.types;
# 默认文件类型,默认为text/plain
default_type application/octet-stream;
# 主机名hash表大小
server_names_hash_bucket_size 128;
# 客户http头缓冲区大小
client_header_buffer_size 32k;
# 用于读取大型客户端请求头的缓冲区的最大数量和大小。
# 这些缓冲区仅在缺省缓冲区不足时按需分配。
large_client_header_buffers 4 32k;
# 客户http正文大小限制
client_max_body_size 50m;
# 禁用NGINX缓冲区并将请求体存储在临时文件中 文件包含纯文本数据 开启后内存缓存将失效
# 该指令在NGINX配置的http,server和location区块使用。
# 可选值有:off:该值将禁用文件写入
# clean:请求body将被写入文件。 该文件将在处理请求后删除。
# on: 请求正文将被写入文件。 处理请求后,将不会删除该文件。
#client_body_in_file_only clean;
# 客户http正文缓存区大小 如果是反向代理此值可以设置大一点
client_body_buffer_size 16m;
# 允许sendfile方式传输文件,默认为off,可以在http块,server块,location块
sendfile on;
# 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
sendfile_max_chunk 512k;
# 连接超时时间,默认为75s,可以在http,server,location块。
keepalive_timeout 60;
# 解决TCP小包问题
tcp_nodelay on;
# 另一个解决TCP小包问题技术
tcp_nopush on;
# -----------------FastCGI相关-----------------
# 缓存路径文件,目录结构等级,关键字区域实际和非活动时间
#fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
# 开启fastcgi缓存并为其指定为TEST名称,降低cpu负载,防止502错误发生.
#fastcgi_cache TEST;
# 应答代码缓存时间,200和302应答缓存为1个小时,301一天,其他1分钟
#fastcgi_cache_valid 200 302 1h;
#fastcgi_cache_valid 301 1d;
#fastcgi_cache_valid any 1m;
# 连接到后端fastcgi超时时间
fastcgi_connect_timeout 300;
# 向fastcgi请求超时时间(这个指定值已经完成两次握手后向fastcgi传送请求的超时时间)
fastcgi_send_timeout 300;
# 接收fastcgi应答超时时间(这个指定值已经完成两次握手后向fastcgi传送应答的超时时间)
fastcgi_read_timeout 300;
# 读取fastcgi应答第一部分需要多大缓冲区,该值表示使用1个64kb的缓冲区读取应答第一部分(应答头)
# 可以设置为fastcgi_buffers选项缓冲区大小
fastcgi_buffer_size 64k;
# 需要多少和多大的缓冲区来缓冲fastcgi应答请求
fastcgi_buffers 4 64k;
# 默认值是fastcgi_buffer的2倍
fastcgi_busy_buffers_size 128k;
# 写入缓存文件使用多大的数据块,默认值是fastcgi_buffer的2倍
fastcgi_temp_file_write_size 256k;
# -----------------限速相关-----------------
# 连接数限制区域配置 配合server块内的 limit_conn perip X
#limit_conn_zone $binary_remote_addr zone=perip:10m;
#server{
# 调用http块内的limit_conn_zone区域设置并发连接数
#limit_conn perip 2;
# 下载速度限制
#limit_rate 2048k;
#}
# -----------------gzip相关(可以在Server块内)-----------------
# 开启gzip压缩
gzip on;
# 触发gzip压缩大小
gzip_min_length 1k;
# gzip压缩缓存数量和大小
gzip_buffers 4 16k;
# 触发gzip压缩的最小http版本
gzip_http_version 1.1;
# 压缩比 1-9 9最高
gzip_comp_level 2;
# 触发压缩的请求类型
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
# 添加vary头 让代理服务器判断是否压缩
gzip_vary on;
# Nginx作为反向代理的时候启用,根据某些请求和应答来决定是否在对代理请求的应答启用gzip压缩
gzip_proxied expired no-cache no-store private auth;
# IE1-6版本禁用gzip压缩
gzip_disable "MSIE [1-6]\.";
# 隐藏nginx版本号
server_tokens off;
# 取消服务日志
access_log off;
# 自定义日志格式
#log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';
# 使用自定义格式启用服务日志
#access_log logs/access.log myFormat;
# -----------------负载均衡相关-----------------
# server块或location块使用 proxy_pass http://mysvr; 请求转向mysvr 定义的服务器列表
#include upstream.conf;
# -----------------反向代理相关-----------------
#include reverse-proxy.conf;
# -----------------默认Server-----------------
server{
# 监听端口
# default_server参数:将此server块设置为默认Server处理没有匹配到server_name的请求
listen 80 default_server;
# 主机名
# 支持通配符*和正则 下划线表示一个无效的主机名
server_name _;
# 关闭服务日志 日志使用参考上文
access_log off;
# 直接返回444错误码 过滤所有未绑定主机名的请求
return 444;
}
# -----------------加载虚拟主机server块-----------------
# 目录下含3个例子 基本 https 反向代理
include vhost/*.conf;
}
2.负载均衡
upstream.conf
upstream mysvr {
# 设置负载均衡服务器
# weight,表示权重 默认1
# down,表示当前的server暂时不参与负载均衡。
# backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
# max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
# fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
server 127.0.0.1:3333;
server 127.0.0.1:4444 backup;
# 使用IP HASH将同一IP请求发给同一服务器
ip_hash;
}
3.反向代理
reverse-proxy.conf
# 如果被代理服务器返回的状态码为400或者大于400,设置的error_page配置起作用。默认为off。
#proxy_intercept_errors on;
# 只允许客户端的请求方法 post/get
#proxy_method get;
# Nginx服务器提供代理服务的http协议版本1.0,1.1,默认设置为1.0版本
#proxy_http_version 1.0 ;
#-------------解决超时时间过长问题---------
# nginx服务器与被代理的服务器建立连接的超时时间,默认60秒
proxy_connect_timeout 3;
# nginx服务器想被代理服务器组发出read请求后,等待响应的超时间,默认为60秒
proxy_read_timeout 3;
# nginx服务器想被代理服务器组发出write请求后,等待响应的超时间,默认为60秒。
proxy_send_timeout 3;
# 客户端断网时,nginx服务器是否终端对被代理服务器的请求。默认为off。
proxy_ignore_client_abort on;
# 反向代理upstream中设置的服务器组,出现故障时,顺序交给下一台服务器处理
# 状态值可以是:error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
# error:建立连接或向被代理的服务器发送请求或读取响应信息时服务器发生错误。
# timeout:建立连接,想被代理服务器发送请求或读取响应信息时服务器发生超时。
# invalid_header:被代理服务器返回的响应头异常。
# off:无法将请求分发给被代理的服务器。
# http_400,....:被代理服务器返回的状态码为400,500,502,等。
#proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
# Nginx服务器不处理设置的http相应投中的头域,这里空格隔开可以设置多个。
proxy_ignore_headers "Expires" "Set-Cookie";
# 存放http报文头的哈希表容量上限,默认为512个字符。
proxy_headers_hash_max_size 1024;
# nginx服务器申请存放http报文头的哈希表容量大小。默认为64个字符。
proxy_headers_hash_bucket_size 128;
# 重用上次ssl连接 如发生SSL3_GET_FINSHED:digest check failed错误则关闭
proxy_ssl_session_reuse on;
# 临时文件路径 数字1 2表示级别 代表1级目录1位长度 二级目录2位长度
proxy_temp_path /home/proxytmp 1 2;
# 设置缓存文件区域 cache_one 是区域名 levels是目录级别和长度 inactive表示时间 max_size限制最大长度
proxy_cache_path /home/proxycache levels=1:2 keys_zone=cache_one:20m inactive=1d max_size=32g;
# 启用缓存文件
proxy_cache cache_one;
# response的缓存大小
proxy_buffer_size 32k;
# proxy_buffering 开启的时候,proxy_buffers 和 proxy_busy_buffers_size 才会起作用
proxy_buffering on;
# 每个request的缓存的数量和大小。
proxy_buffers 4 64k;
# 忙时request缓存的最大值
proxy_busy_buffers_size 128k;
# 一次访问能写入的临时文件的大小
proxy_temp_file_write_size 128k;
4.开启php
enable-php.conf
# 匹配所有php结尾的文件
location ~ [^/]\.php(/|$)
{
# 所有文件不匹配返回404
try_files $uri =404;
# 锁
fastcgi_pass unix:/tmp/php-cgi.sock;
# 主页
fastcgi_index index.php;
# 加载fastcgi配置
include fastcgi.conf;
}
5.虚拟主机配置文件
5.1.一般主机
server{
# 监听端口
listen 80;
# 主机名 支持通配符*和正则
server_name www.xxx.com;
# 默认主页文件
index index.html index.htm index.php;
# 主机路径
root /home/wwwroot/default;
# 错误页
#error_page 404 /404.html;
# 开启php
include enable-php.conf;
# nginx运行信息
location /nginx_status
{
stub_status on;
access_log off;
}
# 图片缓存时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
# js css缓存时间
location ~ .*\.(js|css)?$
{
expires 12h;
}
# 允许访问域名验证目录
location ~ /.well-known {
allow all;
}
# 拒绝其他.开头的隐藏文件访问
location ~ /\.
{
deny all;
}
# 服务日志
access_log /home/wwwlogs/xxx.log;
}
5.2.HTTPS主机
server{
# 监听端口
listen 80;
# 主机名
server_name www.xxx.com;
# 301重定向https
return 301 https://$host$request_uri;
}
server{
# 监听端口 使用ssl 和http2
listen 443 ssl http2;
# 主机名
server_name www.xxx.com;
# 默认主页
index index.html index.htm index.php default.html default.htm default.php;
# 根目录
root /home/wwwroot/default;
# ssl证书
ssl_certificate /usr/local/nginx/conf/ssl/xxx.com.crt;
# ssl密钥
ssl_certificate_key /usr/local/nginx/conf/ssl/xxx.com.key;
# ssl会话超时时间
ssl_session_timeout 5m;
# 密码格式
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
ssl_prefer_server_ciphers on;
# 加密方式
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
# 会话缓存
ssl_session_cache builtin:1000 shared:SSL:10m;
# 使用openssl生成公钥证书
# openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
# 加载公钥证书
ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
# 错误页
#error_page 404 /404.html;
# 开启PHP
include enable-php.conf;
# 图片缓存时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
# js css缓存时间
location ~ .*\.(js|css)?$
{
expires 12h;
}
# 允许访问域名验证目录
location ~ /.well-known {
allow all;
}
# 拒绝其他.开头的隐藏文件访问
location ~ /\.
{
deny all;
}
# 服务日志
access_log /home/wwwlogs/xxx.log;
}
5.3.反向代理主机
server {
# 监听端口
listen 80;
# 主机名
server_name www.xxx.com;
# 匹配顺序
# location = /uri =表示精确匹配 只有完全匹配上才能生效
# location ^~ /uri ^~表示开头对URL路径进行前缀匹配 并且在正则之前
# location ~ pattern ~表示区分大小写的正则匹配
# location ~* pattern ~*表示不区分大小写的正则匹配
# location /uri 不带任何修饰符 也表示前缀匹配 但是在正则匹配之后
# location / 通用匹配 任何未匹配到其它location的请求都会匹配
location / {
# 反向代理地址
# 结尾带/表示URI里去掉location匹配部分后转发
# 结尾不带/表示原URI转发
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $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-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
# 关闭日志
access_log off;
}
5.3.反向代理HTTPS主机
server{
# 监听端口
listen 80;
# 主机名
server_name www.xxx.com;
# 301重定向https
return 301 https://$host$request_uri;
}
server {
# 监听端口 使用ssl 和http2
listen 443 ssl http2;
# 主机名
server_name www.xxx.com;
# ssl证书
ssl_certificate /usr/local/nginx/conf/ssl/xxx.com.crt;
# ssl密钥
ssl_certificate_key /usr/local/nginx/conf/ssl/xxx.com.key;
# ssl会话超时时间
ssl_session_timeout 5m;
# 密码格式
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
ssl_prefer_server_ciphers on;
# 加密方式
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
# 会话缓存
ssl_session_cache builtin:1000 shared:SSL:10m;
# 使用openssl生成公钥证书
# openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
# 加载公钥证书
ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
# 匹配顺序
# location = /uri =表示精确匹配 只有完全匹配上才能生效
# location ^~ /uri ^~表示开头对URL路径进行前缀匹配 并且在正则之前
# location ~ pattern ~表示区分大小写的正则匹配
# location ~* pattern ~*表示不区分大小写的正则匹配
# location /uri 不带任何修饰符 也表示前缀匹配 但是在正则匹配之后
# location / 通用匹配 任何未匹配到其它location的请求都会匹配
location / {
# 反向代理地址
# 结尾带/表示URI里去掉location匹配部分后转发
# 结尾不带/表示原URI转发
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $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-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
# 关闭日志
access_log off;
}