目录
- 常用启停命令
- Nginx 常见问题
- Nginx 如何忽略非标准http头检测?
- Nginx websocket代理
- Nginx 临时缓存不够导致下载文件失败
- Nginx 没有临时缓存目录权限导致下载文件失败
- Nginx非root用户启动无法使用80端口或者报无权限异常
- 路由重写怎么配置?
- nginx 根据ip hash负载怎么配置?
- Nginx 日志输出怎么配置?
- Nginx 如何替换Html插入变量?
- Nginx 前端配置
- vue hash模式配置
- vue history模式配置
- nginx gzip配置
- gzip 动态压缩
- gzip 静态压缩
- 附录
- try_files
常用启停命令
注意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。
- try_files
还没有评论,来说两句吧...