BCPG
March 28, 2021, 7:43am
1
Nginx video preview
Description
Hi !
I have some problem using mattermost through nginx.
Everything works perfectly, I have a certificate, a domain name, port forwarding, but the video preview doesn’t load due to a problem (see picture)
Summary
Problem using nginx for video preview
Steps to reproduce
How can we reproduce the issue (what version are you using?)
Version : latest
Machine : VirtualBox Ubuntu 20.04 LTS
SQL base : MySQL
Mail server : None
Other servers running on the machine : yes
TLS : Through Nginx
TLS Certificate : Let’s Encrypt
Nginx : Installing Mattermost on Ubuntu 20.04 LTS — Mattermost 5.33 documentation
Nginx configuration:
server {
listen 443 ssl http2;
server_name mattermost.domain.com ;
ssl on;
ssl_certificate /etc/letsencrypt/live/mattermost.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mattermost.domain.com/privkey.pem;
ssl_session_timeout 1d;
ssl_protocols TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA->
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:50m;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
location / {
client_max_body_size 5000M;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
proxy_read_timeout 600s;
proxy_cache mattermost_cache;
proxy_cache_revalidate on;
proxy_cache_min_uses 2;
proxy_cache_use_stale timeout;
proxy_cache_lock on;
proxy_http_version 1.1;
proxy_pass http://localhost:8065;
}
location ~ /api/v[0-9]+/(users/)?websocket$ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 500M;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
client_body_timeout 60;
send_timeout 300;
lingering_timeout 5;
proxy_connect_timeout 90;
proxy_send_timeout 300;
proxy_read_timeout 90s;
proxy_pass http://localhost:8065;
}
Expected behavior
When I try to watch the preview of the file, it just propose me to download it.
When I tried generating a link, here is what I get in the console:
:
Failed to load ressource: Plug-in handled load
But first, MM try to open the preview
And then it doesn’t work
Observed behavior
It is not a problem with MM because it works perfectly in local mode (without nginx)
1 Like
Hello! This is an Nginx issue, specifically relating to the configured MIME type of the video file type. Basically, with your current configuration, the video format, be that .mp4
or .wav
or whatever it is, is being declared as a content type of application/octet-stream
, which tells the server that it is a binary file, and it needs to download it. This can be changed, however, to allow the file to load and be played/displayed in-browser, with some changes made to your /etc/nginx/nginx.conf
and /etc/nginx/mime.types
files.
First, could you provide the full contents of the Nginx configuration file that you set up your reverse proxy in, if it is not all here already, as well as the contents of /etc/nginx/nginx.conf
and /etc/nginx/mime.types
? This will allow me to find the right lines that need to be changed in all three files, and direct you to them effectively, to make the said changes.
Also, could you specify the file type that is downloading instead of loading in the browser? For example, it might be a .mp4
file or a .wav
file.
Thanks!
BCPG
March 29, 2021, 4:07pm
3
Hi !
Thank you very much for your answer !
The preview doesn’t work only for video (mp4, mov…)
For the /etc/nginx/nginx.conf
:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 204800;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
And for the /etc/nginx/mime.types
:
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
image/svg+xml svg svgz;
image/webp webp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.wap.wmlc wmlc;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
I've never touched to those two files...
1 Like
Alright, so this is the live (the quoted line above) that needs to be changed. This is telling the server that by default, if it doesn’t recognize a specific file extension, or it isn’t specified in mime.types
then it should download it to the user’s computer. By changing this line to default_type text/html;
, and then restarting your Nginx server (sudo systemctl restart nginx
) as well as restarting your Mattermost instance (sudo systemctl restart mattermost
) you should be good to go!
Let me know how it goes and if it doesn’t work or you encounter any other issues, I’ll be more than happy to help out!
2 Likes
BCPG
March 31, 2021, 7:12pm
5
Thank you very much !
It worked !
1 Like
BCPG
April 1, 2021, 10:17am
6
More than that, I can also see the whole pdf now (before I could only see 5 pages)
1 Like
That’s great, I’m very happy to hear that!