V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dapengzhao
V2EX  ›  问与答

有老哥遇到过 nginx/ PHP -fpm 访问 PHP 文件直接下载而不运行的情况吗?

  •  
  •   dapengzhao · 2019-05-20 14:18:24 +08:00 · 5158 次点击
    这是一个创建于 2013 天前的主题,其中的信息可能已经有所发展或是发生改变。

    server { listen 8080; server_name localhost; root /usr/local/nginx/html;

        #charset koi8-r;
    
        #access_log  logs/host.access.log  main;
    
        location ~ \.php$ {
        root           /usr/local/nginx/html;
        fastcgi_pass   127.0.0.0:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        }
    
        location / {
            root  /usr/local/nginx/html
            index index.php
        }
    
    第 1 条附言  ·  2019-05-20 18:13:29 +08:00
    有兴趣的可以上服务器看看,华为的 15 天免费的。
    ssh [email protected]
    zdp8023--

    nginx 配置地址:/nginx-1.8.0/conf
    启动,/usr/local/nginx/sbin nginx 关闭:/usr/local/nginx/sbin nginx -s stop

    php-fpm 地址:/usr/local/php7/sbin
    php-fpm.d : /usr/local/php7/etc
    第 2 条附言  ·  2019-05-21 09:34:16 +08:00
    http {
    include mime.types;
    sendfile on;
    keepalive_timeout 65;

    server {
    listen 8080;
    server_name 114.116.109.253;
    root /usr/local/nginx/html;

    location ~ .*\.php(\/.*)*$
    {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
    return 404;
    }
    #try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    #fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    #fastcgi_param SCRIPT_NAME $real_script_name;
    #fastcgi_param PATH_INFO $path_info;
    include fastcgi_params.conf;
    }
    }
    }

    这是 v 友成功后的 nginx 配置
    35 条回复    2019-05-21 09:27:11 +08:00
    zhanglintc
        1
    zhanglintc  
       2019-05-20 14:25:51 +08:00
    fastcgi_pass 可能需要改成这个样子:
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

    那个 .sock 文件的具体地址你可能需要根据你自己的版本稍作修改.
    lazyyz
        2
    lazyyz  
       2019-05-20 14:39:08 +08:00 via Android
    1 楼正解
    dapengzhao
        3
    dapengzhao  
    OP
       2019-05-20 15:03:09 +08:00
    @zhanglintc
    [root@ecs-68ac ~]# find / -name '*sock'
    /usr/sbin/mksock

    我系统下没有.sock 文件
    在 www.config 中 listion 监听的就是 127.0.0.1:9000
    dapengzhao
        4
    dapengzhao  
    OP
       2019-05-20 15:03:34 +08:00
    @lazyyz
    [root@ecs-68ac ~]# find / -name '*sock'
    /usr/sbin/mksock

    我系统下没有.sock 文件
    在 www.config 中 listion 监听的就是 127.0.0.1:9000
    sheeta
        5
    sheeta  
       2019-05-20 15:05:18 +08:00
    @dapengzhao 你配置文件中是 127.0.0.0:9000
    poisedflw
        6
    poisedflw  
       2019-05-20 15:14:40 +08:00
    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }

    重启 nginx、重启 fpm。清浏览器缓存
    dapengzhao
        7
    dapengzhao  
    OP
       2019-05-20 15:15:05 +08:00
    @sheeta
    server {
    listen 8080;
    server_name localhost;
    root /usr/local/nginx/html;

    #charset koi8-r;

    #access_log logs/host.access.log main;

    location ~ \.php$ {
    root html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }

    location / {
    root /usr/local/nginx/html
    index index.php
    }


    location ~ \.php$ 里面的 root 我用 /usr/local/nginx/html 和 html 都试过结果还是下载。。。。。
    dapengzhao
        8
    dapengzhao  
    OP
       2019-05-20 15:15:50 +08:00
    @poisedflw 重启了 nginx 没有重启 fpm 我再试一下
    dapengzhao
        9
    dapengzhao  
    OP
       2019-05-20 15:27:29 +08:00
    @poisedflw
    按照你上面配置
    重启 nginx、重启 fpm。清浏览器缓存
    结果还是下载。。。。。。。。
    frozenway
        10
    frozenway  
       2019-05-20 15:31:56 +08:00
    估计是 SCRIPT_FILENAME 没写对,再或者是 9000 端口没有开启
    dapengzhao
        11
    dapengzhao  
    OP
       2019-05-20 15:37:07 +08:00
    @frozenway SCRIPT_FILENAME 没写对是啥意思?
    tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 18157/php-fpm
    tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 18180/nginx
    keepeye
        12
    keepeye  
       2019-05-20 15:39:01 +08:00
    location ~ \.php$ {
    return 403;
    }

    先看看有没有走到这个块里面
    dapengzhao
        13
    dapengzhao  
    OP
       2019-05-20 15:44:22 +08:00
    @keepeye 好像没有,还是直接去下载了
    dapengzhao
        14
    dapengzhao  
    OP
       2019-05-20 15:49:12 +08:00
    @keepeye
    worker_processes 1;
    events {
    worker_connections 1024;
    }

    http {
    include mime.types;
    sendfile on;
    keepalive_timeout 65;

    server {
    listen 8080;
    server_name 114.116.109.253;
    root /usr/local/nginx/html;

    #location ~ \.php$ {
    #try_files $uri =404;
    #fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #fastcgi_pass 127.0.0.1:9000;
    #fastcgi_index index.php;
    #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #include fastcgi_params;
    #}
    location ~ \.php$ {
    return 403;
    }

    location / {
    root /usr/local/nginx/html
    index index.php
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }
    }
    }
    LittleLease
        15
    LittleLease  
       2019-05-20 16:06:01 +08:00
    执行 ps -ef | grep php 看看你的 php-fpm 进程有没有
    liangzi
        16
    liangzi  
       2019-05-20 16:07:40 +08:00 via Android
    ng 不支持 PHP 的配置了 先保证 php-fpm 能运行起来再改 ng
    dapengzhao
        17
    dapengzhao  
    OP
       2019-05-20 16:07:50 +08:00
    @LittleLease 有,现在问题是 nginx 解析完第一个 location 之后,不匹配下面的 location 了
    dapengzhao
        18
    dapengzhao  
    OP
       2019-05-20 16:08:33 +08:00
    @liangzi
    root 18157 1 0 15:24 ? 00:00:00 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf)
    www-data 18158 18157 0 15:24 ? 00:00:00 php-fpm: pool www
    www-data 18159 18157 0 15:24 ? 00:00:00 php-fpm: pool www
    www-data 18160 18157 0 15:24 ? 00:00:00 php-fpm: pool www
    www-data 18161 18157 0 15:24 ? 00:00:00 php-fpm: pool www
    www-data 18162 18157 0 15:24 ? 00:00:00 php-fpm: pool www
    root 18259 17754 0 16:06 pts/0 00:00:00 grep php
    ochatokori
        19
    ochatokori  
       2019-05-20 16:11:20 +08:00 via Android
    直接下载文件我感觉是 nginx 的 mime type 出问题了
    sheeta
        20
    sheeta  
       2019-05-20 16:12:45 +08:00
    location / {
    root /usr/local/nginx/html
    index index.php

    location ~ \.php$ {
    root /usr/local/nginx/html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }



    @dapengzhao 试试这样
    dapengzhao
        21
    dapengzhao  
    OP
       2019-05-20 16:13:37 +08:00
    @ochatokori mime type 是跟 css 静态文件一类的资源有关系吧
    dapengzhao
        22
    dapengzhao  
    OP
       2019-05-20 16:17:31 +08:00
    @sheeta 还是在下载 index.php
    uTOmOuk3L6sb4MSI
        23
    uTOmOuk3L6sb4MSI  
       2019-05-20 16:28:08 +08:00
    https://nginxconfig.io/
    站长好像发过这个,看你需要否
    poisedflw
        24
    poisedflw  
       2019-05-20 16:29:09 +08:00
    强烈怀疑你 nginx 有错误日志。
    你先检查下 nginx 是否有错误日志(就是没重启成功)

    然后单独测试下 fpm 是否 ok
    lazyyz
        25
    lazyyz  
       2019-05-20 16:58:49 +08:00 via Android
    直接下载 php 一般是 Nginx 没有配置正确,给你一段最简单的试试,sock 文件会自动生成的,下面的 7.3 改成你的 php 版本

    server {
    listen 80 default_server;

    root /usr/local/nginx/html;
    index index.html index.php;

    server_name _;
    # pass PHP scripts to FastCGI server
    #
    location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    # # With php-fpm (or other unix sockets):
    fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    }
    }
    lazyyz
        26
    lazyyz  
       2019-05-20 17:00:16 +08:00 via Android
    @dapengzhao 127.0.0.1:9000 用的 php cgi 模式,socks 是 php-fpm
    liwl
        27
    liwl  
       2019-05-20 17:26:10 +08:00
    location ~ .*\.php(\/.*)*$
    {
    try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params.conf;
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param PATH_INFO $path_info;
    }
    dapengzhao
        28
    dapengzhao  
    OP
       2019-05-20 18:05:39 +08:00
    @liwl
    server {
    listen 8080;
    server_name 114.116.109.253;
    root /usr/local/nginx/html;

    location ~ .*\.php(\/.*)*$
    {
    try_files $uri =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params.conf;
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;
    fastcgi_param PATH_INFO $path_info;
    }
    }

    还是不行,直接下载了
    ddsfeng
        29
    ddsfeng  
       2019-05-20 19:25:19 +08:00   ❤️ 1
    @dapengzhao 好了, 不谢.
    falcon05
        30
    falcon05  
       2019-05-20 19:35:37 +08:00 via iPhone
    估计是 mine-type 或者 Server name 的问题,压根没进入这个 Server,如果是 php-fpm 的问题会是 502,根本不会有下载。
    zhanglintc
        31
    zhanglintc  
       2019-05-20 20:55:26 +08:00
    @ddsfeng #29 改了啥地方啊
    Takamine
        32
    Takamine  
       2019-05-20 22:03:53 +08:00
    我记得我之前遇到的时候是把.php 文件没有配置解析的问题。
    liangzi
        33
    liangzi  
       2019-05-20 22:13:36 +08:00 via Android
    卧槽还没弄好呢?
    liangzi
        34
    liangzi  
       2019-05-20 22:29:41 +08:00
    ### 原因
    - 当 nginx 不配置支持 php 模块时,当你访问 php 文件时候,浏览器默认下载 php 文件,而不是执行 php

    - 排查你的 php-XXX 之类的扩展 是不是有少安装了什么插件
    - 配置 php-fpm.conf
    openSUSE 搭建 wordpress 为例

    ` sudo cp /etc/php7/fpm/php-fpm.conf.default /etc/php7/fpm/php-fpm.conf`

    `sudo cp /etc/php7/fpm/php-fpm.d/www.conf.default /etc/php7/fpm/php-fpm.d/wordpress.conf`


    cat /etc/php7/fpm/php-fpm.conf
    ```
    pid = run/php-fpm.pid
    include=/etc/php7/fpm/php-fpm.d/*.conf
    ```

    cat /etc/php7/fpm/php-fpm.d/wordpress.conf
    ```
    user = 你的用户名
    group = users
    listen = 127.0.0.1:9000
    pm = dynamic

    ```
    nginx -t

    sudo php-fpm -t
    sudo php-fpm
    sudo systemctl start nginx.service

    ### nginx
    ```
    server {

    listen 80;
    root /这里改你的具体位置;
    index index.php index.html index.htm;

    server_name 你的主机名

    client_max_body_size 100M;

    location / {
    try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
    }
    ``
    dapengzhao
        35
    dapengzhao  
    OP
       2019-05-21 09:27:11 +08:00
    @ddsfeng 大哥🙏,能不能说下改了啥地方
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5285 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 07:14 · PVG 15:14 · LAX 23:14 · JFK 02:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.