Nginx常用命令总结及常见问题排查

连续更新挑战第4天…

常用启停命令

注意nginx不同的环境安装目录可能会有所不同,请找到对应的nginx安装目录替换/usr/local/nginx/sbin

# 进入到nginx可执行文件目录(未使用systemctl来管理nginx情况下)
cd /usr/local/nginx/sbin

# 重启
./nginx -s restart

# 只重新load配置
./nginx -s reload

# 启动
./nginx

# 停止
./nginx -s stop

# 查看nginx配置文件路径和版本
nginx -t

# 查看nginx版本
nginx -v

# 查看nginx运行状态(使用systemctl管理nginx的情况下才能使用)
systemctl status nginx
systemctl restart nginx
systemctl reload nginx
systemctl stop nginx
systemctl start nginx

# 查看nginx端口状态
netstat -tuln | grep nginx

# 查看nginx访问或错误日志
tail -f /path/to/nginx/logs/acccess[error].log

# 备份nginx日志
cp /usr/local/nginx/nginx.conf /user/local/nginx/nginx.conf.bak.1

Nginx 常见问题

Nginx 如何忽略非标准http头检测?

在Nginx中,默认情况下,它会拒绝包含非标准HTTP头的请求。这是出于安全考虑,以防止可能的HTTP请求头注入攻击。如果你确实需要允许非标准HTTP头,则可以通过设置underscores_in_headers指令来实现。

以下是如何在Nginx配置中忽略非标准HTTP头检测:

http {
    ...
    underscores_in_headers on;
    ...
}

underscores_in_headers 设置为 on 会允许Nginx接受请求中带有下划线的非标准HTTP头。请注意,启用此选项可能会导致一些安全风险,因为允许非标准HTTP头可能会增加潜在的安全漏洞。因此,只有在你确信需要允许非标准HTTP头并且能够确保安全性的情况下才应该使用这个选项。

在设置underscores_in_headers时,请确保遵循安全最佳实践,并且仔细评估潜在的安全风险。

Nginx websocket代理

要在Nginx中配置WebSocket代理,你需要使用proxy_pass指令,并且启用WebSocket协议。以下是一个示例配置:

