markdown 如何使用nginx代理网络应用程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 如何使用nginx代理网络应用程序?相关的知识,希望对你有一定的参考价值。

# Virtual Hosts on nginx (CSC309)

When hosting our web applications, we often have one public IP
address (_i.e.,_ an IP address visible to the outside world)
using which we want to host multiple web apps. For example, one
may wants to host three different web apps respectively for
`example1.com`, `example2.com`, and `example1.com/images` on
the same machine using a single IP address.

**How can we do that?** Well, the good news is Internet browsers
send the domain name inside HTTP requests and all we need to do
is to parse the requested domain name and URL and then route the
HTTP request to the actual web server.

**Oh, do I really need to parse HTTP requests?** You can if you 
really want to, but there are lots of tools and technologies that
readily do this for you. In this tutorial, we walk you through
how you can use nginx to _proxy_ multiple web applications.

## Install nginx

### CDF @UofT
We have prepared pre-copmiled binaries for your. 
You need to download [nginx.tar.gz](http://www.cs.toronto.edu/~soheil/csc309/nginx.tar.gz)
and uncompress it:
```sh
$ wget http://www.cs.toronto.edu/~soheil/csc309/nginx.tar.gz && tar -xvzf nginx.tar.gz
```

- It creates an nginx directory for you. The config file
  is in `nginx/conf/nginx.conf`.
- We have provided a script named `nginx` in the directory.
  To run `nginx`, go to the `nginx` directory (`cd nginx`) and
  run `./nginx ...`.

### Ubuntu
Install `nginx` using `apt-get`:
```sh
$ sudo apt-get install nginx
```
**Notes:**

- The part of the `nginx`'s config file we need resides in `/etc/nginx/sites-enabled/default`.
- To edit the config file or run `nginx`, you need to use `sudo`. 

### Mac OS 
Install [`homebrew`](http://brew.sh), and then install `nginx` using `brew`:
```sh
$ brew install nginx
```
**Notes:**

- `nginx`'s config file is in `/usr/local/etc/nginx/nginx.conf`.
- To edit the config file or run `nginx`, you need to use `sudo`:
  `sudo nano /usr/local/etc/nginx/nginx.conf` and
  `sudo nginx ...`

## Configuration

### Step 1 -- Booting Servers for Virtual Hosts
Write three different node applications running on different ports
(say 8080, 8181, 8282) on your machine.

### Step 2 -- Configure nginx's Port
To do so, you need to edit your `nginx` config file.

In the config file, find the `server` section:
```
server {
    listen       80;
    ...
    location / {
       ...
    }
    ...
}
```

**If you're using CDF**, make sure you change `80` to a vacant port number
(ask for one from your instructor). If not, you can keep using `80` or
change the port if you will.

**Test nginx**

1. Run `./nginx` on CDF, or run `sudo nginx` on your local machine.
2. Open the browser and log on to `localhost:$PORT` (replace `$PORT` with
   the port number you configured for `nginx`).

### Step 3 -- Configure /
Let say we want to configure `nginx` to route requests for
`/`, `/blog`, and `/mail`, respectively onto
`localhost:8080`, `localhost:8181`, and `localhost:8282`.

```
                  +--- host --------> node.js on localhost:8080
                  |
users --> nginx --|--- host/blog ---> node.js on localhost:8181
                  |
                  +--- host/mail ---> node.js on localhost:8282
```

To route `/`, you need to edit your `nginx` config file.

In the config file, find the `server` section:
```
server {
    listen       80;
    ...
    location / {
       ...
    }
    ...
}
```

This section is simply telling `nginx` how it should serve HTTP requests. 

Now, change the location section to this snippet:

```
server {
    listen       ...;
    ...
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
    ...
}
```

`proxy_pass` simply tells `nginx` to forward requests to `/` to the
server listening on `http://127.0.0.1:8080`.

### Step 4 -- Reload nginx's Configuration

To reload `nginx`'s configuration run: 
`nginx -s reload` on your machine.

Referesh your browser. _Do you see the output from your `node.js` application?_
If yes, you are all set. If no, there is a problem with your config.

### Step 5 -- Add /blog and /mail

To redirect `/mail` and `/blog`, you simply need to add new entries
the location section in the config file:

```
server {
    listen       ...;
    ...
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
    
    location /blog {
        proxy_pass http://127.0.0.1:8181;
    }

    location /mail {
        proxy_pass http://127.0.0.1:8282;
    }
    ...
}
```

### Step 6 -- Reload Your nginx Configuration
Run `nginx -s reload` on your machine.

Log onto `localhost:$PORT/blog` in your browser.
_Do you see the output from your second `node.js` application?_

Then log onto `localhost:$PORT/mail`.
_Do you see the output from your third `node.js` application?_

If yes & yes, you are all set. If no, there is a problem with your config.

### Step 7 -- Rewriting Requests
Now as you might have noticed in Step 6, nginx sends the same
HTTP request to your `node.js` web apps which results into a 404 error.
Why? Because, your `node.js` web application serves requests from `/`
not from `/blog` and `/mail`. But, `nginx` is sending requests to `/blog` and
`/mail`.

To fix this issue, we need rewrite the URL so that it matches the URL
you can serve on your `node.js` applications.

To correctly rewrite URLs change your config file to match the following snippet:

```
server {
    listen       ...;
    ...
    location / {
        proxy_pass http://127.0.0.1:8080;
    }
    
    location /blog {
        rewrite ^/blog(.*) /$1 break;
        proxy_pass http://127.0.0.1:8181;
    }

    location /mail {
        rewrite ^/mail(.*) /$1 break;
        proxy_pass http://127.0.0.1:8282;
    }
    ...
}
```

This rewrite commands are simple regular expressions that transform 
strings like `/blogWHAT_EVER` and `/mailWHAT_EVER` to `/WHAT_EVER`
in the HTTP requests.

### Step 8 -- Reload and Test.
All set?

### Exercise 1
Configure your nginx to redirect URLs from `/google` to `http://www.google.com`


### Step 9 (optional) -- Redirecting Based on Host Name
Let say you want to host `example1.com`, `example2.com`, and `example3.com` 
on your machine, respectively to `localhost:8080`, `localhost:8181`, and
`localhost:8282`.

**Note:** Since you don't have access to a DNS server, you should
add domain name entries to your `/etc/hosts` (you can't do this on CDF machines):

```
...
127.0.0.1 example1.com example2.com example3.com
...
```

To proxy `eaxmple1.com` we can't use the location part of the default server.
Instead we need to add another server section with a `server_name` set 
to our virtual host (e.g., `example1.com`, ...), and then a simple location
section that tells `nginx` how to proxy the requests:

```
server {
    listen       80;
    server_name  example1.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

server {
    listen       80;
    server_name  example2.com;

    location / {
        proxy_pass http://127.0.0.1:8181;
    }
}

server {
    listen       80;
    server_name  example3.com;

    location / {
        proxy_pass http://127.0.0.1:8282;
    }
}

```

Simple, ha?!


以上是关于markdown 如何使用nginx代理网络应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

markdown 如何使用nginx代理网络应用程序?

markdown 如何使用nginx代理网络应用程序?

markdown 如何使用nginx代理网络应用程序?

markdown 正向代理和反向代理的区别[proxy,nginx]

markdown nginx代理

markdown Docker多容器和反向代理nginx