{"id":521,"date":"2016-01-25T11:58:04","date_gmt":"2016-01-25T09:58:04","guid":{"rendered":"http:\/\/www.systemcodegeeks.com\/?p=521"},"modified":"2017-12-04T15:03:49","modified_gmt":"2017-12-04T13:03:49","slug":"nginx-and-apache","status":"publish","type":"post","link":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/","title":{"rendered":"Nginx and Apache (Ubuntu 12.04 LTS)"},"content":{"rendered":"<p><em>This article is part of our Academy Course titled <a href=\"http:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/introduction-to-nginx-complete-tutorial\/\">Introduction to Nginx<\/a>.<\/p>\n<p>This course will introduce you to the magic of nginx. You will learn to install and configure nginx for a variety of software platforms and how to integrate it with Apache. Additionally, you will get involved with more advanced concepts like Load Balancing, SSL configuration and Websockets proxying. Check it out <a href=\"http:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/introduction-to-nginx-complete-tutorial\/\">here<\/a>!<\/em><br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n[ulp id=&#8217;O5wwlXQPIiCQp2ED&#8217;]<\/p>\n<div class=\"toc\">\n<h4>Table Of Contents<\/h4>\n<dl>\n<dt><a href=\"#introduction\">1. Introduction<\/a><\/dt>\n<dt><a href=\"#reverseproxy\">2. Nginx as reverse proxy<\/a><\/dt>\n<dt><a href=\"#proxymodule\">3. Nginx proxy module<\/a><\/dt>\n<dt><a href=\"#variables\">4. A note on variables<\/a><\/dt>\n<dt><a href=\"#apache\">5. Configuring Apache<\/a><\/dt>\n<dt><a href=\"#nginx\">6. Configuring Nginx<\/a><\/dt>\n<dt><a href=\"#separate\">7. Separating content<\/a><\/dt>\n<dt><a href=\"#download\">8. Download the configuration files<\/a><\/dt>\n<\/dl>\n<\/div>\n<h2><a name=\"introduction\"><\/a>1. Introduction<\/h2>\n<p>Nginx and Apache can certainly work together, not necessarily replacing each other as our web server of choice. This solution offers many advantages and solves the issues that most system administrators are familiar with, such as slowdowns and complex configurations. You can just take a look at the Apache configuration file and chances are you\u2019ll probably agree with me!<\/p>\n<h2><a name=\"reverseproxy\"><\/a>2. Nginx as reverse proxy<\/h2>\n<p>A reverse proxy is a device or service placed between a client and a server in a network infrastructure. Incoming requests are handled by the proxy, which interacts on behalf of the client with the desired server or service residing on the server1. In this case, Nginx will act as reverse proxy between the client (your computer, for example) and Apache, the backend web server (see Fig. 1).<\/p>\n<figure id=\"attachment_2969\" aria-describedby=\"caption-attachment-2969\" style=\"width: 1094px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx_reverse_proxy.png\"><img decoding=\"async\" class=\" size-full wp-image-2969\" alt=\"nginx_reverse_proxy.png\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx_reverse_proxy.png\" width=\"1094\" height=\"305\" \/><\/a><figcaption id=\"caption-attachment-2969\" class=\"wp-caption-text\">Figure 1: Nginx acting as reverse proxy<\/figcaption><\/figure>\n<p>In this above diagram, Nginx acts as reverse proxy (or in other words, as frontend server) and receives all requests from the outside world. At this point those requests can be filtered or \u201cdelivered\u201d to Apache (acting as HTTP client) in the backend. These two services can even be hosted in the same physical server with the caution to use different listening ports for each of them. This whole operation is handled by the proxy module of Nginx.<\/p>\n<p>The main purpose of setting up Nginx as a frontend server and giving Apache a simple backend role is to improve the serving speed, given the fact that great amount of requests coming from clients are for static files (html pages, cascading style sheets, regular images, and so on), and static files are served much faster by Nginx. The overall performance sharply improves both on the client side and server side.<\/p>\n<h2><a name=\"proxymodule\"><\/a>3. Nginx proxy module<\/h2>\n<p>Fortunately, the proxy module is enabled by default during the installation of Nginx. The main directives of the module can be seen in Table 1.<\/p>\n<div class=\"wp-caption aligncenter\">\n<table border=\"2\">\n<tbody>\n<tr>\n<td><strong>Directive\/Context<\/strong><\/td>\n<td><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_buffers<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/td>\n<td>The request is sent to the backend server by specifying its location.<br \/>\nSyntax:<br \/>\nTCP sockets: <code>proxy_pass<\/code> http:\/\/hostname:port;<br \/>\nUNIX domain sockets: <code>proxy_pass<\/code> http:\/\/unix:\/path\/to\/file.socket;<br \/>\n(https can be used instead of http for secure traffic)<br \/>\nExamples:<br \/>\n<code>proxy_pass<\/code> http:\/\/localhost:8080;<br \/>\n<code>proxy_pass<\/code> http:\/\/127.0.0.1:8080;<br \/>\n<code>proxy_pass<\/code> http:\/\/unix:\/tmp\/nginx.sock;<\/td>\n<\/tr>\n<tr>\n<td><code><code>proxy_method<\/code><\/code><\/td>\n<td>Allows overriding the HTTP method of the request to be forwarded to the backend server.<br \/>\nSyntax: <code>proxy_method method<\/code>;<br \/>\nExample: <code>proxy_method POST;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code><code>proxy_hide_header<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/code><\/td>\n<td>By default, as Nginx prepares the response received from the backend server to be forwarded back to the client, it ignores some of the http headers4. With this directive, you can specify an additional header line to be hidden from the client. This directive can be inserted multiple times with one header name for each.<br \/>\nSyntax: <code>proxy_hide_header header_name;<\/code><br \/>\nExample: <code>proxy_hide_header Cache-Control;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code><code>proxy_pass_header<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/code><\/td>\n<td>Forces some of the ignored headers to be passed on to the client.<br \/>\nSyntax: <code>proxy_pass_header header_name;<\/code><br \/>\nExample: <code>proxy_pass_header Date;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_pass_request_body<\/code><br \/>\n<code>proxy_pass_request_headers<\/code><br \/>\nContext: <code>http, server, location<\/code><\/td>\n<td>Defines whether or not, respectively, the request body and extra request headers should be passed on to the backend server.<br \/>\nSyntax: <code>on<\/code> or <code>off<\/code>;<\/td>\n<\/tr>\n<tr>\n<td><code>proxy_redirect<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/td>\n<td>Allows you to rewrite the URL appearing in the Location HTTP header on redirections triggered by the backend server.<br \/>\nSyntax: <code>off<\/code>, <code>default<\/code>, or the <code>URL<\/code> of your choice<br \/>\n<code>off<\/code>: Redirections are forwarded as it is.<br \/>\n<code>default<\/code>: The value of the <code>proxy_pass<\/code> directive is used as the hostname and the current path of the document is appended.<br \/>\nNote that the <code>proxy_redirect<\/code> directive must be inserted after the <code>proxy_pass<\/code> directive as the configuration is parsed sequentially.<br \/>\n<code>URL<\/code>: Replace a part of the URL by another.<br \/>\nAdditionally, you may use variables in the rewritten URL.<br \/>\nExamples:<br \/>\n<code>proxy_redirect off;<\/code><br \/>\n<code>proxy_redirect default;<\/code><br \/>\n<code>proxy_redirect<\/code> http:\/\/localhost:8080\/ http:\/\/mysite.com\/;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"wp-caption-text\">Table 1: Main directives of the proxy module<\/p>\n<\/div>\n<p>The best scenario is to limit to the extent possible the number of requests that are forwarded to the backend server. To that end, the proxy module comes with a group of directives that will help us build a caching system as well as control buffering options and the way Nginx deals with temporary files (see Table 2 for more information on most of these directives).<\/p>\n<div class=\"wp-caption aligncenter\">\n<table border=\"2\">\n<tbody>\n<tr>\n<td><strong>Directive\/Context<\/strong><\/td>\n<td><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_pass<\/code><br \/>\nContext: <code>location, if<\/code><\/td>\n<td>Sets the amount and size of buffers that will be used for reading the response data from the backend server. If the buffers aren\u2019t large enough the data will be saved to disk before being served to the user.<br \/>\nSyntax: <code>proxy_buffers amount size;<\/code><br \/>\nDefault: 8 buffers, 4k or 8k each depending on platform<br \/>\nExample: <code>proxy_buffers 8 4k;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_method<\/code><\/td>\n<td>Sets the size of the buffer for reading the beginning of the response from the backend server, which usually contains simple header data.<br \/>\nSyntax: Numeric value (size)<br \/>\nExample:<br \/>\n<code>proxy_buffer_size 4k;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_cache_key<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/td>\n<td>This directive defines the cache key, in other words, it differentiates one cache entry from another.<br \/>\nSyntax: <code>proxy_cache_key key;<\/code><br \/>\nExample: <code>proxy_cache_key \"$scheme$host$request_<br \/>\nuri $cookie_user\";<\/code><br \/>\nNote: strings beginning with \u201c$\u201d (dollar sign) are variables. The proxy module offers 4 built-in variables; others can be created at the user\u2019s will.<\/td>\n<\/tr>\n<tr>\n<td><code>proxy_cache<\/code><br \/>\nContext:<code> http, server,<br \/>\nlocation<\/code><\/td>\n<td>Defines a shared memory zone used for caching. The same zone can be used in several places. The off parameter disables caching inherited from the previous configuration level.<br \/>\nSyntax:<br \/>\n<code>proxy_cache zone | off;<\/code><br \/>\nDefault:<br \/>\n<code>proxy_cache off;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_cache_path<\/code><br \/>\nContext: <code>http<\/code><\/td>\n<td>Sets the path and other parameters of a cache. Cache data are stored in files. Both the key and file name in a cache are a result of applying the MD5 function to the proxied URL. The levels parameter defines hierarchy levels of a cache.<br \/>\nSyntax: <code>proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time];<\/code><br \/>\n[Optional parameters are indicated inside square brackets]<br \/>\nExample: <code>proxy_cache_path \/tmp\/nginx_cache<br \/>\nlevels=1:2 zone=zone1:10m inactive=10m max_<br \/>\nsize=200M;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_cache_min_uses<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/td>\n<td>Defines the minimum amount of hits before a request is eligible for caching. By default, the response of a request is cached after one hit (next requests with the same cache key will receive the cached response).<br \/>\nSyntax: Numeric value<br \/>\nExample: <code>proxy_cache_min_uses 1;<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"wp-caption-text\">Table 2: Some caching \/ buffering directives<\/p>\n<\/div>\n<p>There are even more directives that let you define the behavior of Nginx in the case of timeouts or other limitations regarding communications with the backend server (see Table 3):<\/p>\n<div class=\"wp-caption aligncenter\">\n<table border=\"2\">\n<tbody>\n<tr>\n<td><strong>Directive\/Context<\/strong><\/td>\n<td><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_connect_timeout<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/td>\n<td>Defines the backend server connection timeout. This is different from the read\/send timeout. If Nginx is already connected to the backend server, the proxy_connect_ timeout is not applicable. It should be noted that this timeout cannot usually exceed 75 seconds.<br \/>\nSyntax: Time value (in seconds)<br \/>\nExample: <code>proxy_connect_timeout 15;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_read_timeout<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/td>\n<td>Defines a timeout for reading a response from the proxied server. A timeout is set only between two successive read operations, not for the transmission of the whole response. If a proxied server does not transmit anything within this time, a connection is closed.<br \/>\nSyntax: Time value (in seconds)<br \/>\nDefault value: 60<br \/>\nExample: <code>proxy_read_timeout 60;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_send_timeout<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/td>\n<td>This timeout is for sending data to the backend server. The timeout isn&#8217;t applied to the entire response delay but between two write operations instead.<br \/>\nSyntax: Time value (in seconds)<br \/>\nDefault value: 60<br \/>\nExample: <code>proxy_send_timeout 60;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>proxy_ignore_client_abort<\/code><br \/>\nContext: <code>http, server,<br \/>\nlocation<\/code><\/td>\n<td>Determines whether the connection with a proxied server should be closed when a client closes a connection without waiting for a response. If set to on, Nginx will continue processing the proxy request, even if the client aborts its request. In the other case (off), when the client aborts its request, Nginx also aborts its request to the backend server.<br \/>\nDefault value: <code>off<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"wp-caption-text\">Table 3: Some directives regarding communications with the backend server (Apache)<\/p>\n<\/div>\n<h2><a name=\"variables\"><\/a>4. A note on variables<\/h2>\n<p>The proxy module comes with the following variables that can be used as arguments for the directives listed above:<\/p>\n<ul>\n<li><code>$proxy_host:<\/code> the hostname of the backend server.<\/li>\n<li><code>$proxy_port:<\/code> the port of the backend server.<\/li>\n<li><code>$proxy_add_x_forwarded_for:<\/code> Contains client request-header &#8220;X-Forwarded-For&#8221; with separated by comma $remote_addr. If there is no X-Forwarded-For request-header, than $proxy_add_x_forwarded_for is equal to $remote_addr.<\/li>\n<li><code>$proxy_internal_body_length:<\/code> Length of the request body (set with the <code>proxy_set_body<\/code> directive or 0).<\/li>\n<\/ul>\n<h2><a name=\"apache\"><\/a>5. Configuring Apache<\/h2>\n<p>By default, web servers are configured to listen on tcp port 80. So the first thing that we need to do is to change the settings of Apache in order to avoid conflicts with Nginx (which will be running as the frontend server).<\/p>\n<p>In Ubuntu 12.04, the main configuration file for Apache is located in <code>\/etc\/apache2<\/code> under the name <code>ports.conf <\/code>(see Fig. 2).<\/p>\n<figure id=\"attachment_2970\" aria-describedby=\"caption-attachment-2970\" style=\"width: 721px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/002_1.png\"><img decoding=\"async\" class=\" wp-image-2970\" alt=\"002_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/002_1.png\" width=\"721\" height=\"358\" \/><\/a><figcaption id=\"caption-attachment-2970\" class=\"wp-caption-text\">Figure 2: The Apache configuration files<\/figcaption><\/figure>\n<p style=\"text-align: center;\">\n<p>There are 3 main elements that need to be replaced in our Apache configuration (see Fig. 3a and 3b):<\/p>\n<p>1) The Listen directive must be changed to a port other than 80, such as 8080.<br \/>\n2) The following configuration directive is present in the main configuration file:<\/p>\n<p><code>NameVirtualHost A.B.C.D:8080<\/code><\/p>\n<p>where A.B.C.D is the IP address of the main network interface on which server communications (between the frontend and the backend servers) go through. In this case, we use the loopback interface and its IP address since both Apache and Nginx are installed in the same physical server. If you do not host Apache on the same server, you will need to specify the IP address of the network interface that can communicate with the server hosting Nginx.<br \/>\n3) The port that was just selected must be reported in all our virtual hosts configuration sections (in<code> \/etc\/apache2\/sites-available\/default<\/code>).<\/p>\n<figure id=\"attachment_2971\" aria-describedby=\"caption-attachment-2971\" style=\"width: 562px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/003a_1.png\"><img decoding=\"async\" class=\" size-full wp-image-2971\" alt=\"003a_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/003a_1.png\" width=\"562\" height=\"85\" \/><\/a><figcaption id=\"caption-attachment-2971\" class=\"wp-caption-text\">Figure 3a<\/figcaption><\/figure>\n<p style=\"text-align: center;\">\n<figure id=\"attachment_2972\" aria-describedby=\"caption-attachment-2972\" style=\"width: 712px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/003b_1.png\"><img decoding=\"async\" class=\" size-full wp-image-2972\" alt=\"003b_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/003b_1.png\" width=\"712\" height=\"279\" \/><\/a><figcaption id=\"caption-attachment-2972\" class=\"wp-caption-text\">Figure 3b<\/figcaption><\/figure>\n<p>After restarting Apache, we can open a web browser and confirm that it is listening on port 8080 (see Fig. 4):<\/p>\n<figure id=\"attachment_2973\" aria-describedby=\"caption-attachment-2973\" style=\"width: 852px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/004_11.png\"><img decoding=\"async\" class=\" size-full wp-image-2973\" alt=\"004_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/004_11.png\" width=\"852\" height=\"329\" \/><\/a><figcaption id=\"caption-attachment-2973\" class=\"wp-caption-text\">Figure 4: Apache is listening on port 8080<\/figcaption><\/figure>\n<p>As a extra security measure, we can tell Apache to only serve requests coming from the frontend server. This can be performed in 2 ways: 1) system wide or by 2) establishing per-virtual-host restrictions.<\/p>\n<p>1) As discussed earlier, the Listen directive of Apache lets you specify a port, but also an IP address. However, by default, no IP address is selected which results in communications coming from all interfaces. All you have to do is replace the <code>Listen *:8080<\/code> directive by <code>Listen 127.0.0.1:8080<\/code>, Apache should then only listen on the local IP address.<br \/>\n2) Using the allow and deny Apache directives we can define which IP addresses will be able to access each virtual host.<br \/>\nOnce the changes are made, Apache must be restarted (or its configuration reloaded) in order to reflect the changes that we have just made.<\/p>\n<h2><a name=\"nginx\"><\/a>6. Configuring Nginx<\/h2>\n<p>The first directive that we will use in the process of enabling proxy options is proxy_pass. Since it can\u2019t be used at the http or server level, we will include it in every single place that we want to be forwarded. As a preliminary example, we will have all requests made to the restricted folder be forwarded to the Apache web directory (\/var\/www). See Figs. 5a and 5b, 6a and 6b:<\/p>\n<figure id=\"attachment_2974\" aria-describedby=\"caption-attachment-2974\" style=\"width: 832px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/005a_1.png\"><img decoding=\"async\" class=\" size-full wp-image-2974\" alt=\"005a_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/005a_1.png\" width=\"832\" height=\"358\" \/><\/a><figcaption id=\"caption-attachment-2974\" class=\"wp-caption-text\">Figure 5a: The restricted folder shows a simple notice (BEFORE)<\/figcaption><\/figure>\n<figure id=\"attachment_2975\" aria-describedby=\"caption-attachment-2975\" style=\"width: 923px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/005b_11.png\"><img decoding=\"async\" class=\" size-full wp-image-2975\" alt=\"005b_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/005b_11.png\" width=\"923\" height=\"359\" \/><\/a><figcaption id=\"caption-attachment-2975\" class=\"wp-caption-text\">Figure 5b: Nginx main configuration file (BEFORE)<\/figcaption><\/figure>\n<figure style=\"width: 807px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/006a_1.png\"><img decoding=\"async\" class=\"bordered-lesson-image aligncenter size-full wp-image-2976\" alt=\"006a_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/006a_1.png\" width=\"807\" height=\"368\" \/><\/a><figcaption class=\"wp-caption-text\">Figure 6a: A request to view the restricted directory shows a Not Found message since there is no such page in Apache\u2019s root directory<\/figcaption><\/figure>\n<figure id=\"attachment_2977\" aria-describedby=\"caption-attachment-2977\" style=\"width: 929px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/006b_1.png\"><img decoding=\"async\" class=\" size-full wp-image-2977\" alt=\"006b_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/006b_1.png\" width=\"929\" height=\"324\" \/><\/a><figcaption id=\"caption-attachment-2977\" class=\"wp-caption-text\">Figure 6b: Nginx main configuration file (AFTER)<\/figcaption><\/figure>\n<p style=\"text-align: center;\">\n<h2><a name=\"separate\"><\/a>7. Separating content<\/h2>\n<p>In order to take better advantage of this Nginx-Apache setting, we can separate the content that each one will deliver upon request.<\/p>\n<p>Apache will serve dynamic files, that is, files that require some sort of processing before being sent to the client, such as php files, Python scripts, and so on.<br \/>\nNginx will serve static files \u2013 all other content that does not require additional processing (html pages, cascading style sheets, images, media, and so on).<\/p>\n<p>To do this, add the following blocks in the nginx.conf file (see Fig. 7):<\/p>\n<figure id=\"attachment_2978\" aria-describedby=\"caption-attachment-2978\" style=\"width: 801px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/007_11.png\"><img decoding=\"async\" class=\"  wp-image-2978\" alt=\"007_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/007_11.png\" width=\"801\" height=\"329\" \/><\/a><figcaption id=\"caption-attachment-2978\" class=\"wp-caption-text\">Figure 7: Separating content served by the frontend and backend servers<\/figcaption><\/figure>\n<p>When we restart Nginx, we may run into the following issue (see Fig. 8):<\/p>\n<figure id=\"attachment_2979\" aria-describedby=\"caption-attachment-2979\" style=\"width: 1094px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/008_11.png\"><img decoding=\"async\" class=\" size-full wp-image-2979\" alt=\"008_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/008_11.png\" width=\"1094\" height=\"177\" \/><\/a><figcaption id=\"caption-attachment-2979\" class=\"wp-caption-text\">Figure 8: Missing library<\/figcaption><\/figure>\n<p style=\"text-align: center;\">\n<p>We will go ahead and install the PCRE library that is available in the <code>libpcre3-dev<\/code> package (refer to <a href=\"http:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-installation-on-linux\/\">tutorial 1: Nginx installation on Linux<\/a>). See Fig. 9 for details on this package. Once installed, we will have to recompile Nginx.<\/p>\n<figure id=\"attachment_2980\" aria-describedby=\"caption-attachment-2980\" style=\"width: 924px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/009_11.png\"><img decoding=\"async\" class=\" size-full wp-image-2980\" alt=\"009_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/009_11.png\" width=\"924\" height=\"447\" \/><\/a><figcaption id=\"caption-attachment-2980\" class=\"wp-caption-text\">Figure 9: The PCRE library comes with the libpcre3-dev package<\/figcaption><\/figure>\n<p>Let\u2019s create a sample php file in <code>\/var\/www <\/code>(see Fig. 10):<\/p>\n<figure id=\"attachment_2981\" aria-describedby=\"caption-attachment-2981\" style=\"width: 521px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/010_11.png\"><img decoding=\"async\" class=\"size-full wp-image-2981\" alt=\"010_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/010_11.png\" width=\"521\" height=\"138\" \/><\/a><figcaption id=\"caption-attachment-2981\" class=\"wp-caption-text\">Figure 10: Sample php file<\/figcaption><\/figure>\n<p style=\"text-align: center;\">\n<p>Now we will point our web browser to <code>http:\/\/localhost\/test.php<\/code>. Please note that localhost per se points to the frontend server, so when it receives a request for a php file, it will forward the request to Apache (see Fig. 11)<\/p>\n<figure id=\"attachment_2982\" aria-describedby=\"caption-attachment-2982\" style=\"width: 1094px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/011_11.png\"><img decoding=\"async\" class=\" size-full wp-image-2982\" alt=\"011_1\" src=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/011_11.png\" width=\"1094\" height=\"630\" \/><\/a><figcaption id=\"caption-attachment-2982\" class=\"wp-caption-text\">Figure 11: Request for php files are forwarded to the backend server<\/figcaption><\/figure>\n<p style=\"text-align: center;\">\n<h2><a name=\"download\"><\/a>8. Download the configuration files<\/h2>\n<p>Here you can download the configuration files used in this tutorial: <a href=\"http:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/Part-3-Config-files.zip\">Config_files.zip<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article is part of our Academy Course titled Introduction to Nginx. This course will introduce you to the magic of nginx. You will learn to install and configure nginx for a variety of software platforms and how to integrate it with Apache. Additionally, you will get involved with more advanced concepts like Load Balancing, &hellip;<\/p>\n","protected":false},"author":15,"featured_media":195,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[25],"tags":[],"class_list":["post-521","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-nginx"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Nginx and Apache (Ubuntu 12.04 LTS) - System Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"This article is part of our Academy Course titled Introduction to Nginx. This course will introduce you to the magic of nginx. You will learn to install\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nginx and Apache (Ubuntu 12.04 LTS) - System Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"This article is part of our Academy Course titled Introduction to Nginx. This course will introduce you to the magic of nginx. You will learn to install\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/\" \/>\n<meta property=\"og:site_name\" content=\"System Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/systemcodegeeks\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/gacanepa\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-25T09:58:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-12-04T13:03:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Gabriel Canepa\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@gacanepa\" \/>\n<meta name=\"twitter:site\" content=\"@systemcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gabriel Canepa\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/\"},\"author\":{\"name\":\"Gabriel Canepa\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/967da353d0f1a1de21c9504942625a5f\"},\"headline\":\"Nginx and Apache (Ubuntu 12.04 LTS)\",\"datePublished\":\"2016-01-25T09:58:04+00:00\",\"dateModified\":\"2017-12-04T13:03:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/\"},\"wordCount\":2145,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg\",\"articleSection\":[\"NGINX\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/\",\"url\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/\",\"name\":\"Nginx and Apache (Ubuntu 12.04 LTS) - System Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg\",\"datePublished\":\"2016-01-25T09:58:04+00:00\",\"dateModified\":\"2017-12-04T13:03:49+00:00\",\"description\":\"This article is part of our Academy Course titled Introduction to Nginx. This course will introduce you to the magic of nginx. You will learn to install\",\"breadcrumb\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#primaryimage\",\"url\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg\",\"contentUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.systemcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Web Servers\",\"item\":\"https:\/\/www.systemcodegeeks.com\/category\/web-servers\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"NGINX\",\"item\":\"https:\/\/www.systemcodegeeks.com\/category\/web-servers\/nginx\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Nginx and Apache (Ubuntu 12.04 LTS)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#website\",\"url\":\"https:\/\/www.systemcodegeeks.com\/\",\"name\":\"System Code Geeks\",\"description\":\"Operating System Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.systemcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.systemcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/systemcodegeeks\",\"https:\/\/x.com\/systemcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/967da353d0f1a1de21c9504942625a5f\",\"name\":\"Gabriel Canepa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/27b3ea2a3fb1de4ed1c8694a1465c099a86586d8b833a0d852a26d76d750df9f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/27b3ea2a3fb1de4ed1c8694a1465c099a86586d8b833a0d852a26d76d750df9f?s=96&d=mm&r=g\",\"caption\":\"Gabriel Canepa\"},\"description\":\"Gabriel Canepa is a Linux Foundation Certified System Administrator (LFCS-1500-0576-0100) and web developer from Villa Mercedes, San Luis, Argentina. He works for a worldwide leading consumer product company and takes great pleasure in using FOSS tools to increase productivity in all areas of his daily work. When he's not typing commands or writing code or articles, he enjoys telling bedtime stories with his wife to his two little daughters and playing with them, the great pleasure of his life.\",\"sameAs\":[\"http:\/\/www.gabrielcanepa.com.ar\/\",\"https:\/\/www.facebook.com\/gacanepa\",\"https:\/\/ar.linkedin.com\/in\/gacanepa\",\"https:\/\/x.com\/gacanepa\"],\"url\":\"https:\/\/www.systemcodegeeks.com\/author\/gabriel-canepa\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Nginx and Apache (Ubuntu 12.04 LTS) - System Code Geeks - 2026","description":"This article is part of our Academy Course titled Introduction to Nginx. This course will introduce you to the magic of nginx. You will learn to install","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/","og_locale":"en_US","og_type":"article","og_title":"Nginx and Apache (Ubuntu 12.04 LTS) - System Code Geeks - 2026","og_description":"This article is part of our Academy Course titled Introduction to Nginx. This course will introduce you to the magic of nginx. You will learn to install","og_url":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/","og_site_name":"System Code Geeks","article_publisher":"https:\/\/www.facebook.com\/systemcodegeeks","article_author":"https:\/\/www.facebook.com\/gacanepa","article_published_time":"2016-01-25T09:58:04+00:00","article_modified_time":"2017-12-04T13:03:49+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg","type":"image\/jpeg"}],"author":"Gabriel Canepa","twitter_card":"summary_large_image","twitter_creator":"@gacanepa","twitter_site":"@systemcodegeeks","twitter_misc":{"Written by":"Gabriel Canepa","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#article","isPartOf":{"@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/"},"author":{"name":"Gabriel Canepa","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/967da353d0f1a1de21c9504942625a5f"},"headline":"Nginx and Apache (Ubuntu 12.04 LTS)","datePublished":"2016-01-25T09:58:04+00:00","dateModified":"2017-12-04T13:03:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/"},"wordCount":2145,"commentCount":0,"publisher":{"@id":"https:\/\/www.systemcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg","articleSection":["NGINX"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/","url":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/","name":"Nginx and Apache (Ubuntu 12.04 LTS) - System Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.systemcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#primaryimage"},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#primaryimage"},"thumbnailUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg","datePublished":"2016-01-25T09:58:04+00:00","dateModified":"2017-12-04T13:03:49+00:00","description":"This article is part of our Academy Course titled Introduction to Nginx. This course will introduce you to the magic of nginx. You will learn to install","breadcrumb":{"@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#primaryimage","url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg","contentUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2016\/01\/nginx-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.systemcodegeeks.com\/web-servers\/nginx\/nginx-and-apache\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.systemcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Web Servers","item":"https:\/\/www.systemcodegeeks.com\/category\/web-servers\/"},{"@type":"ListItem","position":3,"name":"NGINX","item":"https:\/\/www.systemcodegeeks.com\/category\/web-servers\/nginx\/"},{"@type":"ListItem","position":4,"name":"Nginx and Apache (Ubuntu 12.04 LTS)"}]},{"@type":"WebSite","@id":"https:\/\/www.systemcodegeeks.com\/#website","url":"https:\/\/www.systemcodegeeks.com\/","name":"System Code Geeks","description":"Operating System Developers Resource Center","publisher":{"@id":"https:\/\/www.systemcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.systemcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.systemcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.systemcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.systemcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/systemcodegeeks","https:\/\/x.com\/systemcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/967da353d0f1a1de21c9504942625a5f","name":"Gabriel Canepa","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.systemcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/27b3ea2a3fb1de4ed1c8694a1465c099a86586d8b833a0d852a26d76d750df9f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/27b3ea2a3fb1de4ed1c8694a1465c099a86586d8b833a0d852a26d76d750df9f?s=96&d=mm&r=g","caption":"Gabriel Canepa"},"description":"Gabriel Canepa is a Linux Foundation Certified System Administrator (LFCS-1500-0576-0100) and web developer from Villa Mercedes, San Luis, Argentina. He works for a worldwide leading consumer product company and takes great pleasure in using FOSS tools to increase productivity in all areas of his daily work. When he's not typing commands or writing code or articles, he enjoys telling bedtime stories with his wife to his two little daughters and playing with them, the great pleasure of his life.","sameAs":["http:\/\/www.gabrielcanepa.com.ar\/","https:\/\/www.facebook.com\/gacanepa","https:\/\/ar.linkedin.com\/in\/gacanepa","https:\/\/x.com\/gacanepa"],"url":"https:\/\/www.systemcodegeeks.com\/author\/gabriel-canepa\/"}]}},"_links":{"self":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts\/521","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/comments?post=521"}],"version-history":[{"count":0,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/posts\/521\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/media\/195"}],"wp:attachment":[{"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/media?parent=521"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/categories?post=521"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.systemcodegeeks.com\/wp-json\/wp\/v2\/tags?post=521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}