In this tutorial, I will demonstrate how to setup web hosting for ASP.NET Core 2.1 application in CentOS 7 Linux operating system using NGINX web hosting platform.
Before we proceed, let’s make sure the system is up-to-date. Follow below steps.
- Update CentOS 7 Linux.
sudo yum update -y- Install epel-release package to install
NGINX
sudo yum install epel-release -ySetup NGINX and Firewall
- Install
NGINXandfirewalld.
sudo yum install nginx firewalld -y- Start
firewalldservice.
sudo systemctl start firewalld.service- Check
firewalldstatus.
sudo firewall-cmd --stateIf it returned running. That means firewalld service is in running state.
- Enable
httpandhttpsto allow access fromfirewalld.
sudo firewall-cmd --permanent --zone=public --add-service=httpsudo firewall-cmd --permanent --zone=public --add-service=httpsOnce you execute below commands, you should see success in return for each command.
Lets go ahead and reload firewalld to apply new changes.
- Reload
firewalld.
sudo firewall-cmd --reload- Enable
NGINXandfirewalldto start on system reboot.
sudo systemctl enable nginxsudo systemctl enable firewalld.serviceSetting up directory structure for hosting ASP.NET Core application
I like hosting my apps in /home/vhost. If you like to change this structure to something else, feel free to update below commands and all the references in NGINX configuration files.
- Create directory structure.
sudo mkdir -p -- /home/vhost /home/vhost/ssl/demo /home/vhost/www /home/vhost/www/demoThe above command will create the following structure.
/home/vhostwill be root directory for hosting SSL configurations and application./home/vhost/sslwill be used for storing allSSLcertificates for an application. For example, my application is calleddemoand I have createddemodirectory that will maintain all my certifications./home/vhost/wwwwill be used for deploying applications. In my example, I havedemoapplication. If you would like to setup server for multiple application you may create another directory and deploy application in it.
- Navigate to
/home/vhost/www. And change ownership ofdemofolder to allownginxto be owner of it.
cd /home/vhost/wwwsudo chown nginx:nginx -R demoInstall dotnet sdk
In order to run ASP.NET Core application in CentOS, we need to install dotnet sdk. Follow below steps:
- Install
rpmpackage.
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm- Install
dotnet sdk.
sudo yum install dotnet-sdk-2.1Configure NGINX and ASP.NET Core hosting
Hosting configuration
- Create config file for hosting
demoapplication.
sudo vi /etc/nginx/conf.d/demo.confPress i to go into edit more in vi editor.
- Copy and paste the below settings into
demo.conffile.
upstream demo{
server localhost:5000;
}
# Redirect HTTP traffic to HTTPS.
server {
listen *:80;
add_header Strict-Transport-Security max-age=15768000;
return 301 https://$host$request_uri;
}
# Configure HTTPS
server {
listen *:443 ssl;
# Replace HOSTNAME with actual domain name that will be used to access site from external.
server_name <HOSTNAME>;
# Path to certificate file
ssl_certificate /home/vhost/ssl/demo/demo.crt;
# Path to Certificate key
ssl_certificate_key /home/vhost/ssl/demo/demo.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on; #ensure your cert is capable
ssl_stapling_verify on; #ensure your cert is capable
add_header Strict-Transport-Security "max-age=63072000; includeSubdomain s; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
#Redirects all traffic
location / {
proxy_pass http://demo;
# limit_req zone=one burst=10;
}
}On line 14 server_name replace <HOSTNAME> with actual dns alias your application will be accessible from outside. For example, if it is demo.example.com, replace it with this value.
On line 16 and 18, make sure to have correct certificates in placefor HTTPS traffic encryption and decryption.
Save the file by pressing :wq.
- Navigate to
/etc/nginx.
cd /etc/nginx- Take backup of
nginx.conffile.
sudo cp nginx.conf nginx.conf_bk- Edit
nginx.conf
sudo vi nginx.confpress i to enter in edit more.
- Enter below entry within
http {}
http {
include /etc/nginx/proxy.conf;
}- Comment out entire
server {}block.
#server {
# ....
#}- Save the file by pressing
:wq.
nginx.conf should look like this:
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
include /etc/nginx/proxy.conf;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}Proxy configuration
- Create new file called
proxy.conf.
sudo vi /etc/nginx.proxy.confPress i to be in edit mode.
- Copy and paste below entry.
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
include /etc/nginx/proxy.conf;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2 default_server;
# listen [::]:443 ssl http2 default_server;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# }
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}Save the file by pressing :wq.
Deploy and configure ASP.NET Core application
Go ahead and publish your application in your local file system. Once publish, copy all files and folder to /home/vhost/www/demo. Once copied, execute below command to change ownership.
cd /home/vhost/www
sudo chown nginx:nginx -R /home/vhost/www/demoCreate service to run ASP.NET Core application
- Execute the below command to create service.
sudo vi /etc/systemd/system/demo.servicePress i to go in edit mode.
- Copy and paste the below values.
[Unit]
Description=Demo .NET Web API Application running on CentOS 7
[Service]
WorkingDirectory=/home/vhost/www/demo
ExecStart=/usr/bin/dotnet /home/vhost/www/demo/Demo.dll
Restart=always
RestartSec=20 # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-demo
User=nginx
Environment=ASPNETCORE_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.targetSave the file by pressing :wq.
- Start the service.
sudo systemctl start demo- Check the status of the service.
sudo systemctl status demoThe output should look as shown below.
● demo.service - Demo .NET Web API Application running on CentOS 7
Loaded: loaded (/etc/systemd/system/demo.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2018-11-18 21:08:46 UTC; 5s ago
Main PID: 18390 (dotnet)
CGroup: /system.slice/demo.service
└─18390 /usr/bin/dotnet /home/vhost/www/demo/Demo.dll
Nov 18 21:08:46 demo.example.com systemd[1]: [/etc/systemd/sys...
Nov 18 21:08:46 demo.example.com systemd[1]: Started Demo ....
Nov 18 21:08:46 demo.example.com systemd[1]: Starting Demo ...
Nov 18 21:08:47 demo.example.com dotnet-demo[18390]: warn: ...
Nov 18 21:08:47 demo.example.com dotnet-demo[18390]: No XML...
Nov 18 21:08:48 demo.example.com dotnet-demo[18390]: Hostin...
Nov 18 21:08:48 demo.example.com dotnet-demo[18390]: Conten...
Nov 18 21:08:48 demo.example.com dotnet-demo[18390]: Now li...
Nov 18 21:08:48 demo.example.com dotnet-demo[18390]: Applic...
Hint: Some lines were ellipsized, use -l to show in full.- Enable service on reboot.
sudo systemctl enable demo.serviceFinally, before we test the application from outside. We need to disable SELinux.
Disable SELinux
- Edit selinux file
sudo vi /etc/sysconfig/selinuxPress i to go in edit mode.
- Find
SELINUX=enforcingand replace it withSELINUX=disabled. - Reboot your system.
sudo rebootOnce the system comes on. You should be able to browse the application from another computer.


