Skip to main content

nginx, optimizing performance of upstream

When you use a variety of languages, such as Java, Ruby, etc., you usually use a framework. There are many different frameworks such as Play(Scala), RoR(Ruby), Spring(Java), etc. You can develop a service with these frameworks, and use a nginx as a reverse proxy. Today, we will see a nginx upstream indicator and about performance.

What is nginx upstream?


upstream is an indicator that the servers for which nginx receives the request via proxy_pass. The application servers that implement the business logic are in the back of the nginx, and the nginx deliver a user's request to the application servers.
the service structure of nginx upstream
You can think we can expect a performance degradation, because nginx has steal a user's request, but nginx has many powerful features so it's reasonable to experience a little performace degradation.
For examples, to check user-agent for validation check of clients or check referer header values is very difficult to develop in the application server. But if you use nginx as a proxy, it's very simple to implement such features. It's a reason to use nginx as a reverse proxy.
But it's true that there is a performance degradation. So, how can we reduce performance degradation?

Upstream Keepalive


nginx has a upstream indicator and keepalive indicator in upstream.
Below example is a standard nginx upstream config.

upstream backend {   
     server backend1.example.com:9000
}


If you use this simple config, what is a problem? The internal communication that connects nginx with play also creates session per request and TCP 3-way handshake occur. As you know, TCP 3-way handshake is very expensive.
without upstream keepalive
Let's imagine a client send three requests. nginx receives three requests and directly deliver three requests to application server. The connection with nginx and play web server is TCP communication so each connection have to make TCP 3-way handshake. In this case, all TCP 3-way handshake is occurred 6 times. And the connection with nginx and play web server will be a TIME_WAIT socket. In conclusion there are 3 problems.
First of all, there are many TIME_WAIT sockets in local connections. Second, each local connection needs eash TCP 3-way handshake, and it makes a performance drop. Lastly, it will be local port exhausted each local connection needs local port.
So, you can use keepalive indicator in upstream indicator, and you can avoid these 3 problems.

proxy_http_version 1.1; 
proxy_set_header Connection ""; 

upstream backend {
     server backend1.example.com:9000
     keepalive 100; 
}


Above example is a upstream indicator with keepalive indicator.

How many performance degradation occurred?


How many performance degraded occurred with upstream keepalive? Below test result is a test with ab bench test tool.
test result
As you can see, a best performance is a play web server only. But nginx upstream keepalive enabled is better than nginx upstream no-keepalive.


Conclusion


In this article we look about nginx upstream. If you use nginx as a reverse proxy, don't forget to use upstream keepalive.

Comments

Popular posts from this blog

The difference with tcp_tw_recycle and tcp_tw_reuse

If you ask me the most troublesome kernel parameters are for the system engineers, there are probably tcp_tw_reuse and tcp_tw_recycle . These two kernel parameters are looks very similar and it's hard to know difference of two values exactly. So, in this article we will test about these parameters and find out the difference with tcp_tw_reuse and tcp_tw_recycle. Let's start. Materials First of all, prepare two servers. One is the role of client, and the other is the role of server. And in client we set a value of net.ipv4.ip_local_port_range kernel parameter to  32768 32768 . [root@server ~]# sysctl -w "net.ipv4.ip_local_port_range=32768 32768" net.ipv4.ip_local_port_range = 32768 32768 tcp_tw_reuse First, let's test about tcp_tw_reuse . In client, you enter curl command to server. And soon, you will see the port that used to open to server is changed TIME_WAIT state. If you enter curl command again, you will see below error message. tcp_tw_re...

strace, the magical tool of linux

Today's topic is strace, one of the best debugging tools available on Linux. Let's talk briefly about how to use strace and how to utilize them. So, in fact, it can be used in a lot of areas, so what we're dealing with today is basically nothing. Based on this, I hope you will help sole various problems. How to use strace When you see a man page, you see it as shown below. strace - trace system calls and signals Yes. That's right. strace is a debugging tool used to track the system calls and signals used by the application, and to determine if there is no degradation of the performance, and that there is no error in the error. There are several options, but the options that must be used are as follows -s strsize Specify the maximum string size to print (the default is 32) When tracking via strace, set the maximum value for the string to distribute to the screen or file. If you use this value as a default, you will notice that you can not leave ...