nginx配置

nginx基础指令及初始配置解析

nginx 常用命令

  • ./nginx -s stop :强制停止nginx
  • ./nginx -s quit: 优雅停止nginx,即处理完所有请求后再停止服务
  • ./nginx -t :检测配置文件是否有语法错误
  • ./nginx -v: 查看nginx的版本号
  • ./nginx -V :查看版本号和配置选项信息
  • ./nginx -c:设置配置文件(默认是:/etc/nginx/nginx.conf
  • ./nginx -s reload: 重新加载配置文件

nginx docker 相关指令

  • 拉取 nginx 镜像:docker pull nginx

  • 启动 nginx 容器实例:

    1
    docker run -itd --name nginx-demo -p 8080:80 nginx
    • -itd-t 选项让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开,-d是后台运行
    • --name nginx-demo:指定容器实例名称nginx-demo
    • -p 8080:80:将本机 8080 端口映射为容器的 80 端口
  • 进入容器:docker exec -it nginx-demo bash

  • 终止容器:docker container stop nginx-demo

  • 删除容器:docker container rm nginx-demo

  • 启动已终止的容器:docker container start nginx-demo

  • 查询当前运行的容器:docker container ls

  • 查询所有的容器:docker container ls -a

  • 更多的docker指令见《Docker — 从入门到实践》

nginx 默认配置文件解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限
user nginx;
# worker进程工作数设置,一般来说CPU有几个,就设置几个
worker_processes 1;

# 设置日志级别,debug | info | notice | warn | error | crit | alert | emerg,错误级别从左到右越来越大
error_log /var/log/nginx/error.log warn;
# 设置nginx进程 pid
pid /var/run/nginx.pid;

# 设置工作模式
events {
# 每个worker允许连接的客户最大连接数
worker_connections 1024;
}

# http 是指令块,针对http网络传输的一些指令配置
http {
# include 引入外部配置,提高可读性,避免单个配置文件过大
include /etc/nginx/mime.types;
# 设置HTTP默认的 content-type
default_type application/octet-stream;
# 设置日志格式,各项含义如下:
# $remote_addr:客户端ip
# $remote_user:远程客户端用户名,一般为:’-’
# $time_local:时间和时区
# $request:请求的url以及method
# $status:响应状态码
# $body_bytes_send:响应客户端内容字节数
# $http_referer:记录用户从哪个链接跳转过来的
# $http_user_agent:用户所使用的代理,一般来时都是浏览器
# $http_x_forwarded_for:通过代理服务器来记录客户端的ip
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

# sendfile 使用高效的文件传输,提升传输性能,启用后才能使用tcp_nopush,指当数据表累积到一定的大小后才发送,提高效率
sendfile on;
#tcp_nopush on;

# 设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗
keepalive_timeout 65;

# 开启gzip压缩功能,提高传输效率,节约带宽
#gzip on;

# include 引入外部配置,提高可读性,避免单个配置文件过大
include /etc/nginx/conf.d/*.conf;
}

root 与 alias

假如服务器路径为:/home/leeyom/files/img/header.png

  • root 路径完全匹配访问:

    1
    2
    3
    location /leeyom { 
    root /home
    }

    用户访问的请求为:url:port/leeyom/files/img/header.png

  • alias 可以为你的路径做一个别名,对用户透明:

    1
    2
    3
    location /hello { 
    alias /home/leeyom
    }

    用户访问的请求为:url:port/hello/files/img/header.png,相当于给 leeyom 目录做一个别名。

location 的匹配规则

  • 空格:默认匹配,普通匹配

    1
    2
    3
    location / { 
    root /home
    }

    用户可以访问 home 目录下的所有文件。

  • =:精确匹配

    1
    2
    3
    location = /leeyom/files/img/header.png { 
    root /home;
    }

    用户只能访问此路径/home/leeyom/files/img/header.png下的header.png图片。

  • ~*:匹配正则表达式,不区分大小写

    1
    2
    3
    location ~* \.(GIF|jpg|png|jpeg|gif) { 
    root /home;
    }

    用户可以访问 home 目录下的只要后缀为GIF|jpg|png|jpeg|gif的文件,由于不区分大小写,如果访问的是 header.GIF图片,会重定向访问header.gif图片。

  • ~:匹配正则表达式,区分大小写

    1
    2
    3
    location ~ \.(GIF|jpg|png|jpeg|gif) { 
    root /home;
    }

    用户可以访问 home 目录下的只要后缀为GIF|jpg|png|jpeg|gif的文件。

  • ^~:以某个字符路径开头请求

    1
    2
    3
    location = ^~ /leeyom/files/img { 
    root /home;
    }

    用户只能访问此路径/home/leeyom/files/img/下的文件。

nginx 跨域配置

server 块里面增加:

1
2
3
4
5
6
7
8
# 允许跨域请求的域,*代表允许所有的域
add_header 'Access-Control-Allow-Origin' *;
# 允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
# 允许请求的header,比如:Authorization,Content-Type,Accept,Origin,User-Agent 等
add_header 'Access-Control-Allow-Headers' *;
# 允许请求的方法,比如:GET、POST、PUT、DELETE
add_header 'Access-Control-Allow-Methods' *;

nginx 防盗链

1
2
3
4
5
6
# 对源站点进行验证(白名单),多个域名用空格隔开
valid_referers *.leeyom.com;
# 非法访问则返回403
if($invalid_referer){
return 403;
}

nginx 搭建 Tomcat 集群简版配置

1
2
3
4
5
6
7
8
9
10
11
12
upstream tomcats {
server 192.168.1.174:8080;
server 192.168.1.175:8080;
server 192.168.1.176:8080;
}
server {
listen 80;
server_name www.tomcats.com;
location / {
proxy_pass: http://tomcats;
}
}

访问www.tomcats.com,将以轮询方式,分别访问三台 Tomcat,当然也可以使用加权轮询,例如:

1
2
3
server 192.168.1.174:8080 weight=1;
server 192.168.1.175:8080 weight=2;
server 192.168.1.176:8080 weight=5;

weight的值越大,当前服务器的 Tomcat 被访问的几率越大。

upstream 指令

1
2
3
server 192.168.1.174:8080 max_conns=2;
server 192.168.1.175:8080 max_conns=2;
server 192.168.1.176:8080 max_conns=2;
  • max_conns:限制每台server的连接数,用于保护避免过载,可起到限流作用;
1
2
3
server 192.168.1.174:8080 weight=1;
server 192.168.1.175:8080 weight=2;
server 192.168.1.176:8080 weight=5 slow_start=60s;
  • slow_start:缓慢启动,weight逐渐增大,使某台服务器慢慢加入集群,方便该服务器完成一些前置化的操作,该指令需要注意:

    • 只能在商业版中使用;

    • 该参数不能使用在hashrandom load balancing中;

    • 如果upstream中只有一台 server,则该参数无效;

  • down:标记服务节点不可用

  • backup:表示当前服务器节点是备用机, 只有在其他的服务器都宕机以后, 自己才会加入到集群中, 被用户访问到

    • backup参数不能使用在hashrandom load balancing中;
  • max_fails:表示失败几次,则标记 server 已宕机,踢出服务,默认值为1

  • fail_timeout:表示失败的重试时间,默认值 10s

    • 示例:max_fails=2 fail_timeout=15s :15 秒内,请求某一 server 失败达 2 次后,则认为此 server 已经宕机,随后再过 15 秒,这 15 秒内不会有新的请求到达刚宕机的节点,会请求到正常的运行的 server,15秒后会有新请求再次请求挂掉的 server,如果还是失败,重复之前的操作;

Keepalived 提高吞吐量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
upstream tomcats {
server 192.168.1.174:8080;
server 192.168.1.175:8080;
server 192.168.1.176:8080;
# 设置长连接处理的数量
keepalive 32;
}
server {
listen 80;
server_name www.tomcats.com;
location / {
proxy_pass: http://tomcats;
# 设置长连接http的版本号
proxy_http_version 1.1;
# 清除 connection header 信息
proxy_set_header Connection "";
}
}

nginx的反向代理缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
# proxy_cache_path 设置缓存目录
# keys_zone 设置共享内存以及占用空间大小
# max_size 设置缓存大小
# inactive 超过此时间则被清理
# use_temp_path 临时目录,使用后会影响nginx性能
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=1m use_temp_path=off;
location / {
proxy_pass http://tomcats;
# 启用缓存,和keys_zone一致
proxy_cache mycache;
# 针对200和304状态码缓存时间为8小时
proxy_cache_valid 200 304 8h;
}

配置ssl证书

  1. 安装 ssl 模块

  2. 将 ssl 证书*.crt和私钥*.key拷贝到/usr/local/nginx/conf目录中

  3. 新增 server 监控 443 端口:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    server{
    listen 443;
    server_name www.leeyom.me;
    # 开启ssl
    ssl on;
    # 配置ssl证书
    ssl_certificate yourdomain.com.crt;
    # 配置证书秘钥
    ssl_certificate_key yourdomain.com.key;
    # ssl会话cache
    ssl_session_cache shared:SSL:1m;
    # ssl会话超时时间
    ssl_session_timeout 5m;
    # 配置加密套件,写法遵循 openssl 标准
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-G
    }

nginx配置https

1.准备材料

  • 域名完成备案
  • 阿里云申请ssl证书
  • 下载证书的秘钥放到cert目录

2.nginx配置

  • 安装好nginx的服务器
  • 编辑nginx.conf文件添加以下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443 ssl; # 1.1版本后这样写
server_name www.caiqichang.cn; #填写绑定证书的域名
ssl_certificate /usr/local/nginx/conf/cert/www.caiqichang.cn.pem; # 指定证书的位置,绝对路径
ssl_certificate_key /usr/local/nginx/conf/cert/www.caiqichang.cn.key; # 绝对路径,同上
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
root html; #站点目录,绝对路径
index cqc.html cqc.htm;
}
}
server {
listen 80;
server_name caiqichang.cn www.caiqichang.cn;
rewrite ^(.*)$ https://www.caiqichang.cn permanent;
}

配置完成后执行

1
./nginx -t

验证配置文件是否有误
无误后执行

1
./nginx -s reload
  • 验证

​ 1.配置安全组开放80和443端口

​ 2.服务器防火墙开放80和443端口

​ 3.验证访问就行

地址:https://caiqichang.cn https://www.caiqichang.cn

nginx部署vue等打包项目

1.准备材料

1
2
3
4
5
6
7
# 一、 vue项目
npm run build
# 得到dist文件夹
#二、 hexo 项目
hexo g
# 得到public 文件夹

上面命令得到的就是我们需要部署的项目文件

2.nginx配置

编辑nginx.conf文件添加以下代码

1
2
3
4
5
6
7
8
9
10
# 
server {
listen 80;
server_name caiqichang.cn;
location / {
root /myjar/bs/vue/ac20220425/dist; #站点目录,绝对路径
index index.html index.htm; #直接部署页面
try_files $uri $uri/ /index.html; #解决页面刷新404问题
}
}

配置完成后执行

1
./nginx -t

验证配置文件是否有误
无误后执行

1
./nginx -s reload
  • 验证

​ 地址:https://caiqichang.cn

​ 验证访问就行

nginx代理前端项目

1.准备材料

  • 需要代理的地址

    代理地址为第一个地址时,为完全代理,可以不用处理资源丢失问题,使用直接代理

    代理地址为第二个地址时,为代理二级路径,需要处理静态资源丢失问题

    1
    2
    3
    4
    5
    代理地址:
    https://blog.caiqichang.cn ---proxy_pass--> http://cactuscode.gitee.io/cqc-blog/
    当访问首页加载的css(http://cactuscode.gitee.io/cqc-blog/css/main.css )访问的静态资源
    页面真实访问:https://blog.caiqichang.cn/cqc-blog/css/main.css === http://cactuscode.gitee.io/cqc-blog/cqc-blog/css/main.css
    上面的路径为不存在路径,需要处理访问为存在的

2.nginx配置

编辑nginx.conf文件添加以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#blog.caiqichang.cn

server {
listen 443 ssl; # 1.1版本后这样写
server_name blog.caiqichang.cn; #填写绑定证书的域名
ssl_certificate /usr/local/nginx/conf/cert/blog.caiqichang.cn.pem; # 指定证书的位置,绝对路径
ssl_certificate_key /usr/local/nginx/conf/cert/blog.caiqichang.cn.key; # 绝对路径,同上
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;

#处理css丢失 此处配置一定要在 location / 之前,优先级问题 (很多类似的都可以这样配置)
location /cqc-blog/ {
proxy_pass http://cactuscode.gitee.io/cqc-blog/;
}


location / {
proxy_pass http://cactuscode.gitee.io/cqc-blog/; #代理地址

}

}
server {
listen 80;
server_name blog.caiqichang.cn;
rewrite ^(.*)$ https://$host$1 permanent;
}

配置完成后执行

1
./nginx -t

验证配置文件是否有误
无误后执行

1
./nginx -s reload
  • 验证

​ 地址:https://blog.caiqichang.cn

​ 验证访问就行

nginx代理ws成为wss

1.准备材料

2.nginx配置

编辑nginx.conf文件添加以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#api.caiqichang.cn

server {
listen 443 ssl; # 1.1版本后这样写
server_name api.caiqichang.cn; #填写绑定证书的域名
ssl_certificate /usr/local/nginx/conf/cert/api.caiqichang.cn.pem; # 指定证书的位置,绝对路径
ssl_certificate_key /usr/local/nginx/conf/cert/api.caiqichang.cn.key; # 绝对路径,同上
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location /ws {
proxy_pass http://localhost:8888/system/ws; #代理端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location / {
proxy_pass http://localhost:8888; #代理端口
}



}
server {
listen 80;
server_name api.caiqichang.cn;
rewrite ^(.*)$ https://$host$1 permanent;
}

配置完成后执行

1
./nginx -t

验证配置文件是否有误
无误后执行

1
./nginx -s reload
  • 验证

    地址 :wss://api.caiqichang.cn/ws

​ 验证访问就行


nginx配置
https://cai-qichang.github.io/2023/08/24/nginx配置/
作者
caiqichang
发布于
2023年8月24日
许可协议
BY-蔡奇倡