server {
    listen 80;
    server_name your_domain.com;

    location /websocket {
        proxy_pass http://backend_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

解释:

  • location /websocket指定了WebSocket的路径,即所有访问 /websocket 的请求都将被代理。
  • proxy_pass http://backend_server;指定了后端WebSocket服务器的地址。
  • proxy_http_version 1.1;指定了使用HTTP 1.1协议,这是WebSocket所需的。
  • proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";这两行指定了将请求升级为WebSocket协议,以便Nginx正确处理WebSocket连接。

确保替换 your_domain.com 为你的域名,并将 http://backend_server 替换为你的后端WebSocket服务器地址。

配置完成后,重新加载Nginx以使更改生效:

sudo systemctl reload nginx 或 nginx -s reload

这样配置后,所有访问 /websocket 的请求将被代理到后端WebSocket服务器,并且WebSocket连接将能够正常工作。

注意:如果nginx -s reload配置不能生效则需要手动重启nginx,先杀掉nginx,然后再启动nginx。

Nginx 临时缓存不够导致下载文件失败

proxy_buffer_size是用于设置Nginx代理缓冲区的大小的指令。它指定了用于存储从上游服务器接收到的响应数据的缓冲区的大小。如果响应数据的大小超过了这个值,Nginx将使用磁盘缓存或向客户端发送数据,这取决于proxy_buffering指令的设置。

默认情况下,proxy_buffer_size的值是与操作系统相关的,默认大小是4k或8k。你可以在Nginx配置中根据需要显式设置这个值,以便更好地适应你的场景。

下面是一个示例配置:

http {
    ...
    proxy_buffer_size 16k;
    ...
}

在这个示例中,proxy_buffer_size被设置为16k,这意味着Nginx将使用16k大小的缓冲区来存储从上游服务器接收到的响应数据。

要注意的是,如果你设置了proxy_buffering off;禁用了代理缓冲,proxy_buffer_size指令将被忽略,而Nginx将立即将从上游服务器接收到的响应数据发送给客户端。

确保根据你的实际需求和系统资源来调整proxy_buffer_size的大小,避免设置过大或过小的值。

Nginx 没有临时缓存目录权限导致下载文件失败

cd /ucenter/soft/nginx/sbin
chown root nginx
chmod u+s nginx

Nginx非root用户启动无法使用80端口或者报无权限异常

cd /ucenter/soft/nginx/sbin
chown root nginx
chmod u+s nginx

因为linux 80端口的使用必须要拥有root权限,上述处理方法是让nginx临时拥有超越普通用户的权限晋升到root权限,这样80端口就可以正常使用了。

路由重写怎么配置?

将/xxx/abc/123请求重写为/xxx/123并代理到http://localhost:8080,你可以使用rewrite指令结合proxy_pass指令。以下是一个示例配置:

server {
    listen 80;
    server_name your_domain.com;

    location /xxx/ {
        # 处理 /xxx/abc/123 请求,将其重写成 /xxx/123 并代理到 http://localhost:8080
        rewrite ^/xxx/abc/(.*)$ /xxx/$1 break;
        proxy_pass http://localhost:8080;
    }

    # 其他配置...
}

nginx 根据ip hash负载怎么配置?

http {
    upstream backend {
        ip_hash;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;
        server_name your_domain.com;

        location / {
            proxy_pass http://backend;
        }
    }
}

Nginx 日志输出怎么配置?

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for" "$http_cookie"';
    log_format  sendfile  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$http_cookie"';
                      
    access_log logs/access.log main; # 指定格式
    error_log logs/error.log;
}

http header 中的内容可以通过$http_xxx来输出,比如user-agent可以写成$http_user_agent,cookie 可以写成$http_cookie

Nginx 如何替换Html插入变量?

server {
    listen 8090;
    server_name localhost;

    location / {
        index index.html;
        root /Users/yueyu/Project/allens-learn/webapp/subfilter;
        # 启用 sub_filter
        sub_filter '_SERVER_ADDR' 'http://123.com';
        sub_filter_once off; # 可选,用于启用全局替换而不仅仅是第一次出现的地方
    }
}

Nginx 前端配置

vue hash模式配置

server {
    listen 8090;
    server_name localhost;

    location / {
        index index.html index.htm;
        root /webapp/app;
    }
    
    location ~ /api {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        # 可选:设置其他代理头部
        # proxy_set_header X-Forwarded-Proto $scheme;
    }
}

vue history模式配置

server {
    listen 8090;
    server_name localhost;
    
    root /webapp/app;
    
    location ~ /api/ {
        proxy_set_header Host $host;
        proxy_set_header X0Real-IP $remote_addr;
        proxy_pass http://localhost:8080;
    }
    
    location / {
        try_files $uri $uri/ /index.html;
        index index.html index.htm;
    }
}

nginx gzip配置

动态压缩和静态压缩都是用于减少HTTP响应大小,从而提高网站性能和降低带宽消耗的技术。

gzip 动态压缩

优点:

  • 适用于动态生成的内容,如通过PHP、Python或其他服务器端脚本生成的页面。
  • 可以根据请求的头信息(如Accept-Encoding)动态选择压缩算法和压缩级别。
  • 对于动态内容,可以在压缩时进行更精确的控制和优化。

缺点:

  • 对CPU资源消耗较高,特别是在高负载下可能会影响服务器性能。
  • 每次请求都需要进行压缩,可能会增加服务器负载。
  • 不适用于已经被缓存的内容,因为内容每次请求都可能是动态生成的,无法从缓存中提供。
http {
    # 开启和关闭gzip模式
    gzip on;
    # gizp压缩起点,文件大于1k才进行压缩
    gzip_min_length 1k;
    # 设置压缩所需要的缓冲区大小,以4k为单位,如果文件为7k则申请2*4k的缓冲区 
    gzip_buffers 4 16k;
    # 设置gzip压缩针对的HTTP协议版本
    gzip_http_version 1.0;
    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
    gzip_comp_level 2;
    # 进行压缩的文件类型
    gzip_types text/plain application/javascript text/css application/xml;
    # 是否在http header中添加Vary: Accept-Encoding,建议开启
    gzip_vary on;
}

gzip 静态压缩

优点:

  • 适用于静态文件,如CSS、JavaScript、图像等,这些文件的内容不会随着每次请求而改变。
  • 一次压缩,多次受益:静态文件通常只需要在首次请求时进行压缩,之后可以直接提供已经压缩过的文件,无需重复压缩。
  • 减少服务器负载:静态文件只需要在生成或修改时进行一次压缩,不会像动态内容那样每次请求都需要进行压缩处理。

缺点:

  • 不适用于动态生成的内容,因为它们无法被预先压缩。
  • 对于一些大型的静态文件,如图像和视频,压缩可能不会带来显著的性能提升。
  • 对于频繁更新的静态文件,需要确保每次更新都能及时进行压缩,否则可能会影响网站性能。

nginx 静态压缩需要使用 ngx_http_gzip_static_module 模块,先简单看一下介绍:
ngx_http_gzip_static_module 模块允许发送扩展名为 .gz 的预压缩文件,而不是常规文件。
默认情况下未构建此模块,应使用 --with-http_gzip_static_module 配置参数启用它 。
在安装包目录编译安装:

./configure --with-http_gzip_static_module

例如 Nginx 安装配置 安装 Nginx 第4步编译安装,在第一步./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35 之后加上 --with-http_gzip_static_module。

--prefix 跟的是你nginx的安装的目录

gzip_static  on;
gzip_proxied expired no-cache no-store private auth;

动静结合配置:

http {
    gzip_static  on;
    gzip_proxied expired no-cache no-store private auth;
    gzip on; 
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/javascript text/css application/xml;
    gzip_vary on;
}

附录

try_files

try_files 是nginx中一个非常有用的指令,它用于尝试寻找指定的文件或目录,并将请求重新定向到找到的第一个文件或目录。通常用于处理URL重写和错误页面等情况。

try_files file ... uri;

其中:

file … 是要尝试的文件或目录列表。
uri 是当所有文件或目录都不存在时,将请求重定向到的URI。

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值