ASP.NET Apache setup on CentOS

Original Post/ Curtsy: http://jharitesh.blogspot.com/2012/06/aspnet-apache-setup-on-centos.html

To run ASP.NET application on Apache mod_mono module should be installed and configured on Apache.
All .NET pages are actually processed by mono which runs in background along with Apache. Apache identify .Net request page with help of mod_mono module. I used centOS as OS and performed following steps to run ASP.NET application on Apache.

  • Mono installation
  • XSP installation
  • Apache installation
  • mod_mono installation
  • Configuration

Mono installation
1. yum install gcc bison pkgconfig glib2-devel gettext make

2. Please check latest mono version on site before installation and edit command with latest version.   wget http://ftp.novell.com/pub/mono/sources/mono/mono-2.10.2.tar.bz2

3. tar jxvf mono-2.10.2.tar.bz2

4. cd mono-2.10.2

5. ./configure -prefix=/opt/mono; make; make install

6. echo export PKG_CONFIG_PATH=/opt/mono/lib/pkgconfig:$PKG_CONFIG_PATH>>~/.bash_profile

7. echo export PATH=/opt/mono/bin:$PATH>>~/.bash_profile

8. source ~/.bash_profile

9. mono -V

to check mono is installed or not

10. cd ..
XSP installation

1. wget http://ftp.novell.com/pub/mono/sources/xsp/xsp-2.10.2.tar.bz2 2. tar jxvf xsp-2.10.2.tar.bz2 3. cd xsp-2.10.2 4. ./configure -prefix=/opt/mono; make; make install 5. cd ..

Apache installation

  1. yum -y install httpd-devel

mod_mono installation  

1. wget http://ftp.novell.com/pub/mono/sources/mod_mono/mod_mono-2.10.tar.bz2 2. tar jxvf mod_mono-2.10.tar.bz2 3.  cd  mod_mono-2.10 4. ./configure –prefix=/opt/mono; make; make install 5. cd ..

 Configuration

  1. mono_setup configuration: create mono_setup.conf under directory /etc/httpd/conf.d with below content.

Include /etc/httpd/conf/mod_mono.conf

MonoApplications “/:/var/www/html/”

MonoServerPath “/opt/mono/bin/mod-mono-server2”

 

Options FollowSymLinks

AllowOverride None

AddHandler mono .aspx .ascx .asax .ashx .config .cs .asmx .axd

 

  1. Apache configuration: 

1) Open /etc/httpd/conf/httpd.conf and uncomment below line(remove ‘#’).

NameVirtualHost *:80

Extra setting:

I like Ubuntu way to enable disable site so I added this in here too.

2) Add below line

Include /etc/httpd/sites-enabled/

3) Create two directory inside /etc/httpd using below command

mkdir /etc/httpd/sites-enabled
mkdir /etc/httpd/sites-available

4) Type following to create new file a2ensite
    1) cat > a2ensite
2) Type this line
ln -s /etc/httpd/sites-available/$1.conf   /etc/httpd/sites-enabled/$1.conf

3) Press enter to move cursor to a new line and press CTRL+D.
4) Type this  command to make a2ensite executable
chmod   +x   a2ensite
5) Copy into /usr/bin
cp a2ensite /usr/bin

Type following to create new file a2dissite
    1) cat > a2dissite
2) Type this line
rm       -f          /etc/httpd/sites-enabled/$1.conf

3) Press enter to move cursor to a new line and press CTRL+D.
4) Type this  command to make a2ensite executable
chmod   +x   a2dissite
5) Copy into /usr/bin
cp          a2dissite         /usr/bin

3.Config application

Each application will have own separate config in directory  /etc/httpd/sites-available
sample application config file: file path is /etc/httpd/sites-available/name.xyz.com

    ServerAdmin xxxx.yyy@name.xyz.com

DocumentRoot /var/www/name.xyz.com

DirectoryIndex Default.aspx

ServerName name.xyz.com

ServerPath /

MonoAutoApplication disabled

MonoApplications “/:/var/www/name.xyz.com”

MonoServerPath “/opt/mono/bin/mod-mono-server2”

