2020년 2월 28일 금요일

apache mod_proxy active standby 설정

OS : Centos 7
webserver : apache2
was : tomcat8

내가 원하는 서버 구성은 아래 그림과 같다.




apache 에서 mod_proxy 설정으로 tomcat server 2개로 연결해서 사용하고 있는데 was1이 active고

was1이 서비스 중단 되었을때 바로  was2로 연결해서 무중단(?) 서비스를 설정하려고 한다.


  • apache module 확인

      # httpd -M | grep proxy
      proxy_module (shared)
      proxy_ajp_module (shared)
      proxy_balancer_module (shared)
      proxy_connect_module (shared)
      proxy_express_module (shared)
      proxy_fcgi_module (shared)
      proxy_fdpass_module (shared)
      proxy_ftp_module (shared)
      proxy_http_module (shared)
      proxy_scgi_module (shared)
      proxy_wstunnel_module (shared)


  • tomcat8/conf/server.xml
      context에 sessionCookieName="test_JSESSIONID" 추가
  • conf.d/vhost.conf

     VirtualHost *:80
       ServerName test.com
       ProxyRequests Off
          
         
             Order deny,allow
             Allow from all
             # Balancer member 1
             BalancerMember http://localhost:8080 loadfactor=1 retry=2
             # Balancer member 2
             BalancerMember http://localhost:9090 status=+H retry=0
       

       ProxyPass / balancer://mycluster/ stickysession=test_JSESSIONID|jsessionid
       ProxyPassReverse /4  http://localhost::8080/
       ProxyPassReverse /4  http://localhost::9090/

       ProxyPreserveHost On
       ProxyStatus On
     VirtualHost

     # systemctl restart httpd

  • 에러 분석
      error_log에 proxy:error Permission denied 에러 발생

      # 분석
      # audit2why < /var/log/audit/audit.log

      # semanage port -l |grep http_port_t
      http_port_t                    tcp      28009, 18009, 80, 81, 443, 488, 8008, 8009, 8443, 9000
      pegasus_http_port_t            tcp      5988

  • 처리
      semanage 에 해당 포트가 없으면 등록을 해줘야 한다.

      # semanage port -a -p tcp -t http_port_t  8080
      # semanage port -a -p tcp -t http_port_t  9090

      이미 등록 되어있다는 에러가 나오면

      # semanage port -m -p tcp -t http_port_t  8080
      # semanage port -m -p tcp -t http_port_t  9090

  • 테스트 
      was1 shutdown  후 test.com 접속 후 was2 접속 로그 확인
      was1 startup 후 test.com 접속 후 was1 접속 로그 확인

  • 참고





2020년 2월 8일 토요일

ubuntu python 설정

python 3.6을 기본으로 사용하기

$ cat /etc/issue.net
Ubuntu 18.04.3 LTS

$ sudo update-alternatives --config python
update-alternatives: error: no alternatives for python

$ ls -lart /usr/bin/python*
-rwxr-xr-x 1 root root    1342 May  2  2016 /usr/bin/python3-jsonpointer
-rwxr-xr-x 1 root root    3661 Oct 29  2017 /usr/bin/python3-jsonpatch
-rwxr-xr-x 1 root root    1018 Oct 29  2017 /usr/bin/python3-jsondiff
-rwxr-xr-x 1 root root     398 Nov 16  2017 /usr/bin/python3-jsonschema
lrwxrwxrwx 1 root root       9 Apr 16  2018 /usr/bin/python2 -> python2.7
lrwxrwxrwx 1 root root      17 Oct 25  2018 /usr/bin/python3m-config -> python3.6m-config
lrwxrwxrwx 1 root root      10 Oct 25  2018 /usr/bin/python3m -> python3.6m
lrwxrwxrwx 1 root root      16 Oct 25  2018 /usr/bin/python3-config -> python3.6-config
lrwxrwxrwx 1 root root       9 Oct 25  2018 /usr/bin/python3 -> python3.6
lrwxrwxrwx 1 root root      34 Oct  7 21:59 /usr/bin/python3.6m-config -> x86_64-linux-gnu-python3.6m-config
-rwxr-xr-x 2 root root 4526456 Oct  7 21:59 /usr/bin/python3.6m
lrwxrwxrwx 1 root root      33 Oct  7 21:59 /usr/bin/python3.6-config -> x86_64-linux-gnu-python3.6-config
-rwxr-xr-x 2 root root 4526456 Oct  7 21:59 /usr/bin/python3.6
-rwxr-xr-x 1 root root 3641704 Oct  8 02:39 /usr/bin/python2.7
lrwxrwxrwx 1 root root      24 Jan 31 00:08 /usr/bin/python -> /etc/alternatives/python

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 1
update-alternatives: using /usr/bin/python3.6 to provide /usr/bin/python (python) in auto mode

$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
update-alternatives: using /usr/bin/python2.7 to provide /usr/bin/python (python) in auto mode

$ sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python2.7   2         auto mode
  1            /usr/bin/python2.7   2         manual mode
  2            /usr/bin/python3.6   1         manual mode

Press to keep the current choice[*], or type selection number: 2

$ python -V
Python 3.6.8


RecalBox 설치

1. RecalBox 다운로드

