প্রতিক্রিয়া-রাউটার এবং nginx


118

আমি আমার প্রতিক্রিয়া অ্যাপটি ওয়েবপ্যাক-ডেভ-সার্ভার থেকে এনজিনএক্সে স্থানান্তরিত করছি।

আমি যখন "ইউরোপাল হস্ট: ৮০৮০ / লগইন" রুট url এ যাই তখন আমি কেবল একটি 404 পাই এবং আমার এনজিএনএক্স লগে আমি দেখতে পাই যে এটি পাওয়ার চেষ্টা করছে:

my-nginx-container | 2017/05/12 21:07:01 [error] 6#6: *11 open() "/wwwroot/login" failed (2: No such file or directory), client: 172.20.0.1, server: , request: "GET /login HTTP/1.1", host: "localhost:8080"
my-nginx-container | 172.20.0.1 - - [12/May/2017:21:07:01 +0000] "GET /login HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0" "-"

আমি কোথায় ঠিক করব?

প্রতিক্রিয়াতে আমার রাউটার বিটটি দেখতে এমন দেখাচ্ছে:

render(

  <Provider store={store}>
    <MuiThemeProvider>
      <BrowserRouter history={history}>
        <div>
          Hello there p
          <Route path="/login" component={Login} />
          <App>

            <Route path="/albums" component={Albums}/>

            <Photos>
              <Route path="/photos" component={SearchPhotos}/>
            </Photos>
            <div></div>
            <Catalogs>
              <Route path="/catalogs/list" component={CatalogList}/>
              <Route path="/catalogs/new" component={NewCatalog}/>
              <Route path="/catalogs/:id/photos/" component={CatalogPhotos}/>
              <Route path="/catalogs/:id/photos/:photoId/card" component={PhotoCard}/>
            </Catalogs>
          </App>
        </div>
      </BrowserRouter>
    </MuiThemeProvider>
  </Provider>, app);

এবং আমার nginx ফাইল এর মত:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 8080;
        root /wwwroot;

        location / {
            root /wwwroot;
            index index.html;

            try_files $uri $uri/ /wwwroot/index.html;
        }


    }
}

সম্পাদনা:

আমি জানি যে বেশিরভাগ সেটআপ কাজ করে কারণ আমি যখন লোকালহোস্টে যাই: 8080 লগইন না করে আমি লগইন পৃষ্ঠাটিও পাই। এটি লোকালহোস্টে পুনর্নির্দেশের মাধ্যমে নয়: 8080 / লগইন - এটি কিছু প্রতিক্রিয়া কোড।


4
প্যারামিটারগুলি try_filesইউআরআই হওয়া উচিত এবং পথের নাম নয়। চেষ্টা করুন:try_files $uri $uri/ /index.html;
রিচার্ড স্মিথ

@ রিচার্ডস্মিথ ওকে ... আমি এটিকে সূচি html ফাইলের পথের নাম হিসাবে দেখেছি। আপনার পরামর্শ অনুসারে আমি এটি পরিবর্তন করার চেষ্টা করেছি - তবে একই ফলাফল পাচ্ছি। ## / wwwroot / login "ব্যর্থ হয়েছে (2: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই) ## আপনার কাছে অন্য পরামর্শ আছে কি? আমি এতে টোনাইটে ডুব দেব ...
মার্টিন

@ মার্টিন আপনি কি এখনও এটি সমাধান করতে সক্ষম হয়েছেন? আমরা একই জিনিসটি দেখতে পাচ্ছি, তবে ইতিমধ্যে সেখানে চেষ্টা_ফায়াল লাইন ছিল।
বিলি ফার্গুসন

উত্তর:


261

আপনার nginx কনফিগারেশনে অবস্থান ব্লকটি হওয়া উচিত:

location / {
  try_files $uri /index.html;
}

সমস্যাটি হ'ল সূচি.ইচটিএমএল ফাইলের কাজ করার অনুরোধ, তবে আপনি বর্তমানে এনজিঙ্ককে বলছেন না অন্যান্য অনুরোধগুলিও সূচি.চ.টি.এম.এল ফাইলটিতে ফরোয়ার্ড করতে।


8
(অনুপস্থিত .js, সিএসএস ফাইল, ইত্যাদি জন্য ক্যাশে, 404) আরো উন্নত কনফিগারেশনের জন্য এটি ব্যবহার করে দেখুন gkedge.gitbooks.io/react-router-in-the-real/content/nginx.html
Gianfranco পি

দেখে মনে হচ্ছে রিএ্যাক্ট রাউটারের দ্বারা সার্ভারে মোটামুটি রাউন্ড ট্রিপ করা উচিত নয় ... এটি কি স্থানীয়ভাবে স্থির থাকতে পারে?
স্কটি এইচ