AddHandler mono .aspx .ascx .asax .ashx .config .cs .asmx .axd

ErrorLog /var/log/httpd/ name.xyz.com-error_log

CustomLog /var/log/httpd/ name.xyz.com-access_log common

 

In sample config application root directory is var/www/name.xyz.com i.e all application files will be kept in folder name.xyz.com.

4. Deployment 
    1) create directory /var/www/name.xyz.com
2) Copy application folder content into directory /var/www/name.xyz.com
3) Type below command to enable web-application in apache

#a2ensite name.xyz.com

#service apache2 restart
4)  Type below command to disable web-application in apache.
#a2dissite name.xyz.com

#service apache2 restart
Note: file name should be same as what we create in /etc/apache2/sites-available.

5) Other useful commands
To start apache  #service httpd start
To restart apache #service httpd restart
To stop apache #service httpd stop
To check mono is running in background or not  #ps -ef |grep -i “mono”

I also came across few issues during setup and got good solution from other forums. Here are collectively all issues.

  1. After deployment & restart of apache when we try to access page ….it is shown as blank page.

Apache error log contains following errors:

[crit] (2)No such file or directory: Failed to create shared memory segment for backend ‘testing’ at ‘/var/run/mod_mono/mod_mono_dashboard_testing_2’.

It is actually thrown because it is failing to create shared memory. Mono run as user apache but only root can write to /var/run. So solution is to create a folder and make apache owner.

  1. After solving 1st error when we try to access page from browser it throws error “Service Temporarily Unavailable”. In apache error log below error is shown.

” [error] Failed to connect to mod-mono-server after several attempts to spawn the process.”

solution: This is because of SELinux. By disabling SELinux using following command this issue can be resolved.

# setenforce 0

Script for above two issue is as follows.

dir=”/var/run/mod_mono/”

echo “Disable SELinux”
setenforce 0
echo -n “SELinux status is ”
/usr/sbin/getenforce
echo “Stopping Apache”
apachectl stop
echo “Waiting 5 seconds”
sleep 5s
shopt -s dotglob
if [ -d “$dir” ]; then
echo “Removing $dir”
rm -rf “$dir”*
rmdir “$dir”
fi
echo “Creating $dir”
mkdir “$dir”
echo “Changing owernerhip of $dir to Apache”
chown apache “$dir”
chgrp apache “$dir”

chown             -R apache   /opt/mono/
mkdir   -p        ~apache/.mono
chown  -R        apache:apache    ~apache/.mono
chmod             u+rw    ~apache/.mono
echo “Starting Apache”
apachectl start
echo “Done!”

Above script will run only when system start or reboot.

  1. Error message “Make sure that your mod_mono module is loaded after the User/Group directives” is thrown when we start/restart apache. [1]

soln : Put below statement just above “Include conf.d/*.conf” in httpd.conf

User apache
Group apache

and then restart apache httpd service.

  1. Error message ” Starting httpd: httpd: Could not reliably determine the server’s fully qualified domain name, using localhost.localdomain for ServerName”

Do following
1) Edit /etc/hosts using your favourite editor The contents should look something like this: # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6
2).
At the end of the file add: 192.168.20.100 Server1.example.com That’s a [tab] between the IP address and the host name.
3) Save the file
4) Restart the network services to apply your changes service network restart
5)
Restart Apache service httpd restart

  1. Error message “Auto generated encryption keys not saved: System.Security.SecurityException: No access to the given key”

Reason :ASP.NET is creating auto generated keys for the machine and failing to safe them. The only problem, other that seen that message, is that every time the application is started it will get new keys because they are not being saved.

The directory where this is trying to write is somewhere $SYSCONFDIR/mono/registry (usually /etc/mono/registry). If it allow the user running apache read, write, and execute permissions on that folder, Mono will be able to save the auto generated keys and will reuse them subsequently. Once the keys are written, the apache user will only need read and execute permission.

Solution:
chown             -R apache /opt/mono/
mkdir   -p        ~apache/.mono
chown  -R        apache:apache  ~apache/.mono
chmod             u+rw  ~apache/.mono

The auto-generated keys are now being stored at: “/var/www/.mono/registry/”

Leave a comment