2. Etcher 다운로드(portable)

4. ResberryPi 구동(전원연결), wifi 설정

5. Mame roms  추가
  • RecalBox ip -> 192.168.0.100인 경우
  • 웹 브라우저 -> http://RecalBox ip 접속
  • Roms/Mame 메뉴에 롬 업로드



6. 조이스틱 설정
  • 가지고 있던 조이스틱이 아무리 해도 설정이 안되는 경우.
  • 가상 게임패드는 http://RecalBox ip:8080


그냥 저냥 할만하다. (조이스틱 사야지..)

2020년 2월 7일 금요일

c# invoke, backgroundworker, socket client sample(돌아가기만 하는 코드)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PiCalendar
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.bgw1.WorkerSupportsCancellation = true;
            this.bgw1.RunWorkerAsync();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (this.bgw1.IsBusy)
            {
                this.bgw1.CancelAsync();
            }
        }

        private void bgw1_DoWork(object sender, DoWorkEventArgs e)
        {
            // Data buffer for incoming data.
            byte[] bytes = new byte[1024];
            string data = null;
            // Connect to a remote device.
            try
            {
                // Establish the remote endpoint for the socket.
                // This example uses port 11000 on the local computer.
                IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
                IPEndPoint remoteEP = new IPEndPoint(ipAddress, 62000);

                // Create a TCP/IP  socket.
                Socket client = new Socket(ipAddress.AddressFamily,
                    SocketType.Stream, ProtocolType.Tcp);

                // Connect the socket to the remote endpoint. Catch any errors.
                try
                {
                    client.Connect(remoteEP);

                    Console.WriteLine("Socket connected to {0}",
                        client.RemoteEndPoint.ToString());

                    // Encode the data string into a byte array.
                    byte[] msg = Encoding.ASCII.GetBytes("hello\r\n");

                    // Send the data through the socket.
                    int bytesSent = client.Send(msg);

                    int cnt = 0;
                    while (true)
                    {
                        if (this.bgw1.CancellationPending)
                        {
                            break;
                        }
                        bytes = new byte[4096];
                        int bytesRec = client.Receive(bytes);
                        data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
                        if (data.IndexOf("\r\n") > -1)
                        {
                            if (data == "quit")
                            {
                                break;
                            }
                            cnt++;
                            if (this.InvokeRequired)
                            {
                                this.richTextBox1.Invoke(new Action(delegate ()
                                {
                                    if (cnt == 50)
                                    {
                                        this.richTextBox1.ResetText();
                                        cnt = 0;
                                    }
                                    this.richTextBox1.AppendText(data);
                                    this.richTextBox1.ScrollToCaret();

                                }));
                            }
                            data = string.Empty;
                        }
                    }

                    // Release the socket.
                    client.Shutdown(SocketShutdown.Both);
                    client.Close();

                }
                catch (ArgumentNullException ane)
                {
                    Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
                }
                catch (SocketException se)
                {
                    Console.WriteLine("SocketException : {0}", se.ToString());
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Unexpected exception : {0}", ex.ToString());
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        private void bgw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Console.WriteLine("bgw1 completed");
        }
    }
}

라즈베리 파이 pihole plex cups

1. 모니터 상하 변경 && wifi
 $ sudo vi /boot/config.txt

 lcd_rotate=2

 # wifi는 그냥 디폴트 사용 - 국가를 바꾸면 접속 안됨.

2.  vim && locale && fonts
 $ sudo apt-get update && sudo apt-get upgrade
 $ sudo apt-get install vim
 # locale 설정 sudo dpkg-reconfigure locales or gui화면에서 설정 폰트 설치
 $ sudo apt-get install fonts-unfonts-core

3. pihole 설치

 # 소스 설치
 $ sudo curl -sSL https://install.pi-hole.net | bash

 # pihole 관리자 페이지 password 변경
 $ sudo pihole -a -p

 # 포트 변경
 $ sudo vi /etc/lighttpd/lighttpd.conf
 # server.port = 80
 server.port = 9090

 여기서 확인하고 설정

 https://godpeople.or.kr/board/3411168

 daum 추가 했더니 동영상 재생이 안되어 삭제

 # windows 공유폴더
 https://webnautes.tistory.com/721

4. plex
 $ echo "deb https://downloads.plex.tv/repo/deb public main" | sudo tee  /etc/apt/sources.list.d/plexmediaserver.list

 $ curl https://downloads.plex.tv/plex-keys/PlexSign.key | sudo apt-key add -

 $ sudo apt-get update && sudo apt-get install plexmediaserver

 # http://respi-ip:32400/ 접속 - plex  가입한 후 로그인 필요.(전에는 안그랬던 거 같은데...)

5. cups - HP Color LaserJet Pro MFP M180n
 $ sudo apt-get install cups

 # 그룹, 권한
 $ sudo usermod -a -G lpadmin pi
 $ sudo cupsctl --remote-any

 # http://respi-ip:631/admin/ 접속

 # admin 접속이 안 될 경우
 $ sudo vi /etc/cups/cupsd.conf
 # Location Allow ip 추가

 # driver는 설치 안해도 됨.(유사한 거 선택) - HP Color LaserJet CM2320N MFP
 # scan test 필요 xsane or sane