Mediaproxy 2.5.2 is a Python application from AG-Projects which is available as a free download as well as being available as a commercial product from AG-Projects. It is used in combination with the Mediaproxy module of OpenSIPS.
Mediaproxy 2 has several dependencies and can be quite tricky to install. The INSTALL instructions that come with the package are very helpful, but unfortunately they are aimed primarily at installers who either have Debian or Ubuntu Linux distributions. If you are using CentOS (or Red Hat), especially the 64 bit versions, then getting Mediaproxy 2 to run can be difficult.
This article is essentially an update for an earlier article showing how to install Mediaproxy 2.3.8 on CentOS 5. The installation process on CentOS 6 is quite different so I decided to leave the older article as it was and write up the process for CentOS 6 as a new article. Readers can choose whichever description is most suitable.
Here are the sequential instructions for installing the libraries needed for Mediaproxy 2.5.2. A number of packages that previously had to be installed using source tarballs are now installed using yum, making the process much easier.
Install some development and system packages using YUM
Development tools
yum groupinstall “Development Tools”
Development libraries and headers for some existing packages
yum install iptables-devel.x86_64
yum install libgpg-error-devel.x86_64
yum install python-devel.x86_64
libnfnetlink and libnetfilter_conntrack
yum install libnfnetlink-devel.x86_64
yum install libnetfilter_conntrack-devel.x86_64
libgcrypt
yum install libgcrypt-devel
Install some Python packages
python-zopeinterface
yum install python-zope-interface
python-cjson
This module can be installed using YUM, but first you will have to activate the rpmforge repository. The best way to do this is using the instructions here:
http://wiki.centos.org/AdditionalResources/Repositories/RPMForge
It is also possible to install the required python-cjson package from a source tarball as follows:
Suggested version: python-cjson-1.0.5.tar.gz
Locating a download site: http://pypi.python.org/pypi/python-cjson/1.0.5
Unzip: tar -xf python-cjson-1.0.5.tar.gz
Change to the sub-directory created when you unzipped the tarball
Build and install the library:
./setup.py build
./setup.py install
The following python packages are best installed from source tarballs. Details are given below:
python-application
Suggested version: python-application-1.3.0.tar.gz
Locating a download site: http://pypi.python.org/pypi/python-application/1.3.0
Unzip: tar -xf python-application-1.3.0.tar.gz
Change to the sub-directory created when you unzipped the tarball
Build and install the library:
./setup.py build
./setup.py install
python-gnutls
Suggested version: python-gnutls-1.2.4.tar.gz
Locating a download site: http://pypi.python.org/pypi/python-gnutls/1.2.4
Unzip: tar -xf python-gnutls-1.2.4.tar.gz
Change to the sub-directory created when you unzipped the tarball
Build and install the library:
./setup.py build
./setup.py install
Install the Twisted Python package
Install the core Twisted package from Twisted Matrix Labs
Suggested version: Twisted-11.0.0.tar.bz2
Locating a download site: http://twistedmatrix.com/trac
Unzip: tar -xf Twisted-11.0.0.tar.bz2
Change to the sub-directory created when you unzipped the tarball
Build and install the library:
./setup.py build
./setup.py install
Note also that version 8.2.0 of Twisted is available in the default YUM repositories. It is easier to install using YUM, but I prefer to install the later version from the source tarball because it matches the version used in the Debian install packages provided by AG-Projects.
A Checklist of dependencies and versions
On the system used for testing, the list of packages (and their versions) required by Mediaproxy looked like this prior to installation of the mediaproxy source code:
Package | Version |
gcc | 4.4.6 |
gcc-c++ | 4.4.6 |
iptables and iptables-devel | 1.4.7 |
libnfnetlink and libnfnetlink-devel | 1.0.0 |
libnetfilter_conntrack and libnetfilter_conntrack-devel | 0.0.100 |
libgcrypt and libgcrypt-devel | 1.4.5 |
libgpg-error and libgpg-error-devel | 1.7 |
gnutls | 2.8.5 |
python and python-devel | 2.6.6 |
python-zope-interface | 3.5.2 |
python-twisted | 11.0.0 |
python-gnutls | 1.2.4 |
python-application | 1.3.0 |
python-cjson | 1.0.5 |
Install Mediaproxy 2
Mediaproxy 2
Suggested version: mediaproxy-2.5.2.tar.gz
Locating a download site: http://download.ag-projects.com/MediaProxy
Suggested location to copy and then unzip the tarball: /usr/local
Unzip: tar -xf mediaproxy-2.5.2.tar.gz
Change to the sub-directory created when you unzipped the tarball
I recommend that you build and install the library (standalone in the local directory) using the following command:
./build_inplace
In theory, an alternative approach to building and installing the library (system wide) is possible using the following commands, but I have had problems with this method:
./setup.py build
./setup.py install
And finally…
Make sure iptables is installed, running and correctly configured
Mediaproxy depends on iptables to relay IP packets through your server. Check that it is installed and running.
You can see the list of rules using the following command:
iptables -L -v -n
Note: In CentOS 6 you may well see a default rule preventing packet forwarding. If you leave this rule in place, the mediaproxy relay will start but it will not be able to relay any RTP. You will therefore need to change or delete this rule.
Set ip forwarding with immediate effect
echo “1” > /proc/sys/net/ipv4/ip_forward
Set ip forwarding permanently
Edit the file /etc/sysctl.conf
Change the line “net.ipv4.ip_forward = 0”
to “net.ipv4.ip_forward = 1”
config.ini
Create a config.ini file from the sample template provided (config.ini.sample) and copy it to the appropriate directory. Using the system wide version, put it in /etc/mediaproxy. For standalone build you can also put it in the local directory where media-relay and media-dispatcher are located. If a file exists in both locations, the local one takes precedence
Using and troubleshooting Mediaproxy
When the media-relay program starts, it connects to one or more dispatchers using a TCP socket connection. Such connections can traverse a network which means dispatcher and relay do not have to run on the same server. It also means you should ideally start media-dispatcher before you start media-relay.
As far as I know, media-dispatcher has to run on the same server as OpenSIPS and they always have a 1-to-1 relationship. They connect via a local Unix socket. However, a relay can connect to more than one dispatcher and each dispatcher can accept connections from more than one relay, if needed. This many-to-many relationship is useful in terms of resilience and scalability.
By default, media-dispatcher listens for TCP connections from relays on port 25060. You can use the Linux command “netstat -ltnp” to see a list of listening ports and the name of the associated program. The command “netstat -tnp” will show established connections. Both media-dispatcher and media-relay appear as program name “python”, so the output of “netstat -tnp” on a server with both installed and connected might appear like this:
[root@sip1 log]# netstat -tnp Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 12.34.56.78:25060 12.34.56.78:43708 ESTABLISHED 1584/python tcp 0 0 12.34.56.78:43708 12.34.56.78:25060 ESTABLISHED 1676/python
You can check if dispatcher and relay are running with the following Linux command:
ps ax | grep media-
The output should look somewhat like this:
[root@sip1 mediaproxy]# ps ax | grep media- 1584 ? SL 0:00 python /usr/local/mediaproxy/media-dispatcher 1676 ? SL 0:00 python /usr/local/mediaproxy/media-relay 15059 pts/0 S+ 0:00 grep media-
If you are having problem running the programs, you should check for errors in the file /var/log/messages. Here is what the log looks like when dispatcher starts:
Sep 26 12:39 sip1 media-dispatcher[1584]: Starting MediaProxy Dispatcher 2.5.2 Sep 26 12:39 sip1 media-dispatcher[1584]: using set_wakeup_fd Sep 26 12:39 sip1 media-dispatcher[1584]: Twisted is using epollreactor Sep 26 12:39 sip1 media-dispatcher[1584]: mediaproxy.dispatcher.RelayFactory starting on 25060 Sep 26 12:39 sip1 media-dispatcher[1584]: mediaproxy.dispatcher.OpenSIPSControlFactory starting on "'/var/run/mediaproxy.sock'" Sep 26 12:39 sip1 media-dispatcher[1584]: mediaproxy.dispatcher.ManagementControlFactory starting on 25061
…and here are the log messages for relay when it starts ok:
Sep 26 12:43 sip1 media-relay[1676]: Starting MediaProxy Relay 2.5.2 Sep 26 12:43 sip1 media-relay[1676]: using set_wakeup_fd Sep 26 12:43 sip1 media-relay[1676]: Set resource limit for maximum open file descriptors to 11000
python-gnutls has an invalid url (pypi.python.org/pypi/python-gnutls/1.3.0)
and
yum install libnfnetlink-devel.x86_64
yum install libnetfilter_conntrack-devel.x86_64
did not find the rpms…
Julien,
Thanks, I have fixed that link for python-gnutls
If yum is not finding those libnetfilter and libnfnetlink packages, then it must be that you are using different repositories to mine. I have used yum on a few CentOS 6 servers with no problem – just last week even. Another possible explanation – are you sure that x86_64 matches the architecture for your server? You can download rpm’s and install those instead if yum will not work. Use the advanced search on rpm.pbone.net to search for the right downloads. That is how I suggested they be installed in my earlier article for installation on CentOS 5.
John.