InfixLMS — Laravel Octane (RoadRunner) Enablement Guide
This guide describes how to enable and run Laravel Octane with RoadRunner for InfixLMS. Follow the steps below carefully.
Quick overview
- Install RoadRunner binary via Octane installer.
- Set the required environment variables.
- Ensure the project has index.php in /public.
- Run Octane as a systemd service and configure Nginx as a reverse proxy.
1) Install RoadRunner Binary
Run the Octane installer which will download and install the RoadRunner binary for you:
php artisan octane:install
2) Add Required Environment Variables
Add the following to your .env file (or environment management):
HAS_PUBLIC_FOLDER=false
OCTANE_SERVER=roadrunner
OCTANE_HTTPS=false
OCTANE_PORT=8000
3) Ensure index.php Exists
If your project has _index.php instead of index.php, rename it:
_index.php → index.php
4) Start Laravel Octane (Systemd Service)
Create a systemd service file to manage Octane for InfixLMS. Example service:
# Create the service file:
sudo nano /etc/systemd/system/infixlms-octane.service
# Paste the following:
[Unit]
Description=InfixLMS Octane Server
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/infixlms.com
ExecStart=/usr/bin/php artisan octane:start --host=127.0.0.1 --port=8000
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl start infixlms-octane
sudo systemctl status infixlms-octane
sudo systemctl restart infixlms-octane
To follow logs:
sudo journalctl -u infixlms-octane -f
5) Setup Nginx Configuration
Use Nginx as a reverse proxy that forwards requests to Octane running on 127.0.0.1:8000. Example config:
sudo nano /etc/nginx/sites-available/infixlms.com
# Paste the following:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name infixlms.com;
server_tokens off;
root /var/www/infixlms.com/public;
index index.php;
charset utf-8;
client_max_body_size 1024M;
client_header_timeout 3000;
client_body_timeout 3000;
fastcgi_read_timeout 3000;
fastcgi_buffers 8 128k;
fastcgi_buffer_size 128k;
location /index.php {
try_files /not_exists @octane;
}
location / {
try_files $uri $uri/ @octane;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log off;
error_page 404 /index.php;
location @octane {
set $suffix "";
if ($uri = /index.php) {
set $suffix ?$query_string;
}
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://127.0.0.1:8000$suffix;
}
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl_certificate /etc/ssl/infixlms.com/cert.pem;
ssl_certificate_key /etc/ssl/infixlms.com/key.pem;
}
Enable and test Nginx, then reload:
sudo ln -s /etc/nginx/sites-available/infixlms.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
6) Permissions
Set correct write permissions for storage and cache directories:
sudo chmod -R 775 /var/www/infixlms.com/storage
sudo chmod -R 775 /var/www/infixlms.com/bootstrap/cache
(Adjust owner/group to www-data:www-data if needed: sudo chown -R www-data:www-data /var/www/infixlms.com.)
Troubleshooting & Notes
- Octane won't start: check journalctl -u infixlms-octane -b and the application log in storage/logs.
- 502 / gateway errors: verify Octane is listening on 127.0.0.1:8000, check Nginx proxy_pass, and confirm firewall isn't blocking localhost ports.
- Permissions: incorrect permissions cause file cache and session issues — ensure storage and bootstrap/cache are writable by the web user.
- HTTPS: if using TLS termination at a load balancer, you may disable internal 443 in Nginx or adjust upstream headers accordingly.
- Environment: ensure OCTANE_SERVER=roadrunner and port match the systemd ExecStart and Nginx proxy_pass.
- Public folder handling: HAS_PUBLIC_FOLDER=false is provided because some deployments use different public folder handling — set appropriately for your deployment.