1. 程式人生 > >建立一個Nginx伺服器

建立一個Nginx伺服器

轉自:https://www.cnblogs.com/roverliang/p/8431206.html

Docker 使用入門,建立一個Nginx伺服器

執行環境: MAC

Docker 版本: Docker version 17.12.0-ce, build c97c6d6

一、啟動Nginx 伺服器

啟動Nginx 伺服器,並進入模擬終端

docker run -p 8080:80 --name nginx_web -it  nginx /bin/bash

二、瞭解Nginx 映象的配置檔案位置

日誌檔案位置:/var/log/nginx
配置檔案位置: /etc/nginx
資源存放的位置: /usr/share/nginx/html



上面的配置路徑是我電腦上的虛擬linux中地址,請各位讀者,也自己去看下自己的配置位置

三、修改Nginx 的預設首頁,測試是否可以執行

重要提示: 對於不想折騰的同學,可以直接從第四步來執行

/usr/share/nginx/html

echo "<h1>Hello Docker</h1>" > index.html



到這裡有的朋友,可能會發現,我訪問localhost:8080 埠,第一次出現了Nginx 的歡迎介面,而第二次就出現了404 提示。

關於這個問題,本文不展開詳序,如果不明白的,可以參考:

  1. docker執行nginx為什麼要使用 daemon off
  2. docker容器執行後退出,怎麼才能一直執行?
  3. Docker run 命令的使用方法

Docker 執行 docker run 之後,先在當前作業系統的基礎上,虛擬化了一個精簡版的linux(僅僅包含系統執行的最精簡功能),然後載入我們的Nginx映象。當Nginx映象載入到我們的虛擬Linux環境中時,相當於在系統裡執行了一個指令碼,而這個指令碼就是Nginx。

由於預設的Nginx 是不作為守護程序執行的。所以當Docker內監聽到80埠的請求後,完成之後,就退出了Nginx的程序。該容器內只有一個程序,並且是非守護的,執行完請求程序就銷燬了。那麼這個容器也就沒有存在的必要了,所以Docker 中這個服務也就停掉了。這也就是我們執行 docker top

 看不到當前執行的容器的原因。

作為暫時解決Nginx 只執行一次就退出的問題,我們可以進入互動式終端,執行 nginx & 讓nginx 作為守護程序後臺執行。

 

檢視我們正在執行的容器

roverliang$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

如果什麼內容都沒有,說明當前沒有正在執行的容器。

檢視已經執行結束的容器

roverliang$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                  NAMES
5bff285f60b3        nginx               "/bin/bash"              9 minutes ago       Exited (0) 6 minutes ago                           nginx_web

 

重新啟動我們剛剛啟動過的容器

docker start nginx_web

 

進入到我們的容器內部

docker attach nginx_web

echo "<h1>Hello Docker</h1>" > /usr/share/nginx/html/index.html

nginx & 

然後 使用快捷鍵 control + Q 退出當前的容器

之後我們在瀏覽器再次訪問:http://localhost:8080/



折騰了這麼久,終於看到我們期望的的內容了。



Hello Docker

四、將前面Nginx Demo 變成一個可以玩的 Demo

先建立我們本機需要對映的資料夾

 mkdir -p  docker_study/log  docker_study/etc docker_study/html

注意: 在自己的家目錄建立

 

複製我們docker中nginx 的配置檔案

docker cp 65bc23f952db:/etc/nginx/ /Users/roverliang/docker_study/etc/

 

關閉掉我們的容器

docker stop nginx_web

 

刪除掉我們的練習的demo,我們重新來構建一個可以用的。

docker rm nginx_web

 

 

將Nginx 映象和我們本機的目錄進行對映,方便我們修改檔案

docker run \
-p 8080:80 \
--name nginx_web \
-v /Users/roverliang/docker_study/log/:/var/log/nginx \
-v /Users/roverliang/docker_study/etc/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/roverliang/docker_study/html/:/usr/share/nginx/html \
-it \
-d \
nginx \
/bin/bash \

執行到這裡,我們可能還是會發現訪問http://localhost:8080/ 沒有內容。但是不要急,解決問題的過程,就是學習新東西的過程,繼續網上查資料,參考如下:

Docker執行nginx

摘抄文中讓我豁然開朗的一段:

我之前執行的時候,一般都採用互動式:
-i 保證容器的stdin開啟-t 為容器生成一個tty終端,在命令的最後加一個/bin/bash來保證可以互動。但是實際上,nginx並沒有執行,導致我以為容器的埠繫結不是持久化的。

接下來我們需要關掉,並刪除我們的容器,再按照如下的命令重啟一個:

docker run \
-p 8080:80 \
--name nginx_web \
-v /Users/roverliang/docker_study/log/:/var/log/nginx \
-v /Users/roverliang/docker_study/etc/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/roverliang/docker_study/html/:/usr/share/nginx/html \
-d \
nginx 

五、修改Nginx 配置,解析一個網站

修改我們剛剛複製過來的nginx 配置

cd /Users/roverliang/docker_study/etc
vim nginx.conf

worker_processes  4; #nginx 程序數,建議按照cpu 數目來指定,一般為它的倍數 (如,2個四核的cpu計為8)。
worker_cpu_affinity 00000001 00000010 00000100 00001000;
worker_rlimit_nofile 99999;
error_log  error.log;

events {  #模組處理網路事件
	use epoll;
    worker_connections  99999; #每個程序允許的最多連線數, 理論上每臺nginx 伺服器的最大連線數為worker_processes*worker_connections。  #ulimit -n 檢視
}

http{
    server_tokens off;
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
		
	upstream linuxidc{
	 		 server  47.90.240.1:8081 weight=3;
      		 server  47.90.240.1:8081 weight=2;
			}

    server {
        listen       80;
		server_name  47.90.240.115:80;
		access_log  logs/ebookingtour.log;
        location / {
            proxy_pass http://linuxidc;
			proxy_redirect off; 
			proxy_intercept_errors on;
			proxy_set_header Host $host;  
			proxy_set_header X-Real-IP $remote_addr;  
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
			client_max_body_size 100M;
			proxy_connect_timeout 300s;
			proxy_read_timeout 300s;
			proxy_send_timeout 300s;
			#proxy_buffer_size 64k;
			#proxy_buffers 4 32k;
			#proxy_busy_buffers_size 256k;
			#proxy_temp_file_write_size 512k;
			#proxy_ignore_client_abort on;
			#proxy_redirect default;
			}
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html 
        #    root   html;
        }
	
	upstream wxswx{
	     server  192.168.168.104:8080;
		 server  192.168.168.104:8080;
	}		
		
}