alibaba / tengine

A distribution of Nginx with some advanced features
https://tengine.taobao.org
BSD 2-Clause "Simplified" License
12.83k stars 2.52k forks source link

After tengine compiles and introduces lua, the access will report error 403 #1854

Closed uepuer closed 1 year ago

uepuer commented 1 year ago

info: debian 12 tengine3.0 luajit2 是git clone lua-resty-core ,lua-resty-lrucache 同样是git clone

安装编译 --add-module=./modules/lua-nginx-module 编译与安装都正常通过,并没有报错。 并且有安装 lua-resty-core,lua-resty-lrucache 的lua 库,在nginx.conf 里面引入配置,lua_package_path "/usr/local/nginx/lib/lua/?.lua;;"; nginx.conf 是默认的配置,配置有增加引入lua ,与server 里面的localtion 的增加lua 测试 : location /hello {

        default_type 'text/plain';

        content_by_lua 'ngx.say("hello, lua")';

    }

重启服务之后,使用ip 访问 x.x.x.x/hello 便 是正常可以访问到hello .lua 但是使用ip 访问时,便报错,权限403 的错误 ,日志提示没有权限 ,但是默认html 与lua 库都 尝试 过给权限 都 不可以,

同时有测试过,编译同样的配置,但是不编译 lua 支持 ,所有访问都是正常。 检查过其它的问题,还请帮忙测试 一下 ./configure --prefix=/usr/local/nginx \ --user=www --group=www \ --sbin-path=/usr/sbin/nginx \ --conf-path=/usr/local/nginx/config/nginx.conf \ --error-log-path=/home/logs/nginx/error.log \ --http-log-path=/home/logs/nginx/www_logs/web_access.log \ --pid-path=/run/nginx.pid \ --lock-path=/usr/local/nginx/lock/nginx.lock \ --with-cc-opt="-ljemalloc" \ --with-pcre-jit --with-ld-opt='-ljemalloc' --with-ld-opt="-Wl,-lpcre,-rpath,/usr/local/luajit/lib" \ --with-http_v2_module --with-http_sub_module \ --with-http_gunzip_module \ --with-http_realip_module --with-http_flv_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_secure_link_module \ --with-http_degradation_module \ --with-http_image_filter_module \ --with-http_ssl_module \ --http-proxy-temp-path=/usr/local/nginx/proxy_temp \ --http-fastcgi-temp-path=/usr/local/nginx/fastcgi_temp \ --http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp \ --http-scgi-temp-path=/usr/local/nginx/scgi_temp \ --with-http_stub_status_module \ --with-http_image_filter_module \ --with-http_geoip_module \ --with-http_geoip_module=dynamic \ --with-http_slice_module \ --with-http_secure_link_module \ --with-http_addition_module \ --with-http_auth_request_module \ --with-http_random_index_module \ --with-http_degradation_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module \ --with-stream_geoip_module \ --without-http_upstream_keepalive_module \ --add-module=/mnt/ngx_brotli-master \ --add-module=/mnt/ngx_http_geoip2_module \ --add-module=./modules/lua-nginx-module \ --add-module=./modules/ngx_http_concat_module \ --add-module=./modules/ngx_http_slice_module \ --add-module=./modules/ngx_http_upstream_consistent_hash_module \ --add-module=./modules/ngx_http_upstream_dynamic_module \ --add-module=./modules/ngx_http_upstream_keepalive_module \ --add-module=./modules/ngx_http_proxy_connect_module \ --add-module=./modules/ngx_http_reqstat_module \ --add-module=./modules/ngx_http_upstream_check_module \ --add-module=./modules/ngx_http_upstream_session_sticky_module \ --add-module=./modules/ngx_http_user_agent_module \ --add-module=./modules/ngx_http_sysguard_module \ --add-module=./modules/ngx_http_trim_filter_module \ --add-module=./modules/ngx_http_upstream_vnswrr_module \ --add-module=./modules/ngx_multi_upstream_module \ --add-module=./modules/ngx_slab_stat \ --add-module=./modules/ngx_http_footer_filter_module

drawing commented 1 year ago

error日志有报什么错误么,另外可以给一个稍微完整点的可复现的最小化配置么,方便重现排查

uepuer commented 1 year ago

error 的日志只有一个错误 :root@VM-0-8-debian:/mnt# tail -f /home/logs/nginx/error.log

