Mac在docker裏使用laravel的swoole擴展laravels的注意事項

前言:使用swoole的websocket,需要額外使用端口(默認5200),在docker內安裝swoole後,宿主機(MAC電腦)需要訪問websocket,socket功能時,需要docker暴露端口(5200),但是我們的容器已經在執行,如果能在不影響本身容器環境的情況下,對外暴露端口呢,如果是安裝了docker-compose,那麼有對應的配置文件可以改動(請大家自行百度)。筆者並沒有安裝,網上資料太少,筆者自己研究完,分享一下心得

一、將容器打包成鏡像,執行docker commit

這一步主要是保存容器內的所有環境。

docker commit 容器名 鏡像名
例子:docker commit store-dev ldb/store:3.0
成功後,會返回類似信息:
sha256:ca46b1ed99abc1338881a55a043ee9670a66601530b3f2e63f41eb949b91e84d

二、新建容器

docker run --name 容器名 -itd -p 對外端口/容器內端口 -v 本地項目路由:容器內項目路由 --link ldb.mysql:mysql --link ldb.redis:redis 鏡像repository:鏡像tag
例子:docker run --name store-dev -itd -p 80:80 -p 9501:9501 -v ~/Code/store:/data/web/store --link ldb.mysql:mysql --link ldb.redis:redis ldb/store:3.0

三、nginx域名配置文件

  • 獲取容器配置:docker inspect 容器名 .在獲取到配置後,IPAddress即爲IP地址。
  • nginx配置爲:
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
upstream laravels {
    # 筆者的websocket是172.17.0.4:9501
    server 第一步獲取ip地址:5200 weight=5 max_fails=3 fail_timeout=30s;
    # By UnixSocket Stream file
    #server unix:/xxxpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s;
    #server 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s;
    #server 192.168.1.2:5200 backup;
}
server {
    listen 80;
    server_name laravels.oo;
    root /var/www/laravels/public;
    # access_log /var/log/$server_name.access.log  main;
    autoindex off;
    index index.html index.htm;
    # Nginx handles the static resources(recommend enabling gzip), LaravelS handles the dynamic resource.
    location / {
        try_files $uri @laravels;
    }
    # Response 404 directly when request the PHP file, to avoid exposing public/*.php
    #location ~* \.php$ {
    #    return 404;
    #}
    # Http and WebSocket are concomitant, Nginx identifies them by "location"
    # Javascript: var ws = new WebSocket("ws://laravels.com/ws");
    location =/ws {
        proxy_http_version 1.1;
        # proxy_connect_timeout 60s;
        # proxy_send_timeout 60s;
        # proxy_read_timeout: Nginx will close the connection if the proxied server does not send data to Nginx in 60 seconds; At the same time, this close behavior is also affected by heartbeat setting of Swoole.
        # proxy_read_timeout 60s;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header Server-Protocol $server_protocol;
        proxy_set_header Server-Name $server_name;
        proxy_set_header Server-Addr $server_addr;
        proxy_set_header Server-Port $server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_pass http://laravels;
    }
    location @laravels {
        proxy_http_version 1.1;
        # proxy_connect_timeout 60s;
        # proxy_send_timeout 60s;
        # proxy_read_timeout 60s;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-PORT $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header Server-Protocol $server_protocol;
        proxy_set_header Server-Name $server_name;
        proxy_set_header Server-Addr $server_addr;
        proxy_set_header Server-Port $server_port;
        proxy_pass http://laravels;
    }
}
  •  不要忘記將LARAVELS_LISTEN_IPon配置修改爲0.0.0.0
  • .env 文件配置參數: REDIS_HOST=redis:6379

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章