4
যদি এনজিএনএক্স অনুরোধটিকে সূচিপত্র html ফাইলে সরিয়ে না দেয়, তবে প্রতিক্রিয়া রাউটারের জেএস কখনও অনুরোধ সম্পর্কে সচেতন হবে না। এই উত্তরটি সমস্ত অনুরোধকে প্রতিক্রিয়াতে পাঠায়, প্রতিক্রিয়া রাউটারকে সমস্ত অনুরোধগুলি পরিচালনা করতে দেয়।
টবি

প্যাকেজ.জসনে ডিফল্ট হোমপেজ সেটিংস ব্যবহার করাও গুরুত্বপূর্ণ, যা সার্ভার রুট ব্যবহার করে। আমি এটি '।' তে সেট করে রেখেছিলাম (আপেক্ষিক পাথ ব্যবহার করুন), কিন্তু তারপরে এনজিনেক্স /custompath/static/main.js পরিবেশন করার চেষ্টা করেছিল যা স্পষ্টতই ব্যর্থ হবে, একটি অ-কার্যকারী সাইট দেবে।
বোয়ারে

4
কেবল একটি মাথা আপ করুন, আপনার কনফিগারটি আসলে লোড হচ্ছে কিনা তা নিশ্চিত করুন, খনিটি ডিফল্টর সাথে বিরোধযুক্ত ছিল এবং কেবল এড়িয়ে চলেছে। দীর্ঘশ্বাস
4c74356b41

18

এখানে আমার সমাধান

সহজ চেষ্টা:

location / {
    root /var/www/mysite;
    try_files $uri /index.html;
}

আর এইচটিএমএল প্রকারের জন্য আর চেষ্টা করছেন না:

location / {
    root /var/www/mysite;
    set $fallback_file /index.html;
    if ($http_accept !~ text/html) {
        set $fallback_file /null;
    }
    try_files $uri $fallback_file;
}

আর এইচটিএমএল প্রকার এবং ডিরেক্টরি (এবং এবং / অথবা এর try_filesসাথে সামঞ্জস্যপূর্ণ ) তৈরি করার জন্য আর চেষ্টা করছেন না :indexautoindex

location / {
    root /var/www/mysite;
    index index.html;
    autoindex on;
    set $fallback_file /index.html;
    if ($http_accept !~ text/html) {
        set $fallback_file /null;
    }
    if ($uri ~ /$) {
        set $fallback_file /null;
    }
    try_files $uri $fallback_file;
}

10

হয়তো ঠিক এই ক্ষেত্রে এখানে কিন্তু একটি চলমান কেউ জন্য নয় dockerতাদের জন্য ধারক reactসঙ্গে প্রকল্পের react-routerএবং webpack-dev-server, আমার ক্ষেত্রে আমি সবকিছু আমি আমার প্রয়োজন ছিল nginx.conf:

server {
    listen 80;
    location / {
      root   /usr/share/nginx/html;
      index  index.html index.htm;
      try_files $uri $uri/ /index.html;
    } 
    error_page 404 /index.html;
    location = / {
      root /usr/share/nginx/html;
      internal;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
      root   /usr/share/nginx/html;
    }
  }

তবে তবুও এনজিন্স 404 এরোকে মূলে প্রেরণ করবে না /। ধারকটি খতিয়ে দেখার পরে আমি লক্ষ্য করেছি যে এমন কিছু কনফিগার রয়েছে /etc/nginx/conf.d/default.confযাতে এতে আমার কনফিগারেশনগুলিকে কোনওভাবে ওভাররাইড করা যায়, সুতরাং dockerfileসমস্যাটি সমাধানের মধ্যে সেই ফাইলটি মুছে ফেলা :

...
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf  # <= This line solved my issue
COPY nginx.conf /etc/nginx/conf.d
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

4
তুমি আমার দিন বাঁচিয়েছ!
বিলাল হুসেন

4

লাইভ সার্ভারে আমার জন্য কাজ করা সমাধানটি এখানে:

আমি এই টিউটোরিয়ালটি স্রেফ অনুসরণ করেছি এবং বেসিক এনগিনেক্স কনফিগারেশন সহ কেবলমাত্র অবস্থান ব্লকটি কনফিগার করেছি।

location / {
    try_files $uri $uri/ /index.html;
}

0

আমি কোনও মূল নির্দেশিকা যোগ না করা পর্যন্ত আমার পক্ষে কিছুই কাজ করেনি। এটি আমার পক্ষে একটি / এপিআই / ওয়েবসারভার শেষ পয়েন্ট হিট করার জন্য একটি বিপরীত প্রক্সি ব্যবহার করে কাজ করে।

location / {
    root   /usr/share/nginx/html;
    try_files $uri /index.html;
}

0