2023/08/29 10:36:05 [error] 38134#0: *1 "/usr/local/nginx/html/index.html" is forbidden (13: Permission denied), 后面ip 我就没复制了

另外我把配置简化了一下: ./configure --prefix=/usr/local/nginx \ --user=www --group=www \ --sbin-path=/usr/sbin/nginx \ --conf-path=/usr/local/nginx/config/nginx.conf \ --error-log-path=/home/logs/nginx/error.log \ --http-log-path=/home/logs/nginx/www_logs/web_access.log \ --pid-path=/run/nginx.pid \ --lock-path=/usr/local/nginx/lock/nginx.lock \ --with-cc-opt="-ljemalloc" \ --with-pcre-jit --with-ld-opt='-ljemalloc' --with-ld-opt="-Wl,-lpcre,-rpath,/usr/local/luajit/lib" \ --with-http_v2_module --with-http_sub_module \ --with-ipv6 \ --with-http_ssl_module \ --with-http_addition_module \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module \ --with-stream_geoip_module \ --with-stream_ssl_preread_module \ --with-stream_sni \ --add-module=./modules/ngx_backtrace_module \ --add-module=./modules/ngx_debug_pool \ --add-module=./modules/ngx_debug_timer \ --add-module=./modules/ngx_http_concat_module \ --add-module=./modules/ngx_http_footer_filter_module \ --add-module=./modules/ngx_http_lua_module \ --add-module=./modules/ngx_http_proxy_connect_module \ --add-module=./modules/ngx_http_reqstat_module \ --add-module=./modules/ngx_http_slice_module \ --add-module=./modules/ngx_http_sysguard_module \ --add-module=./modules/ngx_http_trim_filter_module \ --add-module=./modules/ngx_http_upstream_check_module \ --add-module=./modules/ngx_http_upstream_consistent_hash_module \ --add-module=./modules/ngx_http_upstream_dynamic_module \ --add-module=./modules/ngx_http_upstream_dyups_module \ --add-module=./modules/ngx_http_upstream_keepalive_module \ --add-module=./modules/ngx_http_upstream_session_sticky_module \ --add-module=./modules/ngx_http_upstream_vnswrr_module \ --add-module=./modules/ngx_http_user_agent_module \ --add-module=./modules/ngx_multi_upstream_module \ --add-module=./modules/ngx_slab_stat \

   页而报出来的错误是:
   403 Forbidden

Sorry for the inconvenience. Please report this message and include the following information to us. Thank you very much!

 实在找不出来原因 了,只要把ngx_http_lua_module  这个不编译 就正常访问。
drawing commented 1 year ago

从错误日志来看,访问 /usr/local/nginx/html/index.html 这个文件时没有权限报 403 错误,编译参数 --user=www --group=www 默认用户是 www,如配置文件里没有指定用户的话,需要www这个用户有访问权限,可以 ps 看一下 worker 进程所属用户,给对应用户访问权限。

uepuer commented 1 year ago

root@VM-0-8-debian:/usr/local/nginx/html# ls -ls total 8 4 -rwxr-xr-x 1 root root 496 Aug 29 10:30 50x.html 4 -rwxr-xr-x 1 root root 555 Aug 29 10:30 index.html root@VM-0-8-debian:/usr/local/nginx/html# ps -aux | grep nginx root 41573 0.0 0.0 15580 1828 ? Ss 10:49 0:00 nginx: master process /usr/sbin/nginx www 41574 0.0 0.2 16392 5056 ? S 10:49 0:00 nginx: worker process root 41712 0.0 0.1 6332 2076 pts/0 S+ 10:50 0:00 grep nginx

drawing commented 1 year ago

/usr/local/nginx/html 这个目录 www 是否有执行权限呢,可以 su www 切换到 www 用户,实际 cat 一下 index.html 看是否能够读取?

uepuer commented 1 year ago

好的,权限没有问题,我感觉是lua 兼容性的问题,就刚刚这个时间里,我也去安装了nginx 1.25.2 的版本,只编译了lua ,也是报同样的错误。 root@VM-0-8-debian:/usr/local/nginx# ls -ls | grep html 4 drwxr-xr-x 2 www www 4096 Aug 29 10:30 html root@VM-0-8-debian:/usr/local/nginx# cat html/index.html <!DOCTYPE html>

