我有一个 nginx 实例,该实例设置为将访问记录到 /var/log/nginx/access.log 并将错误记录到 /var/log/nginx/errors.log,但是一旦 logrotate 每周运行,文件就会移动到*.log.1 和新的 *.log 文件被创建,但 nginx 继续记录到 log.1 文件而不是新的 .log 文件(并且没有任何内容被压缩)。我第一次注意到这一点,自日志轮换以来已经过去了 3 周,并且日志变得越来越大。运行kill -HUP `cat /run/nginx.pid`使 nginx 再次开始记录到正确的位置,但问题在下周再次出现。
这令人沮丧的更重要的原因是我将日志设置为通过 rsyslog 上传到 Loggly,当 nginx 停止记录到文件时,我有 rsyslog 轮询,然后事情停止上传,我没有收到任何警报。
我怀疑这与重新启动 nginx 或重新加载配置有关,因为它直到我进行了配置更改并以我认为正常的方式重新加载配置后才启动。我尝试运行,kill -USR1 `cat /run/nginx.pid`但文件继续记录到错误的位置,直到我运行kill -HUP `cat /run/nginx.pid`,我已经知道这不能解决问题。
知道发生了什么吗?我承认我不是 logrotate 或 nginx 管理方面的专家,但我的谷歌在这方面失败了。
这是我的 nginx logrotate 脚本,如果您还有什么想看的,请告诉我。除了定义输出位置之外,nginx.conf 在日志记录方面没有什么特别之处。
/var/log/nginx/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts …Run Code Online (Sandbox Code Playgroud) 为了防止引用垃圾邮件,我的 nginx.conf 包含这样的部分:
if ($http_referer ~* spamdomain1\.com) {
return 444;
}
if ($http_referer ~* spamdomain2\.com) {
return 444;
}
if ($http_referer ~* spamdomain3\.com) {
return 444;
}
Run Code Online (Sandbox Code Playgroud)
如果用户设置了这些引用之一,这些规则告诉 nginx 只是关闭连接。有没有更优雅的方法来做到这一点?我可以定义这些域的列表,然后说“如果引用者在此列表中,则返回 444”吗?
这是我当前的 nginx 配置:
server {
listen 90;
server_name www.domain.com www.domain2.com;
root /root/app;
location / {
try_files $uri =404;
}
location ~ /([-\w]+)/(\w+)/ {
proxy_pass bla bla
}
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,都www.domain.com和www.domain2.com服务相同的内容。
现在我想补充
如果用户正在访问 www.domain.com 并且用户代理是 xxx 然后重定向到 www.domain2.com
我已经搜索并尝试了很多方法,但没有一个有效。
我看到很多关于在 Varnish 中使用 nginx 的讨论,但我不明白为什么。nginx 还不够吗?
Nginx 有 SSI,有反向代理缓存,轻量级,有 SSL,可以使用 cgi、fpm 等。
Varnish 具有相同的功能,但没有 ssl,也没有 cgi 支持。
访问时:http : //example.com/somefolder --> http://example.com:8080/somefolder
我试过这个:
http {
port_in_redirect off;
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有两种重定向选项(返回和重写),但我不确定对于性能、搜索引擎优化等推荐哪个选项:
## Redirect from non-www to www
server {
server_name example.com;
# Option 1
return 301 $scheme://$host$request_uri;
# Option 2
rewrite ^ http://$host$request_uri? permanent;
}
## Default server config
server {
...
listen 192.168.1.1:80 default_server;
root /www;
server_name www.example.com;
Run Code Online (Sandbox Code Playgroud)
选项 2 似乎适用于 curl,但在浏览器调用时它不会重定向,并且返回代码是临时重定向的代码,尽管重写指令设置为permanent:
curl -I example.com
HTTP/1.1 302 Moved Temporarily
Server: nginx
...
Location: http://www.example.com/
...
Run Code Online (Sandbox Code Playgroud) 我正在尝试从启用 SSL 模块的源代码编译 nginx。当我运行此命令时:
./configure --with-http_ssl_module
Run Code Online (Sandbox Code Playgroud)
它会执行通常的检查以查看所有内容是否安装正确,然后会弹出:
检查 OpenSSL 库...未找到
./configure: 错误:SSL 模块需要 OpenSSL 库。您可以不启用这些模块,也可以将 OpenSSL 库安装到系统中,或者使用 --with-openssl= 选项使用 nginx 从源静态构建 OpenSSL 库。
我知道是安装OpenSSL的事实,因为当我做openssl version我得到OpenSSL 1.0.1 14 Mar 2012
所以我很难过。我想也许 OpenSSL 没有安装在它的默认位置,这就是 nginx 找不到它的原因,但我不知道它在哪里,因为它预装在服务器上。我怎样才能知道这是哪里?
服务器正在运行 Ubuntu 12.04 LTS。
谢谢。
我有一个通配符 ssl 认证,我正在尝试将所有非 ssl 流量重定向到 ssl。目前,我正在使用以下内容重定向工作正常的非子域 url。
server {
listen 80;
server_name mydomain.com;
#Rewrite all nonssl requests to ssl.
rewrite ^ https://$server_name$request_uri? permanent;
}
Run Code Online (Sandbox Code Playgroud)
当我对 *.mydomain.com 做同样的事情时,它在逻辑上会重定向到
https://%2A.mydomain.com/
Run Code Online (Sandbox Code Playgroud)
你如何将所有子域重定向到它们的 https 等价物?
我在使用 Nginx 和 Jenkins (Hudson) 时遇到了一些麻烦。我正在尝试使用 Nginx 作为具有 HTTP 基本身份验证的 Jenkins 实例的反向代理。
到目前为止它有效,但我不知道如何使用身份验证用户名传递标头。
location / {
auth_basic "Restricted";
auth_basic_user_file /usr/share/nginx/.htpasswd;
sendfile off;
proxy_pass http://192.168.178.102:8080;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-User $http_authorization;
proxy_max_temp_file_size 0;
#this is the maximum upload size
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
Run Code Online (Sandbox Code Playgroud) 服务器是 Ubuntu 13.04 (GNU/Linux 3.9.3-x86_64-linode33 x86_64)。
nginx 是 nginx/1.2.6。
我已经为此工作了几个小时,所以这就是我得到的,这就是我所做的。
tail -f /usr/local/nginx/logs/error.log
2013/06/18 21:35:03 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 …Run Code Online (Sandbox Code Playgroud)