Nginx常见配置

文件结构

...              #全局块

events { #events块
...
}

http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}

全局块

配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

events块

配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

http块

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

server块

配置虚拟主机的相关参数,一个http中可以有多个server。

location块

配置请求的路由,以及各种页面的处理情况。

示例

########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#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 log/access.log myFormat; #combined为日志格式的默认值
#设置允许客户端请求的最大的单个文件字节数
#client_max_body_size 20M;
#指定来自客户端请求头的headebuffer大小
#client_header_buffer_size 32k;
#指定连接请求试图写入缓存文件的目录路径
#client_body_temp_path /dev/shm/client_body_temp;
#指定客户端请求中较大的消息头的缓存最大数量和大小,目前设置为4个32KB
#large client_header_buffers 4 32k;

#开启高效文件传输模式
sendfile on;
#开启防止网络阻塞
#tcp_nopush on;
#开启防止网络阻塞
#tcp_nodelay on;

#设置客户端连接保存活动的超时时间
#keepalive_timeout 0;
keepalive_timeout 65;

#设置客户端请求读取超时时间
#client_header_timeout 10;
#设置客户端请求主体读取超时时间
#client_body_timeout 10;
#用于设置相应客户端的超时时间
#send_timeout

####HttpGZip模块配置
#httpGzip modules
#开启gzip压缩
#gzip on;
#设置允许压缩的页面最小字节数
#gzip_min_length 1k;
#申请4个单位为16K的内存作为压缩结果流缓存
#gzip_buffers 4 16k;
#设置识别http协议的版本,默认为1.1
#gzip_http_version 1.1;
#指定gzip压缩比,1-9数字越小,压缩比越小,速度越快
#gzip_comp_level 2;
#指定压缩的类型
#gzip_types text/plain application/x-javascript text/css application/xml;
#让前端的缓存服务器进过gzip压缩的页面
#gzip_vary on;

upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}

上面是nginx的基本配置,需要注意的有以下几点:

1、参数相关

$remote_addr与$http_x_forwarded_for 用以记录客户端的ip地址;
$remote_user :用来记录客户端用户名称;
$time_local : 用来记录访问时间与时区;
$request : 用来记录请求的url与http协议;
$status : 用来记录请求状态;成功是200,
$body_bytes_s ent :记录发送给客户端文件主体内容大小;
$http_referer :用来记录从那个页面链接访问过来的;
$http_user_agent :记录客户端浏览器的相关信息;

2、每个指令必须有分号结束。

常用功能

http代理、反向代理

项目地址:http://192.168.37.136:8080/a/

nginx地址:192.168.37.133的服务器下面安装成功了Nginx。

那怎么样将tomcat下部署的网站使用Nginx代理呢?

下面是server相关的代理配置:

http {
include mime.types;
default_type application/octet-stream;

sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#配置tomcat的IP地址和访问端口
upstream gw {
server 192.168.37.136:8080 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
#Nginx代理配置
location /a {
proxy_pass http://gw/a;
}
location /sapi {
proxy_pass http://gw/shopappapi;
}
location /cas{
proxy_pass http://gw/cas-server-webapp-4.0.0/login;
}
location /doc{
proxy_pass http://gw/docs;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

负载均衡

  1. 配置upstream

    http {

    ……
    upstream myserver {
    server 192.168.11.110:8080;
    server 192.168.11.110:8081;
    }
    ……

    }
  2. 配置location

    server {
    listen 80;
    server_name 192.168.11.110;

    location / {
    proxy_pass http://myserver;
    root html;
    index index.html index.htm;
    }
    }
  3. 几种分配策略

    1.轮询(默认的策略)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,自动剔除
    2.weight(权重)
    upstream myserver {
    server 192.168.11.110:8080 weight=10;
    server 192.168.11.110:8081 weight=10;
    }
    3.ip_hash
    upstream myserver{    
    ip_hash;
    server 192.168.11.110:8080;
    server 192.168.11.110:8081;
    }
    4.fair后端服务器谁响应时间越短,就分配给谁
    upstream myserver {
    server 192.168.11.110:8080;
    server 192.168.11.110:8081;     fair;
    }

web缓存

配置方式

image-20240117214553928

http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;


●path:强制参数,指定缓存文件的存放路径。
●levels:定义了缓存目录的层级。每层可以用1(最多16种选择,0-f)或2(最多256种选择,00-ff)表示,中间用 : 分隔。
proxy_cache_path /data/nginx/cache; 代表所有缓存只有一个目录,比如/data/nginx/cache/d7b6e5978e3f042f52e875005925e51b
proxy_cache_path /data/nginx/cache levels=1:2; 代表缓存是二层目录(有16*256=4096个目录),比如/data/nginx/cache/b/51/d7b6e5978e3f042f52e875005925e51b
●keys_zone:强制参数,定义共享内存区的名称和大小,该共享内存用于保存缓存项目的元数据(所有活动的key和缓存数据相关的信息),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key。
●inactive:删除指定时间内未被访问的缓存文件,默认10分钟。
●max_size:设置了缓存存储的上限,如果不指定,最大会用掉所有磁盘空间。
●use_temp_path:直接把临时文件放在缓存目录中。
upstream cache_server{
server 192.168.60.44:80;
server 192.168.60.112:80;
}

server {
listen 80;
server_name www.kfc.com;
location / {
proxy_cache my_cache; #指定用于页面缓存的共享内存,zone名称由proxy_cache_path指令定义
proxy_cache_valid 200 5m; #为不同的响应状态码设置不同的缓存时间,此为缓存状态码为200的请求,缓存时长为5分钟
proxy_cache_key $request_uri; #指定缓存文件的key为请求的URI
add_header Nginx-Cache-Status $upstream_cache_status#把缓存状态设置为头部信息,响应给客户端
proxy_pass http://cache_server; #设置代理转发的后端服务器的协议和地址
}
}
}
#对于一些实时性要求非常高的页面或数据来说,就不应该去设置缓存,下面来看看如何配置不缓存的内容。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name cache.lion.club;
#URI 中后缀为 .txt 或 .text 的设置变量值为 "no cache"
if ($request_uri ~ \.(txt|text)$) {
set $cache_name "no cache"
}

location / {
proxy_no_cache $cache_name; #判断该变量是否有值,如果有值则不进行缓存,如果没有值则进行缓存
proxy_cache my_cache; #设置缓存内存
proxy_cache_valid 200 5m; #缓存状态为200的请求,缓存时长为5分钟
proxy_cache_key $request_uri; #缓存文件的key为请求的URI
add_header Nginx-Cache-Status $upstream_cache_status #把缓存状态设置为头部信息,响应给客户端
proxy_pass http://cache_server; #代理转发
}
}

重定向

重定向的写法比较多有的版本不支持。下面是最新的写法。

server {
listen 80;
server_name domain.com;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl;
server_name domain.com;
}
Nginx http和https访问配置

同一域名下在开启https的时候访问http的地址会404,可以通过简单的配置重定向实现http也能访问。

server
{
listen 80;
listen 443 ssl;
ssl on;
server_name 域名;
index index.html index.htm index.php default.html default.htm default.php;
ssl_certificate /usr/local/nginx/cert/21402058063066221.pem; //下载申请后阿里ssh提供的pem
ssl_certificate_key /usr/local/nginx/cert/21402058063066221.key;//下载申请后阿里ssh提供的key
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;


root /home/wwwroot/网站目录;

include laravel.conf; //好吧,这里是laravel配置,不一定合适您哈,请或略
#error_page 404 /404.html;
include enable-php.conf;

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

location ~ .*\.(js|css)?$
{
expires 12h;
}

上面监听的80端口,443端口就没有意义了,既然是https传输数据我们必须将http转发到https上。

这里需要写一个重定向,也就是需要加一个server,监听80端口并转发到443server上。

server {
listen 80;
server_name www.domain.com;
rewrite ^/(.*) https://$server_name$1 permanent; #跳转到Https
}

或者

rewrite ^/(.*)$ https://domain.com/$1 permanent;

或者

rewrite ^ https://domain.com$request_uri? permanent;

博客Nginx配置

user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name quxingping.com;
return 301 http://blog.quxingping.com;
}
server {
listen 80;
server_name blog.quxingping.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name blog.quxingping.com;
#ssl on;
root /home/hexo;
index index.html index.htm;
ssl_certificate cert/a.crt;
ssl_certificate_key cert/a.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

}
server {
listen 80;
server_name biji.quxingping.com;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 400 403 404 497 https://$host$uri$args;
}

server {
listen 80;
server_name upload.quxingping.com;
location / {
root html;
index index.html index.htm;
}
}
}