Welcome to tengine!
uepuer commented 1 year ago

2023/08/29 11:37:41 [error] 53160#0: *1 open() "/usr/local/nginx/html/favicon.ico" failed (13: Permission denied)

image

drawing commented 1 year ago

好的,权限没有问题,我感觉是lua 兼容性的问题,就刚刚这个时间里,我也去安装了nginx 1.25.2 的版本,只编译了lua ,也是报同样的错误。 root@VM-0-8-debian:/usr/local/nginx# ls -ls | grep html 4 drwxr-xr-x 2 www www 4096 Aug 29 10:30 html root@VM-0-8-debian:/usr/local/nginx# cat html/index.html

Welcome to tengine!

cat html/index.html 之前先执行一下 su www,切换一下用户,从报错来看,似乎跟lua没什么关系,可以贴下完整的nginx conf么

uepuer commented 1 year ago

我的www 账号是 groupadd -g 128 -r www && useradd -s /sbin/nologin -u 128 -r -g www www 配置只有这个,没有给账号用户. 可以的,以下nginx.conf, 配置文件user www 也配置了,使用nobody 也试过,另外如果我不启用lua 这个编译,所有都是可以正常使用与访问的,但是如果我的配置在编译时增加了lua 功能就不可以了。 lua 库安装:lua-resty-core,lua-resty-lrucache。并且 给有www 权限 与755 整个/usr/local/nginx/lib 目前

user www;
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#error_log  "pipe:rollback logs/error_log interval=1d baknum=7 maxsize=2G";

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

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

    #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  logs/access.log  main;
    #access_log  "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G"  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
 lua_package_path "/usr/local/nginx/lib/lua/?.lua;;";
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # pass the Dubbo rpc to Dubbo provider server listening on 127.0.0.1:20880
        #
        #location /dubbo {
        #    dubbo_pass_all_headers on;
        #    dubbo_pass_set args $args;
        #    dubbo_pass_set uri $uri;
        #    dubbo_pass_set method $request_method;
        #
        #    dubbo_pass org.apache.dubbo.samples.tengine.DemoService 0.0.0 tengineDubbo dubbo_backend;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

    # upstream for Dubbo rpc to Dubbo provider server listening on 127.0.0.1:20880
    #
    #upstream dubbo_backend {
    #    multi 1;
    #    server 127.0.0.1:20880;
    #}

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
drawing commented 1 year ago

sudo -u www cat /usr/local/nginx/html/index.html

执行这个命令能显示文件内容么

uepuer commented 1 year ago

root@VM-0-8-debian:/usr/local/nginx/config# sudo -u www cat /usr/local/nginx/html/index.html

cat: /usr/local/nginx/html/index.html: Permission denied

没有,但是为什么我给了www:www 的权限 了,与755 的权限都是提示没有权限呢?这个错误 ,我应该如何修改?

drawing commented 1 year ago

root@VM-0-8-debian:/usr/local/nginx/config# sudo -u www cat /usr/local/nginx/html/index.html

cat: /usr/local/nginx/html/index.html: Permission denied

没有,但是为什么我给了www:www 的权限 了,与755 的权限都是提示没有权限呢?这个错误 ,我应该如何修改?

sudo -u www ls -l /
sudo -u www ls -l /usr
sudo -u www ls -l /usr/local/
sudo -u www ls -l /usr/local/nginx
...

每一层都 ls 一下看下哪一层有权限问题

uepuer commented 1 year ago

但是让我很疑惑的一点,就是我不编译 加载lua 模块时,为什么会是正常的呢? 已查实,就是这权限的问题,

drawing commented 1 year ago

但是让我很疑惑的一点,就是我不编译 加载lua 模块时,为什么会是正常的呢? 已查实,就是这权限的问题,

不编译 lua 模块的时候,worker 进程同样是 www 用户启动的么,如果是 www 用户启动的,目录没有权限读取,是系统的限制,不会访问成功的。

可以用不编译 lua 的方式启动,再看下 worker 进程的启动用户,以及用这个用户再去 cat 文件是否有权限。只有目录/文件权限不同,或者启动worker进程的用户不同两种可能

uepuer commented 1 year ago

非常感谢!已完全测试好!就是属主所属的权限问题, 感谢!