diff --git a/docker/nginx.conf b/docker/nginx.conf index d9c5049..df0dc49 100644 --- a/docker/nginx.conf +++ b/docker/nginx.conf @@ -3,27 +3,43 @@ events { } http { - access_log /dev/stdout; - error_log /dev/stdout; + # Log format + log_format main '[$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; - include mime.types; - default_type application/octet-stream; + access_log /dev/stdout main; # Log access to stdout + error_log /dev/stdout; # Log errors to stdout - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 15; - types_hash_max_size 4096; + include mime.types; # Include the mime types file + default_type application/octet-stream; # Default type + + sendfile on; # Send files directly from disk + keepalive_timeout 15; # Keep connections alive for 15 seconds + types_hash_max_size 4096; # Max number of mime types + + # TCP optimizations + tcp_nopush on; # Send headers in one packet + tcp_nodelay on; # Don't wait for packets to be full + server { - server_name _; - listen 80; + server_name _; # Listen on all hostnames + listen 80; # Listen on port 80 - root /var/www/html; - index index.html index.htm; + root /var/www/html; # Serve files from /var/www/html + index index.html index.htm; # Serve index.html and index.htm by default + + # Gzip + gzip on; + gzip_disable "msie6"; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 8; + gzip_buffers 16 64k; + gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; client_max_body_size 500M; # Will get replaced by the environment variable MAX_UPLOAD_SIZE + # Upload endpoint location /upload.php { try_files $uri =404; @@ -35,9 +51,15 @@ http { include fastcgi_params; } - location / { + # Serve your files + location / { expires 7d; + open_file_cache max=1000 inactive=60s; + open_file_cache_valid 60s; + open_file_cache_min_uses 1; + open_file_cache_errors on; + # Serve the file directly from disk try_files $uri $uri/ =404; } diff --git a/docker/start.sh b/docker/start.sh index 5bd2356..9751857 100644 --- a/docker/start.sh +++ b/docker/start.sh @@ -26,8 +26,15 @@ sed -i "s/^post_max_size = .*/post_max_size = ${MAX_UPLOAD_SIZE}/" /etc/php/8.1/ # Set max upload size for nginx sed -i "s/client_max_body_size 500M;/client_max_body_size ${MAX_UPLOAD_SIZE};/" /etc/nginx/nginx.conf -# Start Nginx -echo "Starting PHP & Nginx" -/etc/init.d/php8.1-fpm start && -chmod 777 /run/php/php8.1-fpm.sock && -nginx -g 'daemon off;' \ No newline at end of file +function start() { + echo "Starting PHP & Nginx" + /etc/init.d/php8.1-fpm start && + chmod 777 /run/php/php8.1-fpm.sock && + nginx -g 'daemon off;' +} + +# Start Nginx and retry if it fails +until start; do + echo "Nginx failed to start, retrying in 5 seconds..." + sleep 5 +done \ No newline at end of file diff --git a/upload.php b/upload.php index 6f51731..9ce8692 100644 --- a/upload.php +++ b/upload.php @@ -3,6 +3,7 @@ /** * DO NOT TOUCH!!!!!!!! */ +$SCRIPT_VERSION = "0.1.0"; // The version of the script $before = microtime(true); // Start time of the script $defaultSecretKey = "set me"; // The default secret key header('Content-type:application/json;charset=utf-8'); // Set the response content type to JSON @@ -80,19 +81,38 @@ function returnJson($data): void die(); } +/** + * Log to nginx + */ +function logToNginx($message): void +{ + error_log($message); +} + try { - $secret = $_POST['secret']; // The secret key - $file = $_FILES['sharex']; // The uploaded file + $secret = isset($_POST['secret']) ? $_POST['secret'] : null; // The secret key + $file = isset($_FILES['sharex']) ? $_FILES['sharex'] : null; // The uploaded file + + // Page to show if someone visits the upload script + if ($secret == null && $file == null) { + returnJson(array( + 'status' => 'OK', + 'url' => 'Welcome to the ShareX PHP Uploader! v' . $SCRIPT_VERSION, + // Remove this if you don't want to show the support URL + 'support' => "For support, visit - https://git.fascinated.cc/Fascinated/sharex-php-uploader", + 'timeTaken' => getTimeTaken() + )); + die(); + } // Check if the token is valid if (!checkSecret($secret)) { returnJson(array( 'status' => 'ERROR', 'url' => 'Invalid or missing upload secret', - // Remove this if you don't want to show the support URL - 'support' => "For support, visit - https://git.fascinated.cc/Fascinated/sharex-php-uploader", 'timeTaken' => getTimeTaken() )); + logToNginx("An upload was attempted with an invalid secret key: " . $secret); die(); } @@ -103,6 +123,7 @@ try { 'url' => 'You need to set your upload secret in the configuration section of the upload.php file', 'timeTaken' => getTimeTaken() )); + logToNginx("An upload was attempted with the default secret key"); die(); } @@ -113,23 +134,26 @@ try { 'url' => 'No file was uploaded', 'timeTaken' => getTimeTaken() )); + logToNginx("An upload was attempted without providing a file"); die(); } - $target_file = preg_replace("/[^A-Za-z0-9_.]/", '', $_FILES["sharex"]["name"]); // Remove unwanted characters - $fileType = pathinfo($target_file, PATHINFO_EXTENSION); // File extension (e.g. png, jpg, etc.) + $originalFileName = preg_replace("/[^A-Za-z0-9_.]/", '', $_FILES["sharex"]["name"]); // Remove unwanted characters + $fileType = pathinfo($originalFileName, PATHINFO_EXTENSION); // File extension (e.g. png, jpg, etc.) + $fileSize = $_FILES["sharex"]["size"]; // File size in bytes // Check if the file already exists - if (file_exists($uploadDir . $target_file)) { + if (file_exists($uploadDir . $originalFileName)) { returnJson(array( 'status' => 'ERROR', 'url' => 'File already exists', 'timeTaken' => getTimeTaken() )); + logToNginx("An upload was attempted with a file that already exists: " . $originalFileName); die(); } - $finalName = $target_file; // The final name of the file + $finalName = $originalFileName; // The final name of the file if ($useRandomFileNames) { // Generate a random file name if enabled $finalName = generateRandomString($fileNameLength) . "." . $fileType; } @@ -155,6 +179,8 @@ try { $image->clear(); $image->destroy(); + $fileSize = filesize($webp_file); // Update the file size + // Update the final filename $finalName = $webp_file; $needsToBeSaved = false; @@ -169,6 +195,7 @@ try { 'url' => 'Failed to save file. Check the permissions of the upload directory.', 'timeTaken' => getTimeTaken() )); + logToNginx("An upload was attempted but the file could not be saved: " . $finalName); die(); } } @@ -177,6 +204,7 @@ try { 'url' => $finalName, 'timeTaken' => getTimeTaken() )); + logToNginx("An upload was successful. original id: $originalFileName, final id: $finalName, size: $fileSize"); die(); } catch (Exception $e) { // Handle any errors returnJson(array( @@ -184,5 +212,6 @@ try { 'url' => $e->getMessage(), 'timeTaken' => getTimeTaken() )); + logToNginx("An upload was attempted but an error occurred: " . $e->getMessage()); die(); }