记录为自己后期查阅方便
# 配置 nginx 用户及组:用户 组,window 下不指定
#user nobody;
# 工作进程数目,根据硬件调整,通常等于 CPU 数量或者 2 倍于CPU。
worker_processes 1;
# 错误日志:存放路径 日志级别
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# pid(进程标识符):存放路径,windows 放在 logs/nginx.pid
pid /usr/local/nginx/logs/nginx.pid;
# 一个进程能打开的文件描述符最大值,理论上该值因该是最多能打开的文件数除以进程数
# 但是由于 nginx 负载并不是完全均衡的,所以这个值最好等于最多能打开的文件数
# Linux 系统可以执行 sysctl -a | grep fs.file 可以看到 Linux 文件描述符
worker_rlimit_nofile 65535;
events {
# 使用 epoll 的 I/O 模型。Linux 建议 epoll,FreeBSD 建议采用 kqueue,window 下不指定。
use epoll;
# 单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 1024;
# 客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,
# 一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
client_header_buffer_size 4k;
}
http {
# 设定 mime 类型, 类型由 mime.type 文件定义
include mime.types;
default_type application/octet-stream;
# 日志格式设置
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 用了 log_format 指令设置了日志格式之后,需要用 access_log 指令指定日志文件的存放路径
# 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息
# 这里的 main 就是上面定义的日志格式名称
access_log logs/host.access.log main;
# 服务器名字的 hash 表大小
server_names_hash_bucket_size 128;
# 客户端请求头缓冲大小
# nginx 默认会用 client_header_buffer_size 这个 buffer 来读取 header 值
# 如果 header 过大,它会使用 large_client_header_buffers 来读取
# 如果设置过小的 HTTP 头,或 Cookie 过大, 会报400 错误 nginx 400 bad request
# 如果超过 buffer,就会报 HTTP 414 错误 (URI Too Long)
# nginx 接受最长的 HTTP 头部大小必须比其中一个 buffer 大
# 否则就会报 400 的 HTTP 错误 (Bad Request)
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
# 隐藏ngnix版本号
server_tokens off;
# 忽略不合法的请求头
ignore_invalid_headers on;
# 让 nginx 在处理自己内部重定向时不默认使用 server_name 设置中的第一个域名
server_name_in_redirect off;
# 客户端请求体的大小
client_body_buffer_size 8m;
# 开启文件传输,一般应用都应设置为 on;
# 若是有下载的应用,则可以设置成 off 来平衡网络 I/O 和磁盘的 I/O 来降低系统负载
sendfile on;
# 告诉 nginx 在一个数据包里发送所有头文件,而不一个接一个的发送
tcp_nopush on;
# tcp_nodelay off 会增加通信的延时,但是会提高带宽利用率
# 在高延时、数据量大的通信场景中应该会有不错的效果
# tcp_nodelay on,会增加小包的数量,但是可以提高响应速度
# 在及时性高的通信场景中应该会有不错的效果
tcp_nodelay on;
# 长连接超时时间,单位是秒
keepalive_timeout 65;
# gzip模块设置,使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。
# 开启gzip
gzip on;
# 最小压缩大小
gzip_min_length 1k;
# 压缩缓冲区
gzip_buffers 4 16k;
# 压缩版本
gzip_http_version 1.0;
# 压缩等级
gzip_comp_level 2;
# 压缩类型
gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;
# 负载均衡
# max_fails 为允许请求失败的次数,默认为1
# weight 为轮询权重,根据不同的权重分配可以用来平衡服务器的访问率。
upstream myServer{
server 192.168.247.129:8080 max_fails=3 weight=2;
server 192.168.247.129:8081 max_fails=3 weight=4;
}
server {
listen 80;
# IP/域名可以有多个,用空格隔开
server_name 192.168.247.129;
server_name www.test.com;
charset koi8-r;
access_log logs/host.access.log main;
# 反向代理配置,
# 将所有请求为 www.test.com 的请求全部转发到 upstream 中定义的目标服务器中。
location / {
# 此处配置的域名必须与upstream的域名一致,才能转发。
#proxy_pass http://192.168.247.129:8080;
proxy_pass http://myServer;
# nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 20;
# 允许客户端请求的最大单文件字节数
client_max_body_size 10m;
# 缓冲区代理缓冲用户端请求的最大字节数
client_body_buffer_size 128k;
# 后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 300;
# 连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 300;
# 设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
# proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_buffers 4 32k;
# 高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 64k;
# 设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 64k;
root html;
# 定义首页索引文件的名称
index index.html index.htm;
}
# 动静分离静态资源走 linux 动态资源走 tomcat
# 注意 /source/image/ 下面寻找资源
location /image/ {
root /source/;
autoindex on;
}
# 出现 50x 错误时,使用 /50x.html 页返回给客户端
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# 下面是配置生产环境中既支持 HTTP 又支持 HTTPS, 保证用户在浏览器中输入 HTTP 也能正常访问
# SSL证书 配置
# 加密证书路径
ssl_certificate cert/yphtoy.com.pem;
#加密私钥路径
ssl_certificate_key cert/yphtoy.com.key;
#加密协议
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#加密访问缓存设置,可以大大提高访问速度
ssl_session_cache shared:SSL:1m;
#加密访问缓存过期时间
ssl_session_timeout 10m;
#加密算法
ssl_ciphers HIGH:!aNULL:!MD5;
#是否由服务器决定采用哪种加密算法
ssl_prefer_server_ciphers on;
# 负载均衡
upstream api_upstream {
server 127.0.0.1:8080 max_fails=3 weight=1;
server 127.0.0.1:8081 max_fails=3 weight=1;
}
# api 接口(兼容HTTP)
server {
listen 80;
server_name api.test.com;
# 301重定向跳转到HTTPS接口
return 301 https://$server_name$request_uri;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#api 接口(兼容HTTPS)
server{
listen 443 ssl;
server_name api.test.com;
location / {
root html;
index index.html index.htm;
proxy_pass http://api_upstream;
# 语法:proxy_cookie_path oldpath replacepath;
# oldpath就是你要替换的路径 replacepath 就是要替换的值
# 作用:同一个web服务器下面多个应用之间能获取到cookie
proxy_cookie_path /api/ /;
# 服务端接收的请求头 Cooke 值不变
proxy_set_header Cookie $http_cookie;
}
}
# 管理后台端(兼容HTTP)
server {
listen 80;
server_name manage.test.com;
# 301重定向跳转到HTTPS接口
return 301 https://$server_name/$request_uri;
error_page 500 502 503 504 /50x.html;
location = /50x.html{
root html;
}
}
# 管理后台端(兼容HTTPS)
server{
listen 443 ssl;
server_name manage.test.com;
location / {
root /home/test/web/dist
index /index.html;
# 语法:try_files 【$uri】 【 $uri/】 【参数】
# 当用户请求https://manage.test.com/login时,
# 一.如果配置了上面的默认index,会依次请求
# 1./home/test/web/dist/login 查找有没有 login 这个文件,没有的话
# 2./home/test/web/dist/index.html 有就直接返回
# 二.如果没有配置了上面的默认index或者配置了没有找到对应的资源,会依次请求
# 1./home/test/web/dist/login 查找有没有 login 这个文件,没有的话
# 2./home/test/web/dist/login/ 查找有没有 login 这个目录,没有的话
# 3.请求https://manage.test.com/index.html nginx 内部做了一个子请求
# 三.总的来说, index 的优先级比 try_files 高,请求会先去找 index 配置, 这里最后一个参数必须存在
try_files $uri $uri/ /index.html;
# 解决跨域问题
# 允许跨域请求地址(*表示全部,但是无法满足带cookie请求,因为cookie只能在当前域请求)
add_header Access-Control-Allow-Origin $http_origin;
# 允许接收cookie和发送cookie
add_header Access-Control-Allow-Credentials 'true';
# 允许请求的方法
add_header Access-Control-Allow-Methods 'GET,POST,DELETE,PUT,OPTIONS';
# 允许请求头(Content-Type:请求数据/媒体类型
# x-requested-with:判断请求是异步还是同步 自定义header 比如 token)
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
# 浏览器缓存请求头信息,1800秒内,只会有1次请求,不会出现"OPTIONS"预请求,节约资源
add_header Access-Control-Max-Age '1800';
if ($request_method = 'OPTIONS') {
return 204;
}
# 服务端HttpServletRequest可以获得用户的真实ip
proxy_set_header X-Real-IP $remote_addr;
# 服务端HttpServletRequest可以获得用户的真实ip和经过的每一层代理服务器的ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 服务端接收的请求头Host值不变
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
}
}
}
启动、停止和重新加载配置
要启动 nginx 服务,请运行 nginx 可执行文件(Linux 为 nginx,Window 为 nginx.exe)。 nginx 一旦成功启动,就可以通过使用 -s 参数调用 nginx 可执行文件来控制它。使用以下语法:
nginx -s signal
其中 signal 可能是以下之一:
- stop — 快速停止 nginx 服务,即使 nginx 当前正在处理请求,也停止它。
- quit — 优雅的停止 nginx 服务,当我们发送该命令后,nginx 将不再接收新请求,等待 nginx 当前正在处理请求完成,所有正在处理的请求均处理完成后才停止。
- reload — 重新加载 nginx.conf 配置文件
- reopen — 重新打开日志文件
例如:要停止 nginx 进程以等待工作进程完成当前请求的服务,可以执行以下命令:
nginx -s quit
注意:此命令应在启动 nginx 的同一用户下执行,即使用 test 用户启动,也需要 test 用户去执行上面命令。
在重新加载配置(nginx -s reload)的命令发送到 nginx 或重新启动 nginx 之前,不会将配置文件中所做的更改应用到 nginx。要重新加载配置,请执行如下命令:
nginx -s reload
一旦主进程(master process)收到重新加载配置的信号,它会检查新配置文件的语法有效性并尝试应用其中提供的配置。如果成功,主进程启动新的工作进程并向旧的工作进程发送消息,请求它们关闭。否则,主进程将回滚更改并继续使用旧配置。旧的工作进程,接收到关闭命令,停止接受新连接并继续为当前请求提供服务,直到所有此类请求都得到服务。之后,旧的工作进程退出。
也可以借助 Unix 工具(例如 kill 实用程序)向 nginx 进程发送信号。在这种情况下,信号会直接发送到具有给定进程 ID 的进程。nginx 主进程的进程 ID 默认写入 /usr/local/nginx/logs 或 /var/run 目录下的 nginx.pid(Windows 系统下,进程ID位于 %nginx_home%/conf/nginx.pid)。例如,如果主进程 ID 是 1628,要发送 QUIT 信号导致 nginx 正常关闭,请执行:
kill -s QUIT 1628
要获取所有正在运行的 nginx 进程的列表,可以使用 ps 实用程序。命令如下:
ps -ax | grep nginx
在 Window 系统中,使用 tasklist 命令。命令如下:
tasklist | findstr nginx
location / {
proxy_pass http://MinimalApi;
sub_filter '延吉道' 'yangql';
sub_filter_types *; //用于指定替换sub_filter的文件类型,默认为text/html;*是 全部类型下全部替换
sub_filter_once off;
}