এখানে কিছু পদক্ষেপ রয়েছে যা আমি গ্রহণ করেছি এটি যদি আপনি শুরু করে থাকেন তবে সহায়তা করতে পারে

  1. এসএসএইচে একবার /ব্যবহার করে রুটে ফিরে যেতে হবে cd ..তবে আপনার উচিত/
  2. তারপরে /etc/nginx/sites-available/{yoursitename or default}নেভিগেট করতে সাধারণত সিডিতে অবস্থিত .conf ফাইলটি সন্ধান করুন
  3. এই ফাইলটি ব্যবহার করে সম্পাদনা করুন nanoবা vimআমি ভিমটি এর মতো ব্যবহার করেছিvi {your site.conf}
  4. এখানে কাজ করা উচিত পুরো ফাইলের বিষয়বস্তু
server {
        listen       80;
        server_name www.yourDomainName.com, yourDomainName.com;
        location / {
            root   /usr/share/nginx/{location of the build of your react project};
            index  index.html index.htm;
            
            try_files $uri $uri/ /index.html;

            passenger_enabled on;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

0

এনগিনেক্স মূলের মধ্যে সূচক। Html সন্ধান করার চেষ্টা করবে, আপনি যদি অন্য কোনও অবস্থান ব্যবহার করেন তবে এটি চেষ্টা করার চেষ্টা করতে পারেন ফাইলের নির্দেশে:

এর পরিবর্তে:

location /MyLocation {
    root /var/www/html;
    try_files $uri /index.html;
}

আপনাকে যা করতে হবে:

location /MyLocation {
    root /var/www/html;
    try_files $uri /MyLocation/index.html; # Make sure to add the folder to the path
}

মাই লোকেশনকে ট্রাই_ফাইলে যুক্ত করে আপনি এনজিএনএক্সগুলি সঠিক সূচকগুলি ব্যবহার করেন t


0

আমি একই সমস্যাটি মোকাবিলা করছিলাম এবং আমি ভেবেছিলাম এটি একটি কনফার্ম ত্রুটি তবে না। আমি কনফিড ফাইলটি /etc/nginx/conf.d/ফোল্ডারে অনুলিপি করছিলাম । এটি ডিভে কিন্তু বিল্ড সংস্করণে কাজ করে যা সমস্যার সৃষ্টি করে। যখন রুটটি ব্যর্থ হয় তখন এনগিনেক্স সূচকে পড়ে না।

কেবল ডান ফোল্ডারে কনফ ফাইলটি অনুলিপি করুন: /etc/nginx/conf.d/default.conf

দকফেরাইল নির্দেশের উদাহরণ: COPY .docker/prod/nginx.conf /etc/nginx/conf.d/default.conf

আশা করি এটা সাহায্য করবে.


0

0

আমি জানি এই প্রশ্নের মৃত্যুর জবাব দেওয়া হয়েছে, তবে আপনি যেখানে প্রকট পাস দিয়ে আপনার ব্রাউজার রাউটারটি ব্যবহার করতে চান সেখানে সমস্যার সমাধান হয় না, যেখানে আপনি রুট ব্যবহার করতে পারবেন না।

আমার জন্য সমাধানটি বেশ সহজ।

বলুন আপনার কাছে একটি ইউআরএল রয়েছে যা কিছু বন্দরের দিকে নির্দেশ করছে।

location / {
  proxy_pass http://127.0.0.1:30002/;
  proxy_set_header    Host            $host;
  port_in_redirect    off;
}

এবং এখন ব্রাউজারের কারণে সাব পাথগুলি ভেঙে গেছে। তবে আপনি জানেন যে সাব পাথগুলি কী।

এর সমাধান কি? সাব পাথ / যোগাযোগের জন্য

# just copy paste.
location /contact/ {
  proxy_pass http://127.0.0.1:30002/;
  proxy_set_header    Host            $host;
}

আমি আর কিছুই চেষ্টা করেছি কাজগুলি না, তবে এই সাধারণ ফিক্সটি জঘন্য কবিতার মতো কাজ করে।


-1
location / {
    root /path/to/root/directory/of/staticfiles;
    index index.html;
    try_files $uri /index.html;
}

কোড-কেবল উত্তরগুলি স্ট্যাক ওভারফ্লোতে নিরুৎসাহিত করা হয়েছে কারণ তারা সমস্যাটি কীভাবে সমাধান করে তা ব্যাখ্যা করে না। এই কোডটি কী করে এবং কীভাবে এটি বিদ্যমান upvated উত্তরে উন্নতি করে তা ব্যাখ্যা করার জন্য দয়া করে আপনার উত্তরটি সম্পাদনা করুন, যাতে এটি ওপি এবং সেই সাথে একই জাতীয় সমস্যাযুক্ত অন্যান্য ব্যবহারকারীদের পক্ষে কার্যকর হয়।
ফ্লফিকিটেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.