如何在Railway的Nixpacks环境中修改php.ini的upload_max_filesize?
在Railway + Nixpacks环境下修改Laravel的PHP上传限制
先说明你之前尝试的方法无效的原因:
ini_set('upload_max_filesize'):该指令属于PHP_INI_PERDIR级别,无法通过运行时函数修改,必须在php.ini或指定扫描目录的配置文件中设置。- 直接修改nginx.conf:Nixpacks默认会使用内置的nginx配置,除非你提供自定义配置文件覆盖它,否则你的修改不会生效。
PHP_INI_UPLOAD_MAX_FILESIZE环境变量:Nixpacks的PHP构建环境不识别这个特定的环境变量名,所以无法生效。
有效解决方案
方法一:自定义INI文件 + 扫描目录环境变量
- 在项目根目录创建
php-custom-conf文件夹 - 在该文件夹内创建
upload-limits.ini文件,写入以下内容:
upload_max_filesize = 100M post_max_size = 100M ; 必须设置,POST请求总大小不能小于单个文件上传限制 memory_limit = 256M ; 可选,根据业务需求调整,避免大文件上传时内存溢出
- 进入Railway项目的「环境变量」页面,添加:
(Railway构建后项目文件会被挂载到PHP_INI_SCAN_DIR = /app/php-custom-conf/app目录,因此路径要对应)
方法二:使用.user.ini文件(更简便)
直接在项目根目录创建.user.ini文件,写入和上面相同的配置内容:
upload_max_filesize = 100M post_max_size = 100M memory_limit = 256M
PHP会自动读取当前目录下的.user.ini文件(Nixpacks的PHP环境默认启用该特性)。
不要忘记配置Nginx的上传限制
Nginx会先于PHP拦截大文件请求,因此必须同步修改Nginx的配置:
- 在项目根目录创建
nginx.conf文件,覆盖Nixpacks的默认配置,内容如下:
worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; client_max_body_size 100M; # 与PHP的上传限制保持一致 server { listen 8080; root /app/public; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/run/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } }
这个配置保留了Laravel所需的路由重写规则,同时添加了Nginx的上传限制。
验证配置是否生效
提交所有修改到Git仓库,触发Railway重新构建后,可通过以下方式验证:
在routes/web.php中临时添加一个路由:
Route::get('/phpinfo', function () { phpinfo(); });
访问该路由页面,搜索upload_max_filesize和post_max_size,确认值已改为100M。验证完成后可以删除该路由。
内容的提问来源于stack exchange,提问作者Nil Suria
相关产品推荐
相关产品推荐

